Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Fundamentos da Programação
Capítulo 4: Tuplos e ciclos contados (ciclos contados e cadeias de caracteres revisitadas)
Ciclos contados• Semântica
Ao encontrar a instrução:
for var in exp:
<instruções>
• O Python executa as instruções correspondentes a <instruções> para os valores da variável var correspondentes aos elementos da sequência resultante da avaliação de exp
• No corpo do ciclo de uma instrução for pode também ser utilizada a instrução break
Expressão rangeSintaxe
Todas as expressões têm um valor inteiro
Expressão rangeSemântica• range(n) devolve a sequência contendo os inteiros entre 0 e n-1. Se
n ≤ 0, devolve a sequência sem elementos• range(n1, n2) devolve a sequência contendo os inteiros entre n1 e n2-1.
Se n2 ≤ n1, devolve a sequência sem elementos• range(n1, n2, n3) devolve a sequência contendo os inteiros que
começam em n1 e nunca sendo superiores a n2-1 (ou nunca sendo inferiores a n2+1, no caso de n3 < 0), em que cada elemento da sequência é obtido do anterior somando n3, ou seja corresponde à sequência n1, n1+n3, n1+2*n3, ....
Ciclos contados – Exemplo def soma_elementos(t):
soma = 0
for i in range(len(t)):
soma = soma + t[i]
return soma
>>> soma_elementos((1, 2, 3, 4))
10
Exemplo• Predicado tuplo_ordenado, devolve True apenas se o tuplo que é seu
argumento estiver ordenado
Exemplo• Predicado tuplo_ordenado, devolve True apenas se o tuplo que é seu
argumento estiver ordenado
def tuplo_ordenado(t):
for i in range(len(t)-1):
if t[i] > t[i+1]:
return False
return True
Funções com número arbitrário de argumentos• A função print aceita qualquer número de argumentos
print()
print(x, ‘é o resultado de elevar ‘, y, ‘a ‘, x)
• Como escrever funções deste tipo?
Número arbitrário de argumentos• Sintaxe
• Semântica• Ao encontrar a chamada, o Python associa os n-1 primeiros parâmetros
formais com os n-1 primeiros parâmetros concretos e associa o último parâmetro formal (o nome antecedido por *) com o tuplo constituído pelos restantes parâmetros concretos
Exemplodef ex_fn(a, b, *c):
print('a =', a)print('b =', b)print('c =', c)
>>> ex_fn(3, 2)a = 3b = 2c = ()>>> ex_fn(3, 2, 5, 6, 7, 8)a = 3b = 2c = (5, 6, 7, 8)>>> ex_fn(3)TypeError: ex_fn() missing 1 required positional argument: 'b'
Cadeias de caracteres• Introduzidas como constantes – qualquer sequência de caracteres delimitada
por plicas ou por aspas• Usadas para produzir mensagens para o utilizador
Cadeias de caracteres• Introduzidas como constantes – qualquer sequência de caracteres delimitada
por plicas ou por aspas• Usadas para produzir mensagens para o utilizador
• As cadeias de caracteres correspondem a um tipo estruturado de dados, designado por string, o qual corresponde a uma sequência de caracteres individuais
Cadeias de caracteres• Representação externa
<cadeia de caracteres> ::= '<carácter>*' |
"<carácter>*" |
"""<carácter>*"""
''e "" correspondem à cadeia de caracteres vazia
Cadeias de caracteres"""<carácter>*"""
• Cadeias de caracteres de documentação
• Quando o Python encontra uma cadeia de caracteres de documentação, na linha imediatamente a seguir a uma linha que começa pela palavra def, associa o conteúdo dessa cadeia de caracteres à entidade que está a ser definida
• Permite a consulta rápida da informação associada com a entidade definida, recorrendo à função help
Operações sobre cadeias de caracteres
Exemplo – caracteres em comumdef c_comum(cc1, cc2):
res = ''for e1 in cc1:
for e2 in cc2:if e1 == e2 and e1 not in res:
res = res + e1return res
>>> c_comum('agbdcu', 'ggat')'ag'
Representação interna de caracteres• Cada carácter é representado internamente por um inteiro
• Vários modos de codificar carateres
• ASCII (American Standard Code for Information Interchange) – 128 caracteres
• Unicode
ASCII
Funções embutidas• ord
• recebe um carácter (sob a forma de uma cadeia de caracteres) e devolve o inteiro correspondente ao código decimal que o representa
• chr• recebe um número inteiro positivo e devolve o carácter (sob a forma de uma
cadeia de caracteres) representado por esse número>>> ord('R')
82
>>> chr(125)
''
Operadores relacionais<, >, >=, <=, ==, !=
>>> 'a' < 'b'True>>> 'a' > 'A'True>>> 'abc' > 'adg'False>>> 'abc' < 'abcd'True
Exemplo
ABB33BBBC
Cifragem de mensagens• Cifra corresponde a substituir as letras da mensagem por outras letras através
de um algoritmo conhecido pelo recetor da mensagem• Cifra de substituição, substitui cada letra da mensagem por outra letra de
acordo com um certo padrão• A primeira utilização foi feita por Júlio César (100-44 a.C.) durante as Guerras Gálicas,
sendo também conhecida por cifra de César
Cifra de substituição• Cada letra da mensagem é substituída pela letra que está um certo número de
posições à sua direita no alfabeto, o deslocamento• Se o deslocamento for 5, A será substituída por F, B por G e assim
sucessivamente
ABCDEFGHIJKLMNOPQRSTUVWXYZ
FGHIJKLMNOPQRSTUVWXYZABCDE
• A cifra de César corresponde a 26 cifras de substituição, uma para cada letra do alfabeto
Cifra de substituição• Cada letra da mensagem é substituída pela letra que está um certo número de
posições à sua direita no alfabeto, o deslocamento• Se o deslocamento for 5, A será substituída por F, B por G e assim
sucessivamente
ABCDEFGHIJKLMNOPQRSTUVWXYZ
FGHIJKLMNOPQRSTUVWXYZABCDE
Exemplo• Função codifica recebe uma maiúscula, c, e o deslocamento, desloc (apenas
considera letras maiúsculas)1. Calcula o seu código ASCII: ord(c)
2. Calcula a distância a c se encontra em relação ao início do alfabeto, ord(c)-ord(’A’)
3. Soma desloc a essa distância e determina qual a distância a que a letra resultante está do início do alfabeto, (ord(c)-ord(’A’)+desloc)%26
4. Soma a distância à posição da letra ’A’, ord(’A’)+(ord(c)-ord(’A’)+desloc)%26
5. A função chr, calcula qual a letra que substitui a letra original
Exemplo
Exemplo• À mensagem cifrada é adicionada, na última posição, a letra que define a cifra
usada
Dígito de controle• Problema relevante em situações em que se lida com números muito grandes
• Número do cartão de cidadão, números de cartões de crédito, números de cheques, códigos de barras de produtos, identificadores de livros (código ISBN)
• É comum a introdução de um dígito adicional, o dígito de controle que permite detetar os erros mais comuns na introdução ou transmissão de grandes números:
1. a alteração de um único algarismo2. a troca de pares de algarismos subjacentes
• O dígito de controle é calculado de acordo com determinado algoritmo e permite verificar se o número introduzido está ou não correto
Dígito de controle – cartão de cidadão
1º dígito de controle: o valor da soma
adicionado ao dígito de controle é um múltiplo de 11
02038801 2 ZZ9
1º dígito de controle
2º dígito de controle
Dígito de controle – cartão de cidadão
def gera_dc_1(num_id_civil):if len(num_id_civil) != 8:
raise ValueError ('Numero incorreto')else:
soma = 0for i in range(8):
soma = soma + eval(num_id_civil[i]) * (9 - i)return 11 - soma % 11