Aventurando-se com Python
Terceira Aula

Estruturas de Repetição:
while

Loops

Muitas vezes precisamos executar um trecho de código várias vezes. Isso se chama loop (repetição). Cada repetição é chamada de iteração. No Python temos o while e for, para isso.
'''
O while recebe uma expressão booleana e avalia o valor dessa expressão.
Se a expressão retorna True, ele executa os comandos que estão dentro
do while. Ao término da execução desse comandos, ou seja, ao término
da iteração, a expressão é novamente avaliada e se continua retornando
True, os comandos são executados novamente. Quando a expressão começar
a retornar False, o while não será mais executado.
'''
x = 1
tabuada = int(input("Digite um número para calcularmos a sua tabuada: "))
while x < 11:
valor = tabuada * x
print(str(tabuada) + ' x ' + str(x) + ' = ' + str(valor))
x += 1Break

'''
Podemos precisar parar o loop, caso algo aconteça durante a iteração.
Podemos usar o break, que interrompe o fluxo atual da iteração
e sai do while.
'''
while True:
numero = input("Digite um inteiro para calcularmos o seu quadrado " +
"[digite q para saí]: ")
if numero == 'q':
break
quadrado = int(numero) * int(numero)
print("O quadrado de " + numero + " é: " + str(quadrado))
Continue

'''
Parecido com o break, mas ele somente para a iteração atual e retorna
para o while verificar a expressão e executar a próxima iteração
'''
while True:
numero = input("Digite um inteiro para calcularmos o seu quadrado " +
"[digite q para saí]: ")
if numero == 'q':
break
if int(numero) % 2 == 0: # Número par? Só calcularei o quadrado de ímpares
continue
quadrado = int(numero) * int(numero)
print("O quadrado de " + numero + " é: " + str(quadrado))
Se lembra do Else?

'''
Caso, um while termine sem o uso de um break,
podemos usar o else pra executar um código alternativo
No exemplo, verificamos se em uma lista, existe um número par.
'''
numeros = [1, 3, 7, 19]
posicao = 0
while posicao < len(numeros):
numero = numeros[posicao]
if int(numero) % 2 == 0: # Número par?
print("Encontramos um número par!")
break
posicao += 1
else:
print("Não há números pares na lista")Estruturas de Repetição:
for

For

'''
O while é legal. Mas muitas vezes, queremos acessar itens de uma coleção.
Podemos fazer isso com o while. Ficaria algo assim:
'''
planetas = ['Marte', 'Terra', 'Júpiter', 'Vênus']
posicao = 0
while posicao < len(planetas):
print(planetas[posicao])
posicao += 1
'''
Precisei criar uma variável auxiliar, descobrir o lenght da lista,
incrementar o valor da variável auxiliar e verificar se ele não ultrapassou
o length da lista. Usando o for, fica melhor.
'''
for planeta in planetas:
print(planeta)Iterables

'''
Listas são iterables. Iterables são estruturas que permitem que percorra
ela toda de elemento a elemento, um por um. String, Sets, Tuplas e
Dicionários são iterables.
O for é feito justamente para usar com iterables. Então, posso fazer isso.
'''
palavra = "Uma palavra"
for letra in palavra:
print(letra)
# U
# m
# a
#
# p
# a
# l
# a
# v
# r
# aBreak, Continue e Else

'''
O significado do break, continue e else são os mesmo quando usados no
while
'''
compras = []
for produto in compras:
print('A compra foi feita')
break
else:
print('Parece que alguém esqueceu de fazer as compras de novo!')Iterando sobre múltiplos Iterables

'''
Você acredita que eu posso iterar sobre mais de uma lista ao mesmo tempo?
Eu posso a função zip() para isso.
'''
dias = ["Domingo", "Segunda", "Terça", "Quarta"]
programas = ["Faustão", "CQC", "Jó"]
horarios = ["22:00", "00:00", "02:00"]
for dia, programa, horario in zip(dias, programas, horarios):
print("No(a) " + dia + " eu sempre assisto ao " +
programa + " e vou dormir às " + horario)
# No(a) Domingo eu sempre assisto ao Faustão e vou dormir às 22:00
# No(a) Segunda eu sempre assisto ao CQC e vou dormir às 00:00
# No(a) Terça eu sempre assisto ao Jó e vou dormir às 02:00
'''
O zip para de retornar itens quando acaba a menor coleção.
Veja que ainda tinha a quarta na lista de dias.
'''Range

Range

'''
Se lembram dos Iterables? Lista, Strings e etc...
Pois bem, eu posso precisar criar Iterables, em uma determinada sequência numérica.
Para isso, posso usar a função range(inicio, fim, pulo). Ela me retorna um Iterable.
Então posso usá-los no nosso for.
'''
# Me retorna uma sequencia de 0 a 9.
for numero in range(0, 10):
print numero
# O único parâmetro obrigatório é o fim.
for numero in range(10): # O inicio por padrão é 0
print numero
# O passo por padrão é 1. Eu posso alterar assim
for numero in range(0, 10, 2): # Nesse caso, precisa declarara o inicio também
print numero
# Fazendo em ordem decrescente
for numero in range(10, -1, -1): # Nesse caso, precisa declarara o passo -1 também
print numero
Comprehensions

Comprehensions

