** Company Confidential **. 2 3 Selecionando as bases de dados a serem pesquisadas.
Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas...
Transcript of Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas...
Programação IAula 12 — Mais sobre cadeias e listas
Pedro Vasconcelos
DCC/FCUP
2018
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 1 / 28
Nesta aula
1 Listas em compreensão
2 Formatação de texto
3 Mais métodos sobre cadeias
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 2 / 28
Listas em compreensão
É muito comum construir uma lista partindo de uma outra:selecionando elementos usando uma condição;aplicando uma transformação a cada elemento.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 3 / 28
Exemplo: calcular quadrados
Construir a lista dos quadrados dos números inteiros de 1 a 9.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 4 / 28
Exemplo: calcular quadrados (cont.)
Solução usando um ciclo for:
lista = []for x in range(1, 10):
lista.append(x**2)print(lista)
Solução usando uma lista em compreensão:
lista = [x**2 for x in range(1,10)]print(lista)
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 5 / 28
Sintaxe
[x**2 for x in range(1,10)]
Notação inspirada na teoria de conjuntos:
{x2 : x ∈ {1, . . . ,9}}
Mais geralmente:
[expressão for variável in sequência]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 6 / 28
Mais exemplos
>>> [i**2 for i in [2,3,5,7]][4, 9, 25, 49]
>>> [1+x/2 for x in [0, 1, 2]][1.0, 1.5, 2.0]
>>> [ord(c) for c in "ABCDEF"][65, 66, 67, 68, 69, 70]
>>> [len(s) for s in"As armas e os barões assinalados".split()]
[2, 5, 1, 2, 6, 11]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 7 / 28
Listas em compreensão com condições
Exemplo: quadrados dos múltiplos de 3 inferiores a 10.
[x**2 for x in range(10) if x%3==0]
Mais geralmente:
[expr for variável in sequência if condição]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 8 / 28
Outro exemplo
Um número natural n é primo se não tem divisores próprios (i.e.maiores do que 1 e menores do que n).
Para testar se n é primo podemos testar se a lista dos divisorespróprios é vazia.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 9 / 28
Testar primos
def primo(n):# lista dos divisores própriosdivs = [d for d in range(2,n) if n%d==0]# n é primo se e só se a lista for vaziareturn len(divs)==0
Nota: esta solução é ineficiente (calcula todos os divisores em vez determinar após encontrar o primeiro. . . )
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 10 / 28
Listas em compreensão embricadas
Podemos usar uma lista em compreensão dentro de outra.
Exemplo:
[[i*j for j in range(1,11)] for i in range(1,11)]
produz a matriz da multiplicação:
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],[2, 4, 6, 8, 10, 12, 14, 16, 18, 20],[3, 6, 9, 12, 15, 18, 21, 24, 27, 30],
...[9, 18, 27, 36, 45, 54, 63, 72, 81, 90],
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 11 / 28
Compreensões com múltiplas sequências
A ordem do resultado depende da ordem das sequências:
>>> [(x,y) for x in "ABC" for y in range(3)][(’A’, 0), (’A’, 1), (’A’, 2),(’B’, 0), (’B’, 1), (’B’, 2),(’C’, 0), (’C’, 1), (’C’, 2)]
>>> [(x,y) for y in range(3) for x in "ABC"][(’A’, 0), (’B’, 0), (’C’, 0),(’A’, 1), (’B’, 1), (’C’, 1),(’A’, 2), (’B’, 2), (’C’, 2)]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 12 / 28
Sintaxe geral
[expr for var1 in seq1 if cond1for var2 in seq2 if cond2...for varN in seqN if condN]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 13 / 28
Formatação de texto
Por vezes necessitamos de especificar exatamente como sãomostrados resultados; por exemplo:
algarismos e casas decimais dos números;mostrar ou não zeros à esquerda/direita;alinhar campos entre linhas duma tabela.
Podemos fazer tudo isto em Python com o operador de formatação detexto.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 14 / 28
Operador de formatação
formato % valores
formato uma cadeia com campos marcados com o símbolo ‘%’valores um tuplo de valores (a substituir nos campos).
Exemplos:
>>> "O valor de Pi é %f" % math.pi’O valor de Pi é 3.141593’>>> "%02d/%02d/%4d" % (1, 6, 2013)’01/06/2013’
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 15 / 28
Alguns campos de formatos
%d, %i inteiro decimal com sinal"%d/%3d/%-3d" % (5, 5, 5)’5/ 5/5 ’
%e, %f, %g vírgula flutuante, formato exponencial ou decimal"%f %.3f %e" % (math.pi,math.pi,math.pi)’3.141593 3.142 3.141593e+00’
%s cadeia"(%s/%4s/%-4s)" % ("A", "BC", "D")’(A/ BC/D )’
%% o caracter %"%d%% da nota" % 1212% da nota
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 16 / 28
Exemplo
Tabelar o seno e coseno no intervalo [0, 2π].
Primeira versão (sem formatação).
from math import *print("x", "sin(x)", "cos(x)")for i in range(11):
x = 2*pi/10 * iprint(x, sin(x), cos(x))
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 17 / 28
Exemplo (cont.)
Resultado:
x sin(x) cos(x)0.0 0.0 1.00.6283185307179586 0.5877852522924731 0.80901699437494751.2566370614359172 0.9510565162951535 0.309016994374947451.8849555921538759 0.9510565162951536 -0.309016994374947342.5132741228718345 0.5877852522924732 -0.80901699437494733.141592653589793 1.2246467991473532e-16 -1.03.7699111843077517 -0.587785252292473 -0.80901699437494764.39822971502571 -0.9510565162951535 -0.309016994374947565.026548245743669 -0.9510565162951536 0.309016994374947235.654866776461628 -0.5877852522924734 0.80901699437494736.283185307179586 -2.4492935982947064e-16 1.0
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 18 / 28
Exemplo (cont.)
Segunda versão (usando formatação):
print("%7s %7s %7s" % ("x", "sin(x)", "cos(x)"))for i in range(11):
x = 2*pi/10 * iprint("%7.4f %7.4f %7.4f" % (x,sin(x),cos(x)))
Legenda:
%7.4f campo de vírgula flutuante com 7 carateres no total e4 casas decimais;
%7s campo de texto com 7 carateres no total.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 19 / 28
Exemplo (cont.)
Resultado:
x sin(x) cos(x)0.0000 0.0000 1.00000.6283 0.5878 0.80901.2566 0.9511 0.30901.8850 0.9511 -0.30902.5133 0.5878 -0.80903.1416 0.0000 -1.00003.7699 -0.5878 -0.80904.3982 -0.9511 -0.30905.0265 -0.9511 0.30905.6549 -0.5878 0.80906.2832 -0.0000 1.0000
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 20 / 28
Tabela de multiplicação
Outro exemplo: formatar a tabela da multiplicação de 1 a 10.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 21 / 28
Tabela de multiplicação (cont.)
# formatar o cabeçalhofmt = " *|" + 10*"%3d "print(fmt % tuple(range(1,11)))print(43*’=’)
# formatar o corpofor i in range(1,11):
linha = [i]for j in range(1,11):
linha.append(i*j)fmt = "%2d|" + 10*"%3d "print(fmt % tuple(linha))
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 22 / 28
Tabela de multiplicação (cont.)
*| 1 2 3 4 5 6 7 8 9 10===========================================1| 1 2 3 4 5 6 7 8 9 102| 2 4 6 8 10 12 14 16 18 203| 3 6 9 12 15 18 21 24 27 304| 4 8 12 16 20 24 28 32 36 405| 5 10 15 20 25 30 35 40 45 506| 6 12 18 24 30 36 42 48 54 607| 7 14 21 28 35 42 49 56 63 708| 8 16 24 32 40 48 56 64 72 809| 9 18 27 36 45 54 63 72 81 90
10| 10 20 30 40 50 60 70 80 90 100
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 23 / 28
Mais métodos sobre cadeias
str.split() partir uma cadeia numa lista das partes delimitadaspor espaços
str.split(sep) partir uma cadeia numa lista das partesdelimitadas pela cadeia sep
str.join(lista) juntar uma lista de cadeias numa só usando strcomo separador
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 24 / 28
Exemplos
>>> "as armas e os barões".split()[’as’, ’armas’, ’e’, ’os’, ’barões’]
>>> "abc-de-fgh".split(’-’)[’abc’, ’de’, ’fgh’]
>>> " ".join([’as’, ’armas’, ’e’, ’os’, ’barões’])’as armas e os barões’
>>> "--".join([’as’, ’armas’, ’e’, ’os’, ’barões’])’as--armas--e--os--barões’
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 25 / 28
Exemplo maior: a cifra de César
Recorde a solução apresentada na aula 8:
def cifrar(k, txt):msg = ""for c in txt:
msg = msg + rodar(k,c)return msg
Esta solução é correta mas ineficiente:acrescenta um carater de cada vez à cadeia txt
isto constroi muitas cadeias intermédiaspodemos evitar isto usando join
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 26 / 28
Exemplo maior: a cifra de César
Recorde a solução apresentada na aula 8:
def cifrar(k, txt):msg = ""for c in txt:
msg = msg + rodar(k,c)return msg
Esta solução é correta mas ineficiente:acrescenta um carater de cada vez à cadeia txt
isto constroi muitas cadeias intermédiaspodemos evitar isto usando join
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 26 / 28
Exemplo maior: a cifra de César (2)
Uma solução melhor:
def cifrar(k, txt):lista = [rodar(k,c) for c in txt]return "".join(lista)
construimos uma lista com os carateres rodadosusamos join para juntar todos carateres numa nova cadeia
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 27 / 28
Mais geralmente
Devemos usar
"".join(lista)
em vez de
txt = ""for x in lista:
txt = txt + x
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 28 / 28