Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas...

Post on 25-Sep-2018

216 views 0 download

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