• Nenhum resultado encontrado

Programação I Aula 12 Mais sobre cadeias e listas

N/A
N/A
Protected

Academic year: 2021

Share "Programação I Aula 12 Mais sobre cadeias e listas"

Copied!
29
0
0

Texto

(1)

Programação I

Aula 12 — Mais sobre cadeias e listas

Pedro Vasconcelos

DCC/FCUP

(2)

Nesta aula

1 Listas em compreensão

2 Formatação de texto

(3)

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.

(4)

Exemplo: calcular quadrados

(5)

Exemplo: calcular quadrados (cont.)

Solução usando umciclo for:

lista = []

for x in range(1, 10): lista.append(x**2) print(lista)

Solução usando umalista em compreensão:

lista = [x**2 for x in range(1,10)] print(lista)

(6)

Sintaxe

[x**2 for x in range(1,10)] Notação inspirada na teoria de conjuntos:

{x2:x ∈ {1, . . . , 9}}

Mais geralmente:

(7)

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]

(8)

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:

(9)

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 divisores próprios é vazia.

(10)

Testar primos

def primo(n):

# lista dos divisores próprios

divs = [d for d in range(2,n) if n%d==0]

# n é primo se e só se a lista for vazia

return len(divs)==0

Nota: esta solução é ineficiente (calcula todos os divisores em vez de terminar após encontrar o primeiro. . . )

(11)

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]]

(12)

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)]

(13)

Sintaxe geral

[expr for var1 in seq1 if cond1 for var2 in seq2 if cond2 .

. .

(14)

Formatação de texto

Por vezes necessitamos de especificar exatamente como são mostrados 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 deformatação de

(15)

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’

(16)

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" % 12

(17)

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 * i

(18)

Exemplo (cont.)

Resultado: x sin(x) cos(x) 0.0 0.0 1.0 0.6283185307179586 0.5877852522924731 0.8090169943749475 1.2566370614359172 0.9510565162951535 0.30901699437494745 1.8849555921538759 0.9510565162951536 -0.30901699437494734 2.5132741228718345 0.5877852522924732 -0.8090169943749473 3.141592653589793 1.2246467991473532e-16 -1.0 3.7699111843077517 -0.587785252292473 -0.8090169943749476 4.39822971502571 -0.9510565162951535 -0.30901699437494756 5.026548245743669 -0.9510565162951536 0.30901699437494723 5.654866776461628 -0.5877852522924734 0.8090169943749473 6.283185307179586 -2.4492935982947064e-16 1.0

(19)

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 * i

print("%7.4f %7.4f %7.4f" % (x,sin(x),cos(x)))

Legenda:

%7.4f campo de vírgula flutuante com 7 carateres no total e 4 casas decimais;

(20)

Exemplo (cont.)

Resultado: x sin(x) cos(x) 0.0000 0.0000 1.0000 0.6283 0.5878 0.8090 1.2566 0.9511 0.3090 1.8850 0.9511 -0.3090 2.5133 0.5878 -0.8090 3.1416 0.0000 -1.0000 3.7699 -0.5878 -0.8090 4.3982 -0.9511 -0.3090 5.0265 -0.9511 0.3090 5.6549 -0.5878 0.8090

(21)

Tabela de multiplicação

(22)

Tabela de multiplicação (cont.)

# formatar o cabeçalho fmt = " *|" + 10*"%3d " print(fmt % tuple(range(1,11))) print(43*’=’) # formatar o corpo for 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))

(23)

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 10 2| 2 4 6 8 10 12 14 16 18 20 3| 3 6 9 12 15 18 21 24 27 30 4| 4 8 12 16 20 24 28 32 36 40 5| 5 10 15 20 25 30 35 40 45 50 6| 6 12 18 24 30 36 42 48 54 60 7| 7 14 21 28 35 42 49 56 63 70 8| 8 16 24 32 40 48 56 64 72 80 9| 9 18 27 36 45 54 63 72 81 90 10| 10 20 30 40 50 60 70 80 90 100

(24)

Mais métodos sobre cadeias

str.split() partir uma cadeia numa lista das partes delimitadas por espaços

str.split(sep) partir uma cadeia numa lista das partes delimitadas pela cadeia sep

str.join(lista) juntar uma lista de cadeias numa só usando str como separador

(25)

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’

(26)

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 masineficiente:

acrescenta um carater de cada vez à cadeia txt isto constroi muitas cadeias intermédias

(27)

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 masineficiente:

acrescenta um carater de cada vez à cadeia txt isto constroi muitas cadeias intermédias

(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 umalistacom os carateres rodados

(29)

Mais geralmente

Devemos usar "".join(lista) em vez de txt = "" for x in lista: txt = txt + x

Referências

Documentos relacionados

Processo de Desenvolvimento de Prod uto Monitorar Mercado Planejamento Estratégico Pesquisa & Atender Cliente Assistência Vender Desenvolvimento Técnica Suprimentos

De repente, da porta estreita com escada no fun- do sai um grupo de quatro rapazes, pouco depois outro grupo mais numeroso, em seguida mais e mais homens descem do segundo

METALATEX LITORAL SEM CHEIRO é uma tinta de alta qualidade à base de resina acrílica e acabamentos acetinado e fosco, indicada para áreas externas e internas ou para aplicação

Os modelos κ −  tem sido largamente utilizados para a predi¸c˜ ao do escoamento em camadas limite, em jatos, em canais e em difusores onde rota¸c˜ ao e separa¸c˜ ao n˜ ao este-

A amostra constituiu-se por 25 pacientes em tratamento no ambulatório de gastren- terologia de um hospital geral universitário, cujos diagnósticos haviam sido realizados para

A autarquia, em consonância com o disposto na Lei das Sociedades por Ações, entendeu que as companhias poderão utilizar procuração eletrônica com assinatura digital certificada

Porque o casamento foi anterior ao nascimento do filho, são esses os nomes que constam do respectivo registo. Passados alguns anos, os pais divorciam-se e voltam a usar os nomes

O presente trabalho tem como objetivo fazer a prospecção de patentes de produtos desenvolvidos com Morinda Citrifolia, através do sistema Orbit e A61K36/746 (IPC), que