'''
O Comprehension é a maneira pythonica de criar estruturas de dados a
partir de Iterables. Uma Estrutura de Dados é um conjunto de dados:
Listas, Tuplas. Eu posso criar essas estruturas sem o Comprehension.
Mas a sintaxe dos Comprehensions é bem mais enxuta e elegante.
Criando uma lista de números ao quadrado sem o comprehension:
'''
numeros = [2, 3, 4]
# 1°
numeros_quadrados = []
numeros_quadrados.append(numeros[0] ** 2)
numeros_quadrados.append(numeros[1] ** 2)
numeros_quadrados.append(numeros[2] ** 2)
# 2°
numeros_quadrados = []
posicao = 0
while posicao < len(numeros):
numeros_quadrados.append(numeros[i] ** 2)
posicao += 1
# 3°
numeros_quadrados = []
for i in numeros:
numeros_quadrados.append(i ** 2)
# Com Comprehension
numeros_quadrados = [numero ** 2 for numero in numeros]Usando condicionais

'''
Para criar a minha nova estrutura, eu posso restringir os itens da antiga
estrutura a determinadas condições usando os condicionais do Python.
Se aprovados às condições, o itens farão parte da nova estrutura.
Por exemplo, para fazer uma lista com todos os números ímpares
de outra lita.
'''
lista_original = [2, 1, 42, 5, 63, 73, 9, 34]
# Sem comprehensions
numeros_impares = []
for i in lista_original:
if i % 2:
numeros_impares.append(i)
# Com Comprehensions
numeros_impares = [numero for numero in lista_original if numero % 2]Tuplas

Tuplas

'''
Uma tupla é uma lista imutável. Ela não pode ser modificada após
ser criada.
'''
# Criando
fisicos = ('Newton', 'Kepler', 'Galileu', 'Einstein')
# Acessando
fisicos[1] # Kepler
fisicos[-1] # Einstein
fisicos[1:3] # Kepler, Einstein
# Tamanho
len(fisicos)
# Tuplas são imutáveis. Elas não podem ser alteradas.
# Tuplas não tem append(), extend(), insert(), remove(), and pop().
# Dica:
(a, b, c) = "ABC" # Uma tupla de variáveis.
a # A
b # B
c # C
# Multi-atribuição
(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)Sets

Sets

'''
Sets são conjuntos não ordenados. Lembram-se de conjuntos matemáticos?
Em conjuntos, não podem existir elementos repetidos.
'''
# Criando...
planetas = {'Marte', 'Terra', 'Júpiter', 'Vênus'}
outros_planetas = set(['Saturno', 'Mercúrio'])
set_vazio = set()
# Adicionando...
planetas.add('Python') # A posição de inserção é aleatória
planetas.add('Terra') # Terra já existe, então nada acontece
planetas.update({1, 2, 5}) # update() recebe um iterable.
planetas.update([1, 2, 3], ('Meu Deus', 2, 4)) # Pode receber quantos quiser
# Removendo...
planetas.discard('Terra') # Remove Terra
planetas.discard('Terra') # Terra não está mais, nada acontece
planetas.remove('Marte') # Remove Marte
planetas.remove('Marte') # Marte não está mais, lança erro.
planetas.pop() # Remove um elemento qualquer, um aleatório
planetas.clear() # Remove tudo
# Procurando...
'Terra' in planetas # False
Sets são conjuntos, então...

'''
Nós podemos aplicar operações comuns da teoria dos conjuntos
numéricos aos sets do Python.
'''
# Criando...
planetas = {'Marte', 'Terra', 'Júpiter', 'Vênus', 'Saturno', 'Urano'}
outros_planetas = {'Saturno', 'Mercúrio', 'Python', 'Terra', 'Netuno', 'Vênus'}
# Soma de Conjuntos
planetas.union(outros_planetas)
# Diferença de Conjuntos
planetas.difference(outros_planetas)
# Interseção de Conjuntos
planetas.intersection(outros_planetas)
# Diferença Simétrica de Conjuntos
planetas.symmetric_difference(outros_planetas)Dicionários

Dicionários

'''
Sets são conjuntos não ordenados de pares chave/valor.
Um par chave/valor é quando uma chave representa a maneira de identificar
um valor. Eu posso acessar qualquer valor, apenas informando a sua chave.
'''
# Criando...
domingo = {'programa': 'Faustão', 'horario': '22:00'}
segunda = {'programa': 'Jô', 'horario': '02:00'}
# Acessando...
domingo['programa'] # Faustão
# Adicionando...
domingo['esporte'] = 'Futebol'
# Alterando...
domingo['programa'] = 'Gugu'
# Excluindo...
del domingo['programa']
# Tamanho...
len(domingo) # 2
# Chaves podem ser inteiros
segunda[23] = 'Qualquer coisa'
# Valores podem ser qualquer coisa praticamente
rotina = {
'domingo': {'programa': 'Faustão', 'horario': '22:00', 'esporte': 0},
'segunda': {'programa': 'Jô', 'horario': '02:00', 'tarefas': ('Dormir', 'Descansar', 'Cochilar', 'Dormir')}
}Curso de Python - 3° Aula (PyLadies Fortaleza)
By Wilmerson da Silva
Curso de Python - 3° Aula (PyLadies Fortaleza)
- 802