Python

28
Programando em Python (Claudio Esperança) Por que programar? É divertido Melhor que usar programas feitos por outros Fazer programas = resolver quebra- cabeças Programação como arte É útil Programação como ferramenta Pode ser aplicado a quase qualquer atividade Arte / Ciência / Filosofia / Entretenimento Algoritmos e Programas Algoritmo = método para solucionar um problema Estruturas de dados = método para organizar informações Programa = algoritmos + estruturas de dados expressos de forma a ser entendidos pelo computador Programas tipicamente processam dados de entrada e produzem dados de saída Linguagem de Programação Linguagem artificial com sintaxe e semântica bem definidos Usada para exprimir programas Mais “técnica” do que linguagens naturais Menos “técnica” do que a linguagem nativa dos computadores (linguagem de máquina) Compiladores Programas que traduzem programas escritos em linguagem de programação para programas equivalentes escritos em linguagem de máquina O primeiro é chamado de programa fonte, enquanto que o segundo é chamado de programa objeto Link-Editores O programa-objeto nem sempre está pronto para ser executado Outros trechos de código precisam ser incluídos Bibliotecas Subprogramas Programa executável é montado por um programa chamado link- editor ou linking-loader Compilador normalmente chama o link- editor Automaticamente Link-Editores Interpretadores Simulam uma “máquina virtual” Programa fonte é lido, entendido e as instruções são executadas imediatamente Esquemas Híbridos Compilador gera código para uma máquina virtual (pseudo-código) Máquina virtual é executada separadamente lendo pseudo-código e interpretando-o

Transcript of Python

Page 1: Python

Programando emPython(Claudio Esperança)

Por que programar? É divertido Melhor que usar programas feitos por outros Fazer programas = resolver quebra-cabeças Programação como arte É útil Programação como ferramenta Pode ser aplicado a quase qualquer atividade Arte / Ciência / Filosofia / Entretenimento

Algoritmos e Programas Algoritmo = método para solucionar um problema Estruturas de dados = método para organizarinformações Programa = algoritmos + estruturas de dadosexpressos de forma a ser entendidos pelocomputador Programas tipicamente processam dados de entradae produzem dados de saída

Linguagem de Programação Linguagem artificial com sintaxe e semânticabem definidos Usada para exprimir programas Mais “técnica” do que linguagens naturais

Menos “técnica” do que a linguagem nativados computadores (linguagem de máquina)

Compiladores Programas que traduzem programas escritos em linguagem deprogramação para programas equivalentes escritos emlinguagem de máquina O primeiro é chamado de programa fonte, enquanto que osegundo é chamado de programa objeto

Link-Editores O programa-objeto nem sempre está prontopara ser executado Outros trechos de código precisam ser incluídos Bibliotecas Subprogramas Programa executável é montado por umprograma chamado link-editor ou linking-loader Compilador normalmente chama o link-editorAutomaticamente

Link-Editores

Interpretadores Simulam uma “máquina virtual” Programa fonte é lido, entendido e as

instruções são executadas imediatamente

Esquemas Híbridos Compilador gera código para uma máquina virtual(pseudo-código) Máquina virtual é executada separadamente lendopseudo-código e interpretando-o

Por que Python? Simples o suficiente para um curso introdutório Muitos recursos Orientação a Objetos Escalável (módulos, classes, controle de exceções) Biblioteca embutida extensa e grande número demódulos fornecidos por terceiros Grande variedade de aplicações Linguagem interpretada (script) Multi-plataforma Grátis! Comunidade bastante grande

O que vamos precisar Uma implementação da linguagem http://www.python.org Implementação pronta para baixar (windows)

Page 2: Python

Linux normalmente já vem com pythoninstalado Um editor de textos Qualquer editor serve Ambiente IDLE inclui um editor Incluído na distribuição Windows

Python Interativo Rode o interpretador Digite comandos python Cada comando é executado imediatamente[cancer]~> pythonPython 2.4.1 (#1, May 16 2005, 15:19:29)[GCC 4.0.0 20050512 (Red Hat 4.0.0-5)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> print "alo!"alo!>>>

Executando um programaPython Escreva um programa python Invoque o interpretador para executá-lo[cancer]~> cat prog.pyprint "alo!"[cancer]~> python prog.pyalo!

Executando um programa Python Interfaces gráficas normalmente já associam ossufixos .py e .pyc com o interpretador

Python:Tipos Básicos

Python como calculadora O Interpretador python pode ser usado comocalculadora Por exemplo, as quatro operações aritméticas sãodenotadas pelos símbolos + adição subtração * multiplicação / divisão

>>> 1010>>> # Um comentário é precedido do caracter "#"... # Comentários são ignorados pelo interpretador... 10+515

>>> 10-15 # Comentários podem aparecer também após código-5>>> 10*330>>> 10/33>>> 10/-3 # Divisão inteira retorna o piso-4>>> 10%3 # Resto de divisão inteira simbolizado por %1

Tipos de dados São categorias de valores que são processados deforma semelhante Por exemplo, números inteiros são processados deforma diferente dos números de ponto flutuante(decimais) e dos números complexos Tipos primitivos: são aqueles já embutidos no núcleoda linguagem Simples: números (int, long, float, complex) e cadeiasde caracteres (strings) Compostos: listas, dicionários, tuplas e conjuntos Tipos definidos pelo usuário: são correspondentes aclasses (orientação objeto)

Variáveis São nomes dados a áreas de memória Nomes podem ser compostos de algarismos,letras ou _ O primeiro caractere não pode ser um algarismo Palavras reservadas (if, while, etc) são proibidas Servem para: Guardar valores intermediários

Page 3: Python

Construir estruturas de dados Uma variável é modificada usando o comando de atribuição:Var = expressão É possível também atribuir a várias variáveis simultaneamente:var1,var2,...,varN = expr1,expr2,...,exprN

Variáveis>>> a=1>>> a1>>> a=2*a>>> a2>>> a,b=3*a,a>>> a,b(6, 2)>>> a,b=b,a>>> a,b(2, 6)

Variáveis Variáveis são criadas dinamicamente e destruídasquando não mais necessárias, por exemplo, quandosaem fora de escopo (veremos isso mais tarde) O tipo de uma variável muda conforme o valoratribuído, i.e., int, float, string, etc. Não confundir com linguagens sem tipo Ex.:>>> a ="1">>> b = 1>>> a+bTraceback (most recent call last):File "<stdin>", line 1, in ?TypeError: cannot concatenate 'str' and 'int' objects

Números Há vários tipos numéricos que se pode usar em python Int: números inteiros de precisão fixa 1 , 2 , 15 , 19

Long: números inteiros de precisão arbitrária 1L , 10000L , -9999999L Floats: números racionais de precisão variável 1.0 , 10.5 , -19000.00005 , 15e-5 Complex: números complexos 1+1j , 20j , 1000+100J

Números inteiros Os ints têm precisão fixa ocupando tipicamente umapalavra de memória Em PC's são tipicamente representados com 32 bits(de 2311a 232) Os números inteiros de precisão arbitrária (longs) sãoarmazenados em tantas palavras quanto necessário Constantes do tipo long têm o sufixo L ou l Longs são manipulados bem mais lentamente que ints Quando necessário, cálculos usando ints sãoconvertidos para longs

>>> a=2**30 # Potenciação>>> a1073741824>>> b=a*1000>>> b1073741824000L>>> b/10001073741824L

Constantes podem ser escritas com notação idêntica àusada em C Hexadecimal: preceder dígitos de 0x Octal: preceder dígitos de 0 Ex.:

>>> 02218>>> 0x1016>>> 0x1f31

Números de ponto flutuante São implementados como os double's da linguagem C –tipicamente usam 2 palavras Constantes têm que possuir um ponto decimal ou seremescritas em notação científica com a letra “e” (ou “E”)precedendo a potência de 10 Ex:>>> 10 # inteiro10>>> 10.0 # ponto flutuante10.0>>> 99e399000.0>>> 99e-30.099000000000000005

Números complexos Representados com dois números de ponto flutuante: um para aparte real e outro para a parte imaginária Constantes são escritas como uma soma sendo que a parteimaginária tem o sufixo j ou J Ex.:>>> 1+2j(1+2j)>>> 1+2j*3(1+6j)>>> (1+2j)*3(3+6j)>>> (1+2j)*3j(6+3j)

Strings São cadeias de caracteres Constituem outro tipo fundamental do python Constantes string são escritas usando aspas simples ou duplas Ex.: "a" ou 'a'

Page 4: Python

O operador “+” pode ser usado para concatenar strings Ex.: "a"+"b" é o mesmo que "ab" O operador “*” pode ser usado para repetir strings Ex.: "a"*10 é o mesmo que "aaaaaaaaaa"

Python usa a tabela de caracteres default do S.O. Ex.: ASCII, UTF8 Caracteres não imprimíveis podem ser expressos usando notação“barrainvertida”(\) \n é o mesmo que new line \r é o mesmo que carriage return \t é o mesmo que tab \b é o mesmo que backspace \\ é o mesmo que \ \x41 é o mesmo que o caractere cujo código hexadecimal é41 (“A” maiúsculo)

>>> "ab\rd"'ab\rd'>>> print "ab\rd" # print exibe chars não imprimíveisdb>>> print "abc\td"abc d>>> print "abc\nd"abcd>>> print "abc\\nd"abc\nd>>> print "ab\bc"ac>>> print "\x41\xA1"Aí

A notação barrainvertida(\) pode ser desabilitadadesde que a constante string seja precedida por um r(erre minúsculo) São chamadas strings raw (cruas)

Ex.:>>> print "abc\ncd\tef"abccd ef>>> print r"abc\ncd\tef"abc\ncd\tef

Constantes string podem ser escritas com várias linhasdesde que as aspas não sejam fechadas e que cadalinha termine com uma barra invertida Ex.:>>> print "abcd\n\... efgh\n\... ijk"abcdefghijk>>> print "abcd\... efgh\... ijk"abcdefghijk>>>

Também é possível escrever constantes string em várias linhasincluindo as quebras de linha usando três aspas comodelimitadores Ex.:>>> print """Um tigredois tigrestrês tigres"""Um tigredois tigrestrês tigres>>> print '''abcdefgh'''abcdefgh

Strings – Índices Endereçam caracteres individuais de uma string Notação: string[índice] O primeiro caractere tem índice 0 O último caractere tem índice 1 Ex.:>>> a = "abcde">>> a[0]'a'>>> a[-1]'e'

Strings – Fatias (slices) Notação para separar trechos de uma string Notação: string[índice1:índice2] Retorna os caracteres desde o de índice1 (inclusive) atéo de índice2 (exclusive) Se o primeiro índice é omitido, é assumido 0 Se o último índice é omitido, é assumido o fim da string

>>> a'abcde'>>> a[0:2]'ab'>>> a [2:]'cde'>>> a[:]'abcde'>>> a[-1:]'e'>>> a[:-1]'abcd'

Expressões booleanas Também chamadas expressões lógicas Resultam em verdadeiro (True) ou falso (False) São usadas em comandos condicionais e de repetição Servem para analisar o estado de uma computação e permitir escolhero próximo passo Operadores mais usados Relacionais: > , < , ==, !=, >=, <= Booleanos: and, or, not Avaliação feita em “Curtocircuito” Expressão avaliada da esquerda para a direita Se o resultado (verdadeiro ou falso) puder ser determinado sem

Page 5: Python

avaliar o restante, este é retornado imediatamente

>>> 1==1True>>> 1==2False>>> 1==1 or 1==2True>>> 1==1 and 1==2False>>> 1<2 and 2<3True>>> not 1<2False>>> not 1<2 or 2<3True>>> not (1<2 or 2<3)False>>> "alo" and 11>>> "alo" or 1'alo'

As constantes True e False são apenas símbolosconvenientes Qualquer valor não nulo é visto como verdadeiroenquanto que 0 (ou False) é visto como falso O operador or retorna o primeiro operando se forvista como verdadeiro, caso contrário retorna osegundo O operador and retorna o primeiro operando se forvista como falso, caso contrário retorna o segundo Operadores relacionais são avaliados antes de not,que é avaliado antes de and, que é avaliado antesde or

>>> 0 or 100100>>> False or 100100>>> "abc" or 1'abc'>>> 1 and 22>>> 0 and 30

>>> False and 3False>>> 1 and 2 or 32>>> 0 or 2 and 33>>> 1 and not 0True

Além dos operadores, é possível usar funções paracomputar valores As funções podem ser definidas: Pelo programador (veremos + tarde) Em módulos da biblioteca padrão Por default: são as funções embutidas (builtin) Na verdade, fazem parte do módulo __builtins__, que é sempreimportado em toda aplicação Ex.: abs(x) retorna o valor absoluto do número x chr(x) retorna uma string com um único caractere cujocódigo ASCII é x ord(s) retorna o código ASCII do caractere s

>>> abs (10)10>>> abs (-19)19>>> chr (95)'_'>>> chr (99)'c'>>> ord ('a')97

Importando módulos Muitas funções importantes são disponibilizadas emmódulos da biblioteca padrão Ex.: o módulo math tem funções transcendentais comosin, cos, exp e outras

Um módulo pode conter não só funções mas tambémvariáveis ou classes Por exemplo, o módulo math define a constante pi Para usar os elementos de um módulo, podeseusar ocomando import Formatos: import modulo from modulo import nome,...,nome from modulo import *

Por exemplo: from math import *# importa todos os elementos do módulo math from math import sin# importa apenas a função sin import math# importa o módulo math como um todo# (todos os elementos têm que ser citados# precedidos por math.)

>>> import math>>> a = sin(30)Traceback (most recent call last):File "<stdin>", line 1, in ?NameError: name 'sin' is not defined>>> a = math.sin(30)>>> from math import sin>>> a = sin(30)>>> print a-0.988031624093>>> a = sin(radians(30))Traceback (most recent call last):File "<stdin>", line 1, in ?NameError: name 'radians' is not defined>>> from math import *>>> a = sin(radians(30))>>> a0.49999999999999994

Explorando Módulos>>> import math>>> help(math.cos)Help on built-in function cos in module math:cos(...)cos(x)Return the cosine of x (measured in radians).

Page 6: Python

(END)

Pressionase“q” para retornar ao interpretador.

Python:Comandos Básicos Primeiros passos em programação Até agora só vimos como computar algumasexpressões simples Expressões são escritas e computadas imediatamente Variáveis podem ser usadas para valores temporários Um programa típico entretanto usa vários tipos deconstruções tais como: Comandos condicionais Comandos de repetição Definição e uso de procedimentos (subprogramas) Definição e uso de classes e objetos (programação OO)

Primeiros passos em programação

Programas armazenados À medida que os programas vão se tornando mais complicados,é mais interessante guardálosem arquivos e executálosquando necessário

Arquivo fibo.py (use um editor de textos como o do IDLE):# Série de Fibonacci:a, b = 0, 1while b < 10:print ba, b = b, a+b

Formas de Executarum Programa Digite python fibo.py no seu shell, ou Clique no ícone do arquivo, ou De dentro do editor IDLE, selecione Run Module (F5), ou De dentro do interpretador python:>>> execfile ("fibo.py")Entre com um numero 51 1 2 3>>>

print Forma geral: print expr,expr,... Os valores das expressões são escritos um após o outro sempular de linha:>>> print "1.001 ao quadrado é ",1.001**21.001 ao quadrado é 1.002001 Se o comando terminar com vírgula, o próximo print escreverána mesma linha. Por exemplo:>>> a, b = 0, 1>>> while b < 1000:... print b,... a, b = b, a+b...1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

input O programa que computa elementos da série de Fibonaccitermina quando atinge um elemento com valor superior a umaconstante Podemos tornar o programa mais flexível se ao usuário for

permitido estipular o valor máximo O comando input permite perguntar ao usuário um valor(normalmente é atribuído a uma variável) Formato: input(pergunta) onde pergunta é uma string opcional que será exibida paraindicar o valor que se espera (i.e., prompt) Exemplo:>>> a = input("Entre com um numero: ")Entre com um numero: 19>>> print a19

raw_input É semelhante ao input, mas não tenta interpretar oque foi digitado como uma expressão O resultado é simplesmente uma string com o textodigitado Ex.:>>> nome = raw_input ("Entre seu nome: ")Entre seu nome: Claudio Esperança>>> print nomeClaudio Esperança>>> nome'Claudio Esperan\xe7a'

while Repete uma seqüência de comandos enquanto uma dada expressãobooleana é avaliada como verdadeira Formato:while expressão:comando...comando Exemplo:>>> a = 10>>> while a>8:... print a,... a = a-1...10 9

Laços Infinitos

Page 7: Python

Como em todo comando de repetição, é importanteevitar os chamados “laços infinitos” Ex.:>>> a = 10>>> while a>8:... print a,... a = a+1...10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2627 28 29 30 31 32 33 ...

if É o comando condicional por excelência Formatos:

Exemplo 1 a = input("Entre com um numero:")if a < 0:print a," é negativo"print "Obrigado!" Execução 1:Entre com um numero:2Obrigado! Execução 2:Entre com um numero:-2-2 é negativoObrigado!

Exemplo 2 a = input("Entre com um numero:")if a < 0:print a," é negativo"else:print a," é zero ou positivo"print "Obrigado!" Execução 1:Entre com um numero:22 é zero ou positivoObrigado! Execução 2:Entre com um numero:-2-2 é negativoObrigado!

Exemplo 3 a = input("Entre com um numero:")if a < 0:print a," é negativo"elsif a==0:print a," é zero"else:print a," é positivo"print "Obrigado!" Execução 1:Entre com um numero:0

0 é zeroObrigado! Execução 2:Entre com um numero:22 é positivoObrigado!

Exercício: algarismos romanos Fazer um programa que escreva a representação emalgarismos romanos de um número inteiro positivo O usuário deve entrar com um número (input) O resultado deve ser impresso no console (print) Exemplo de execução:Entre com um numero positivo: 1985Em algarismos romanos: MCMLXXXV

Algoritmo A representação em romanos é uma string à qual éacrescentada uma letra por vez Inicialmente, uma string vazia Examinar as sucessivas potências de 10 Por exemplo, a letra 'M' corresponde à casa dos milhares Se o número é 2200, sabemos que teremos dois M's narepresentação em romanos Sabemos que há M's se o número é maior ou igual a 1000 Sempre que um milhar for computado, subtrair 1000 do número Um processamento semelhante é feito para outros algarismosromanos, por exemplo:

Se o número é maior ou igual que 500, acrescentar 'D' Se o número é maior que 900, acrescentar 'CM'

DICA: processando um número entre 1 e 9if num >= 9:romano = romano + "IX"num = num-9if num >= 5:romano = romano + "V"num = num-5if num >= 4:romano = romano + "IV"num = num - 4while num >= 1:romano = romano + "I"num = num – 1

Exercício: números primos Fazer um programa que decida se um número positivodado é primo ou não Entrada: número inteiro positivo Saída: diagnóstico de primalidade do número Exemplos de execução: Entre com um número inteiro positivo: 169169 é múltiplo de 13 Entre com um número inteiro positivo: 983983 é primo

Um número natural é primo se é divisível apenas porsi mesmo ou pela unidade Isto sugere o seguinte algoritmo: Se o número é 1, então não é primo Se o número é 2, então é primo Caso contrário, Seja d um possível divisor, cujo valor é inicialmente 2 Repetir

Page 8: Python

Se o resto da divisão do número por d é zero, então o número nãoé primo Caso contrário, incrementar d Se d é igual ou maior que o número, então terminar repetiçãodiagnosticando o número como primo

Python::Listas

Estruturas de dados Maneira de organizar dados de maneira a facilitar seu acesso Algumas formas são clássicas: Listas Arrays (vetores e matrizes) Tuplas (registros) Árvores Linguagens freqüentemente possuem primitivas paraconstrução dessas E.D. Estruturas de dados embutidas Outras E.D. mais complexas podem ser construídascombinando as E.D. clássicas

Estrutura de dados abstrata É uma especificação matemática que define uma coleçãode dados e uma série de operações sobre ela É abstrata porque não especifica como as operações sãofeitas mas somente os dados de entrada e o resultado Numa linguagem de programação, essa coleção de

operações é chamada de interface ou API (ApplicationProgramming Interface) Usuários da e.d.a devem se preocupar com a interface enão com a implementação, que pode mudar com o tempo A implementação de uma e.d.a. requer cuidados quanto àcorreção e a eficiência da mesma

Listas São arranjos seqüenciais de informações mais simples Caracterizamsepor permitir o acesso eficiente aos seuselementos em ordem seqüencial A definição clássica de uma lista como estrutura de dadosabstrata compreende: Operação de construção de uma lista vazia Operação que testa se uma dada lista é vazia Operação para obter o primeiro elemento de uma lista Uma operação para adicionar um novo elemento no iníciode uma lista Operação para retirar o elemento inicial de uma lista

Listas em Python A estrutura conhecida como lista (list, em inglês) emPython é bastante mais geral do que e.d.a. listaclássica

Na verdade, pode ser vista como uma implementaçãotanto de listas como de arrays Além de acesso seqüencial, suportam também acessodireto através de índices Listas são variedades de seqüências assim comostrings e portanto têm APIs semelhantes Podem ser indexadas e fatiadas Podem ser concatenadas (+) e repetidas

Entretanto, há diferenças importantes entre listas estrings Seqüência genérica X de seqüência de caracteres Elementos de listas podem ser alteradosindividualmente mas os de strings, não Listas constituem o tipo de agregação de dados maisversátil e comum da linguagem Python Podem ser usadas para implementar estruturas dedados mais complexas como matrizes e árvores, porexemplo

Listas: constantes e índices Uma constante do tipo lista é escrita entre colchetescom os elementos separados por vírgula:[] # lista vazia[1,2] # lista com 2 elementos

Page 9: Python

Os elementos de uma lista podem ser de qualquertipo, inclusive listas. Ex.:lista = [1, 'a', 2+3j, ['ab', 'CD']]

Os elementos de uma lista podem ser acessados poríndices como strings O primeiro elemento tem índice 0 O último elemento tem índice 1

>>> lista = [1, 'a', 2+3j, ['ab', 'CD']]>>> lista [0]1>>> lista [2](2+3j)>>> lista [3]['ab', 'CD']>>> lista [-1]['ab', 'CD']>>> lista [0] = 2>>> lista[2, 'a', (2+3j), ['ab', 'CD']]

Listas: Concatenação e Repetição O operador + pode ser usado para concatenação e ooperador * para repetição>>> lista = [0]*4>>> lista[0, 0, 0, 0]>>> lista = lista + [1]*3>>> lista[0, 0, 0, 0, 1, 1, 1]

Deletando elementos O operador del pode ser usado para removerelementos de uma lista Ex.:>>> lista[1, 2, 3, ['ab', 'CD']]>>> del lista [2]>>> lista[1, 2, ['ab', 'CD']]>>> del lista [2][1]>>> lista[1, 2, ['ab']]

Listas: fatias (slices) A notação de fatias também pode ser usada, inclusivepara atribuição:>>> lista = [1, 'a', 2+3j, ['ab', 'CD']]>>> lista [1:]['a', (2+3j), ['ab', 'CD']]>>> lista [:1][1]>>> lista [1:2]

['a']>>> lista [0:-1][1, 'a', (2+3j)]

Listas: atribuição a fatias A atribuição a uma fatia requer que o valor atribuído seja uma seqüência(uma lista ou uma string, por exemplo) A atribuição substitui os elementos da fatia pelos da seqüência>>> lista = [1, 'y', ['ab', 'CD']]>>> lista [1:1] = ['z']>>> lista[1, 'z', 'y', ['ab', 'CD']]>>> lista [1:3] = [['x']]>>> lista[1, ['x'], ['ab', 'CD']]>>> lista [1:-1]= [2,3,4]>>> lista[1, 2, 3, 4, ['ab', 'CD']]>>> lista [:2] = 'xyz'>>> lista['x', 'y', 'z', 3, 4, ['ab', 'CD']]

Incrementos em Fatias É possível usar um terceiro número na notação defatias designando o incremento Default é 1 , ou seja, toma os elementos de um em umdo menor para o maior índice Podeseusar qualquer número inteiro diferente de 0 a[0:10:2] retorna uma lista com os 10 primeiros elementosde a tomados de 2 em 2 (5 elementos, no máximo) a[5:0:-1] retorna uma lista com os 5 primeiros elementosde a tomados da esquerda para a direita Obs.: Esta notação só existe nas versões de Python apartir da 2.3

Exemplo>>> a = ['a', 2, 3, 'd', 'x']>>> a [:3:2]['a', 3]>>> a [::-1]['x', 'd', 3, 2, 'a']

Se um incremento de fatia é diferente de 1, umaatribuição à fatia deve ter o mesmo número deelementos:>>> l = [1,2,3,4,5]>>> l [0::2] = ['x','y','z']>>> l['x', 2, 'y', 4, 'z']>>> l [0::2] = [6,7]Traceback (most recent call last):File "<pyshell#17>", line 1, in -toplevell[0::2] = [6,7]ValueError: attempt to assign sequence of size 2to extended slice of size 3

Operador “in” Permite saber se um elemento pertence a uma lista Serve também para strings Ex.:>>> lista = [1, 'a', 'bc']>>> 1 in listaTrue>>> 2 in listaFalse>>> 'b' in listaFalse>>> 'b' in lista[2]True>>> 'bc' in 'abcd'True

Inicializando listas Não é possível atribuir a uma posição inexistente deuma lista>>> vetor = []>>> vetor [0] = 1Traceback (most recent call last):File "<pyshell#21>", line 1, in -toplevelvetor[0] = 1IndexError: list assignment index out of range

Se uma lista vai ser usada como um array, isto é, vaiconter um número predeterminado de elementos, éconveniente iniciála>>> vetor = [0]*10>>> vetor [0] = 3>>> vetor

Page 10: Python

[3, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Usando None No uso de estruturas de dados, às vezes é importantepreencher uma posição com um valor “não válido” A melhor opção para esse uso é empregar o valorespecial None Não faz parte de tipo nenhum É melhor que usar 0, [] ou uma string vazia Útil para criar uma lista “vazia” mas com um númeroconhecido de posições. Ex.:>>> lista = [None]*5>>> lista[None, None, None, None, None]

Len,, min e max len (lista) retorna o número de elementos de lista min (lista) e max (lista) retornam o menor/maiorelemento de lista Ex.:>>> lista = [1, 2, 9, 3, 4]>>> min (lista)1>>> len (lista)5>>> max (lista)9>>> max (['a', 'b', 'c'])'c'

min e max Na verdade, min e max podem ser usados também comvários argumentos ao invés de uma lista Ex.:>>> min (1,2,3,4)1>>> max (3,4,5)5>>> max ([],[1],['a'])['a']

A função list

Pode ser usada para converter uma string numa lista É útil pois uma lista pode ser modificada, mas uma string, não Para fazer a transformação inversa, podeseusar o método join(veremos métodos mais tarde) Ex.: >>> lista = list('alo') >>> lista ['a', 'l', 'o'] >>> lista[1]='xx' >>> lista ['a', 'xx', 'o'] >>> ''.join(lista) 'axxo'

A função range Retorna uma progressão aritmética de inteiros numa lista Forma geral: range (início, parada, incremento) início (opcional) é o primeiro valor a ser gerado (default: 0) parada é o limite da progressão: a progressão termina noúltimo valor antes de parada incremento (opcional) é o passo da progressão (default:1) Ex.:>>> range(3)[0, 1, 2]>>> range(2,5,2)[2, 4]>>> range(5,2,-2)[5, 3]

Comando for Permite iterar sobre os elementos de uma lista Forma geral: for var in lista : comandos Os comandos são repetidos para cada valor de lista

Durante a repetição, var possui o valor corrente da lista Uma grande utilidade da função range é construir alista de iteração Ex.:>>>for i in range(1,7): print i,1 2 3 4 5 6

Comparando listas Listas são comparadas lexicograficamente Se duas listas são iguais até os késimoselementos, oresultado da comparação depende da comparaçãoentre os (k+1)ésimoselementos Se alguma das listas tem somente k elementos, então esta é amenor Duas listas são iguais se e somente se têm o mesmocomprimento e todos os elementos de mesma posiçãosão iguais Uma lista é maior que um número mas menor queuma string Não me pergunte por quê!

>>> [1,2] < [2, 3]True>>> [1,2] < [1, 2, 3]True>>> [1,2] != [1,2]False>>> min([[1],[2,3],[3,4],[]])[]>>> max([[1],[2,3],[3,4],[]])[3, 4]>>> min(0,[],"")0 >>> max(0,[],"")''

Variáveis do tipo list Uma variável do tipo lista na verdade contém uma

Page 11: Python

referência para um valor do tipo lista Atribuir uma variável a outra, cria uma nova referênciamas não uma nova lista Para se criar um novo valor, podeseusar umaexpressão que retorne o valor desejado Para saber se duas variáveis se referem ao mesmovalor podeseusar o operador is

>>> a = b = [1,2,3]>>> c = a>>> d = c[:]>>> a is bTrue>>> c is bTrue>>> d is cFalse>>> a [1]=5>>> b[1, 5, 3]>>> d[1, 2, 3]

A Classe list Uma lista é na verdade um objeto de uma classe chamadalist Não vimos ainda programação OO, mas alguns pontosdevem ser enfatizados Listas possuem métodos que podem ser aplicados a elas Um método é semelhante a uma função, mas sãoinvocados de forma diferente: objeto.método(args) Ex.: lista.reverse() inverte a ordem dos elementosda lista Para saber todos os métodos de listas, escrevahelp(list)

Alguns métodos da classe list append(elemento) Acrescenta o elemento no fim da lista Observe que a operação altera a lista, e nãosimplesmente retorna uma lista modificada Ex.:>>> lista = [1,2]>>> lista.append(3)>>> lista[1, 2, 3]>>> lista.append([4,5])>>> lista[1, 2, 3, [4, 5]]

count(elemento) Retorna quantas vezes o elemento aparece na lista Ex.:>>> [1,2,3,1,2,3,4].count(1)2

extend(lista2) Acrescenta os elementos de lista2 ao final da lista OBS.: Altera a lista ao invés de retornar a lista alterada Ex.:>>> lista=[1,2]>>> lista.extend([3,4])>>> lista[1, 2, 3, 4]

index(elemento) Retorna o índice da primeira ocorrência de elemento nalista Um erro ocorre se elemento não consta da lista Ex.:>>> lista = [9,8,33,12]>>> lista.index(33)2>>> lista.index(7)Traceback (most recent call last):File "<pyshell#3>", line 1, in -toplevellista.index(7)ValueError: list.index(x): x not in list

insert(indice, elemento)

insere elemento na lista na posição indicada por índice Ex.:>>> lista = [0,1,2,3]>>> lista.insert(1,'dois')>>> lista[0, 'dois', 1, 2, 3]

Como o extend, altera a lista ao invés de retornar a lista O valor retornado é None! Atribuições a fatias servem para a mesma finalidademas são menos legíveis>>> lista = [0,1,2,3]>>> lista [1:1] = ['dois']>>> lista[0, 'dois', 1, 2, 3]

pop(índice) Remove da lista o elemento na posição índice e o retorna Se índice não for mencionado, é assumido o último Ex.:>>> lista = [1,2,3,4]>>> lista.pop()4>>> lista[1, 2, 3]>>> lista.pop(1)2>>> lista[1, 3]

remove(elemento) Remove da lista o primeiro elemento igual a elemento Se não existe tal elemento, um erro é gerado Ex.:>>> lista = ['oi', 'alo', 'ola']>>> lista.remove('alo')>>> lista['oi', 'ola']>>> lista.remove('oba')Traceback (most recent call last):File "<pyshell#24>", line 1, in -toplevellista.remove('oba')ValueError: list.remove(x): x not in list

reverse() Inverte a ordem dos elementos da lista Ex.:>>> lista=[1,2,3]

Page 12: Python

>>> lista.reverse()>>> lista[3, 2, 1]

sort(cmp=None, key=None, reverse=False) Ordena a lista Os argumentos são opcionais. Por default, a lista éordenada crescentemente Ex.:>>> lista = [9,8,7,1,4,2]>>> lista.sort()>>> lista[1, 2, 4, 7, 8, 9]

sort(cmp=None, key=None, reverse=False) É possível obter a ordem inversa, passando True para oargumento reverse Ex.:>>> lista = [9,8,7,1,4,2]>>> lista.sort(reverse=True)>>> lista[9, 8, 7, 4, 2, 1]

OBS.: A notação acima permite passar um argumento semespecificar os anteriores, mas poderíamos ter escrito:>>> lista = [9,8,7,1,4,2]>>> lista.sort(None,None,True)>>> lista[9, 8, 7, 4, 2, 1]

sort(cmp=None, key=None, reverse=False) O argumento cmp especifica uma função de comparação É uma função que o sort chama para definir se um elemento éanterior ou posterior a outro A função a ser passada tem a forma comp(elem1,elem2) e deveretornar um inteiro negativo caso elem1 seja anterior a elem2,

positivo caso elem2 seja anterior a elem1 e zero se tanto faz Ex.:>>> def compara(elem1,elem2):return elem1%10 - elem2%10>>> compara(100,22)-2>>> lista=[100,22,303,104]>>> lista.sort(compara)>>> lista[100, 22, 303, 104]

sort(cmp=None, key=None, reverse=False) O argumento key especifica uma função aplicada a cadaelemento Se for passada uma função f, em vez de ordenar os elementosbaseado em seus valores v, ordena baseado em f(v) Ex.:>>> lista = ['abc','de','fghi']>>> lista.sort(key=len)>>> lista['de', 'abc', 'fghi']

Matrizes Listas podem ser usadas para guardar matrizes Por exemplo, podemos criar uma matrizidentidadede3x3 com o código:m = []for i in range(3):m.append([0]*3)m[i][i]=1

Obs.: Não é boa idéia iniciar uma matriz assim:m = [[0]*3]*3for i in range(3): m[i][i]=1print m

Resultado:[[1, 1, 1], [1, 1, 1], [1, 1, 1]] (Por quê?)

Exercícios Escreva um programa que intercale os elementos deduas listas l1 e l2

Exemplo: para l1 = [1,2,3] e l2 =['a','b','c','d','e'], o programa devecomputar a lista [1,'a',2,'b',3,'c','d','e'] Escreva um programa para computar o produto deduas matrizes m1 e m2

Escreva um programa para computar o triângulo dePascal até a linha n, onde n é um valor inteiropositivo lido da linha de comando Lembreseque o elemento na iésimalinha e jésimacoluna do triângulo de Pascal contém o número decombinações de i elementos j a j O triângulo deve ser posto numa lista onde o iésimoelemento é uma lista com a iésimalinha do triângulo Ex:Quantas linhas? 7[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1], [1, 6, 15,20, 15, 6, 1]]Python:Tuplas e Strings

Tuplas São estruturas de dados parecidas com listas, mas com aparticularidade de serem imutáveis Tuplas são seqüências e, assim como listas, podem serindexadas e fatiadas, mas não é possível modificálas

Page 13: Python

Um valor do tipo tupla é uma série de valores separados porvírgulas e entre parênteses>>> x = (1,2,3)>>> x(1, 2, 3)>>> x [0]1>>> x [0]=1...TypeError: object does not support itemAssignment

Uma tupla vazia se escreve () Os parênteses são opcionais se não provocarem ambigüidade Uma tupla contendo apenas um elemento deve ser escrita comuma vírgula ao final Um valor entre parênteses sem vírgula no final é meramenteuma expressão:>>> (10)10>>> 10,(10,)>>> (10,)(10,)>>> 3*(10+3)39>>> 3*(10+3,)(13, 13, 13)

A função tuple Assim como a função list constrói uma lista a partirde uma seqüência qualquer, a função tuple constróiuma tupla a partir de uma seqüência qualquer>>> list("abcd")['a', 'b', 'c', 'd']>>> tuple("abcd")('a', 'b', 'c', 'd')>>> tuple([1,2,3])(1, 2, 3)>>> list((1,2,3))[1, 2, 3]

Quando usar tuplas Em geral, tuplas podem ser substituídas comvantagem por listas

Entretanto, algumas construções em Pythonrequerem tuplas ou seqüências imutáveis, porexemplo: Tuplas (ao contrário de listas) podem ser usadas comochaves de dicionários Funções com número variável de argumentos acessamos argumentos por meio de tuplas O operador de formatação aceita tuplas, mas não listas

O operador de formatação Strings suportam o operador % que, dada uma string especial(template) e um valor, produz uma string formatada O formato geral é template % valor O template é uma string entremeada por códigos de formatação Um código de formatação é em geral composto do caracter% seguido de uma letra descritiva do tipo do valor aformatar (s para string, f para float, d para inteiro, etc) Exemplo:>>> '====%d====' % 100'====100===='>>> '====%f====' % 1'====1.000000===='

Formatando tuplas Um template pode ser aplicado aos diversos valoresde uma tupla para construir uma string formatada Ex.:>>> template = "%s tem %d anos">>> tupla = ('Pedro', 10)

>>> template % tupla'Pedro tem 10 anos'

Obs: mais tarde veremos que o operador deformatação também pode ser aplicado a dicionários

Anatomia das especificações deformato Caracter % Flags de conversão (opcionais): indicaalinhamento à esquerda + indica que um sinal deve preceder o valor convertido “ ” (um branco) indica que um espaço deve preceder númerospositivos 0 indica preenchimento à esquerda com zeros Comprimento mínimo do campo (opcional) O valor formatado terá este comprimento no mínimo Se igual a * (asterisco), o comprimento será lido da tupla Um “.” (ponto) seguido pela precisão (opcional) Usado para converter as casas decimais de floats Se aplicado para strings, indica o comprimento máximo Se igual a *, o valor será lido da tupla Caracter indicador do tipo de formato

Tipos de formato d, i Número inteiro escrito em decimal o Número inteiro sem sinal escrito em octal

Page 14: Python

u Número inteiro sem sinal escrito em decimal x Número inteiro sem sinal escrito em hexadecimal (minúsculas) X Número inteiro sem sinal escrito em hexadecimal (maiúsculas) e Número de ponto flutuante escrito em notação científica ('e' minúsculo) E Número de ponto flutuante escrito em notação científica ('E' maiúsculo) f, F Número de ponto flutuante escrito em notação convencional g Mesmo que e se expoente é maior que 4.Caso contrario, igual a f G Mesmo que E se expoente é maior que 4.Caso contrario, igual a F c Caractere único (usado com inteiro ou string de tamanho 1) r String (entrada é qualquer objeto Python que é convertido usando afunção repr)

Exemplos>>> "Numero inteiro: %d" % 55'Numero inteiro: 55'>>> "Numero inteiro com 3 casas: %3d" % 55'Numero inteiro com 3 casas: 55'>>> "Inteiro com 3 casas e zeros a esquerda: %03d" % 55'Inteiro com 3 casas e zeros a esquerda: 055'>>> "Inteiro escrito em hexadecimal: %x" % 55'Inteiro escrito em hexadecimal: 37'>>> from math import pi>>> "Ponto flutuante: %f" % pi'Ponto flutuante: 3.141593'>>> "Ponto flutuante com 12 decimais: %.12f" % pi'Ponto flutuante com 12 decimais: 3.141592653590'>>> "Ponto flutuante com 10 caracteres: %10f" % pi'Ponto flutuante com 10 caracteres: 3.141593'>>> "Ponto flutuante em notacao cientifica: %10e" % pi'Ponto flutuante em notacao cientifica: 3.141593e+00'

>>> "String com tamanho maximo definido: %.3s" % "Pedro"'String com tamanho maximo definido: Ped'

Exemplo: Imprimindo uma tabelaitens = ["Abacate", "Limão", "Tangerina", "Melancia","Laranja da China"]precos = [2.13, 0.19, 1.95, 0.87, 12.00]len_precos = 10 # Coluna de precos tem 10 caracteres# Achar a largura da coluna de itenslen_itens = len(itens[0])for it in itens : len_itens = max(len_itens,len(it))# Imprimir tabela de precosprint "-"*(len_itens+len_precos)print "%-*s%*s" % (len_itens, "Item", len_precos,"Preço")print "-"*(len_itens+len_precos)for i in range(len(itens)):print "%-*s%*.2f" % (len_itens, itens[i],len_precos, precos[i])

Exemplo: resultados--------------------------Item Preço--------------------------Abacate 2.13Limão 0.19Tangerina 1.95Melancia 0.87Laranja da China 12.00

O Módulo String Manipulação de strings é uma atividade freqüenteem programas Python Existe um módulo chamado string que contémuma grande quantidade de funcionalidades paratrabalhar com strings Para usálas:from string import * Entretanto, strings pertencem à classe str e a maiorparte do que existe no módulo string aparece comométodos da classe str

Striings:: método fiind find (substring, inicio, fim)

Retorna o índice da primeira ocorrência de substring inicio e fim são opcionais e indicam os intervalos deíndices onde a busca será efetuada Os defaults são 0 e o comprimento da string, respectivamente Caso substring não apareça na string, é retornado 1 Observe que o operador in pode ser usado para dizerse uma substring aparece numa string

Strings: método find (exemplo)>>> s = "quem parte e reparte, fica com a maiorparte">>> s.find("parte")5>>> s.find("reparte")13>>> s.find("parcela")-1>>> "parte" in sTrue>>> s.find("parte",6)15>>> s.find("parte",6,12)-1

Striings:: método jjoiin join(seqüência) Retorna uma string com todos os elementos daseqüência concatenados Obs: Os elementos da seqüência têm que ser strings A string objeto é usada como separador entre oselementos Ex.:>>> "/".join(("usr","bin","python"))'usr/bin/python'>>> "Q".join((1,2,3,4,5))...TypeError: sequence item 0: expected string,int found>>> "Q".join(('1','2','3','4','5'))'1Q2Q3Q4Q5'

Page 15: Python

Strings: métodos lower e upper lower() Retorna a string com todos os caracteres maiúsculosconvertidos para minúsculos upper() Retorna a string com todos os caracteres minúsculosconvertidos para maiúsculos Ex.:>>> print "Esperança".upper()ESPERANÇA>>> print "Pé de Laranja Lima".lower()pé de laranja lima

Strings: método replace replace(velho,novo,n) Substitui as instâncias da substring velho por novo Se n for especificado, apenas n instâncias são trocadas Caso contrário, todas as instâncias são trocadas Ex.:>>> s = "quem parte e reparte, fica com a maiorparte">>> s.replace("parte","parcela")'quem parcela e reparcela, fica com a maiorparcela'>>> s.replace("parte","parcela",2)'quem parcela e reparcela, fica com a maiorparte'

Strings:: método split split(separador) Retorna uma lista com as substrings presentes entre cópiasda string separador Faz o contrário do método join Se separador não for especificado, é assumido seqüências decaracteres em branco, tabs ou newlines Ex.:>>> s = "xxx yyy zzz xxx yyy zzz"

>>> s.split()['xxx', 'yyy', 'zzz', 'xxx', 'yyy', 'zzz']>>> s.split('xxx')['', ' yyy zzz ', ' yyy zzz']

Strings: método strip strip(ch) Retorna a string sem caracteres iniciais ou finais que estejamna string ch Se ch não for especificada, retira caracteres em branco Podesetambém usar rstrip() para retirar caracteres àdireita (final) ou lstrip() para retirar caracteres à esquerda(início) Ex.:>>> " xxx afdsfa ".strip()'xxx afdsfa'>>> "xxx yyy zzz xxx".strip("xy ")'zzz'>>> " xxx ".rstrip()' xxx'

Strings: método translate translate(trans) Retorna uma cópia da string onde os caracteres sãosubstituídos de acordo com a tabela de tradução trans trans é uma string com 256 caracteres, um para cadapossível código de oito bits Ex.: se trans tem 'X' na posição 65 (correspondente ao caractereASCII 'A'), então, na string retornada, todos os caracteres 'A'terão sido substituídos por 'X' Na verdade, as tabelas de tradução são normalmenteconstruídas com a função maketrans do módulo

string

Função string..maketrans maketrans (velho, novo) retorna uma tabela de tradução onde os caracteres emvelho são substituídos pelos caracteres em novo Ex.:>>> from string import maketrans>>> trans = maketrans('qs', 'kz')>>> s = "que surpresa: quebrei a cara">>> s.translate(trans)'kue zurpreza: kuebrei a cara'

Python::Dicionários

Dicionários

São estruturas de dados que implementam mapeamentos Um mapeamento é uma coleção de associações entrepares de valores O primeiro elemento do par é chamado de chave e o outro deconteúdo De certa forma, um mapeamento é uma generalização daidéia de acessar dados por índices, exceto que nummapeamento os índices (ou chaves) podem ser dequalquer tipo imutável

Chaves vs.. Índices Considere que queiramos representar um caderno detelefones Uma solução é ter uma lista de nomes e outra de telefones

Page 16: Python

Telefone de nome[i] armazenado em telefone[i] Acrescentar “Joao” com telefone “20122232”:nome+= “Joao” telefone+=“20122232” Para encontrar o telefone de “Joao”:Tel = telefone[nome.index[“Joao”]] Dicionários tornam isso mais fácil e eficientetelefone[“Joao”] = “20122232”Tel = telefone[“Joao”]

Criando dicionários Uma constante do tipo dicionário é escrita{ chave1:conteúdo1, ... chaveN:conteúdoN} Uma variável do tipo dicionário pode ser “indexada” damaneira habitual, isto é, usando colchetes O conteúdo associado a uma chave pode ser alteradoatribuindoseàquela posição do dicionário Novos valores podem ser acrescentados a um dicionáriofazendo atribuição a uma chave ainda não definida Não há ordem definida entre os pares chave/conteúdo deum dicionário

Exemplo>>> dic = {"joao":100,"maria":150}>>> dic["joao"]100>>> dic["maria"]150>>> dic["pedro"] = 10>>> dic{'pedro': 10, 'joao': 100, 'maria': 150}

>>> dic = {'joao': 100, 'maria': 150, 'pedro':10}>>> dic{'pedro': 10, 'joao': 100, 'maria': 150}

Dicionários não têm ordem As chaves dos dicionários não são armazenadas emqualquer ordem específica Na verdade, dicionários são implementados por tabelas deespalhamento (Hash Tables) A falta de ordem é proposital Diferentemente de listas, atribuir a um elemento de umdicionário não requer que a posição exista previamenteX = []X [10] = 5 # ERRO!. . .Y = {}Y [10] = 5 # OK!

A função dict A função dict é usada para construir dicionários e requercomo parâmetros: Uma lista de tuplas, cada uma com um par chave/conteúdo,ou Uma seqüência de itens no formato chave=valor Nesse caso, as chaves têm que ser strings, mas são escritas semAspas

Exemplo>>> d = dict([(1,2),('chave','conteudo')])>>> d[1]2>>> d['chave']'conteudo'>>> d = dict(x=1,y=2)>>> d['x']

1>>> d = dict(1=2,3=4)SyntaxError: keyword can't be an expression

Formatando com Dicionários O operador de formatação quando aplicado a dicionáriosrequer que os valores das chaves apareçam entreparênteses antes do código de formatação O conteúdo armazenado no dicionário sob aquela chave ésubstituído na string de formatação Ex:>>> dic = { "Joao":"a", "Maria":"b" }>>> s = "%(Joao)s e %(Maria)s">>> s % dic'a e b'

Método clear clear() Remove todos os elementos do dicionário Ex.:>>> x = { "Joao":"a", "Maria":"b" }>>> y = x>>> x.clear()>>> print x,y{} {}

Diferente de atribuir {} à variável:>>> x = { "Joao":"a", "Maria":"b" }>>> y = x>>> x = {}>>> print x,y{} {'Joao': 'a', 'Maria': 'b'}

Método copy copy() Retorna um outro dicionário com os mesmos pareschave/conteúdo Observe que os conteúdos não são cópias, mas apenasreferências para os mesmos valores>>> x = {"Joao":[1,2], "Maria":[3,4]}>>> y = x.copy()>>> y ["Pedro"]=[5,6]>>> x ["Joao"] += [3]>>> print x{'Joao': [1, 2, 3], 'Maria': [3, 4]}>>> print y

Page 17: Python

{'Pedro': [5, 6], 'Joao': [1, 2, 3], 'Maria': [3, 4]}

Método fromkeys fromkeys(lista,valor) Retorna um novo dicionário cujas chaves são os elementosde lista e cujos valores são todos iguais a valor Se valor não for especificado, o default é None>>> {}.fromkeys([2,3]){2: None, 3: None}# Podemos usar o nome da classe ao invés# de um objeto:>>> dict.fromkeys(["Joao","Maria"],0){'Joao': 0, 'Maria': 0}

Método get get(chave,valor) Obtém o conteúdo de chave Não causa erro caso chave não exista: retorna valor Se valor não for especificado chaves inexistentes retornamNone Ex.:>>> dic = { "Joao":"a", "Maria":"b" }>>> dic.get("Pedro")>>> print dic.get("Pedro")None>>> print dic.get("Joao")a>>> print dic.get("Carlos","N/A")N/A

Método has_key has_key(chave) dic.has_key(chave) é o mesmo que chave in dic Ex.:>>> dic = { "Joao":"a", "Maria":"b" }>>> dic.has_key("Joao")True>>> dic.has_key("Pedro")False

Métodos items,, keys e values items() retorna uma lista com todos os pareschave/conteúdo do dicionário keys() retorna uma lista com todas as chaves do

dicionário values() retorna uma lista com todos os valores dodicionário Ex.:>>> dic.items()[('Joao', 'a'), ('Maria', 'b')]>>> dic.keys()['Joao', 'Maria']>>> dic.values()['a', 'b']

Método pop pop (chave) Obtém o valor correspondente a chave e remove o parchave/valor do dicionário Ex.:>>> d = {'x': 1, 'y': 2}>>> d.pop('x')1>>> d{'y': 2}

Método popitem popitem() Retorna e remove um par chave/valor aleatório dodicionário Pode ser usado para iterar sobre todos os elementos dodicionário Ex:>>> d{'url': 'http://www.python.org', 'spam': 0,'title': 'Python Web Site'}>>> d.popitem()('url', 'http://www.python.org')>>> d{'spam': 0, 'title': 'Python Web Site'}

Método update update(dic) Atualiza um dicionário com os elementos de outro Os itens em dic são adicionados um a um ao dicionáriooriginal É possível usar a mesma sintaxe da função dict paraespecificar dic Ex.:>>> x = {"a":1,"b":2,"c":3}

>>> y = {"z":9,"b":7}>>> x.update(y)>>> x{'a': 1, 'c': 3, 'b': 7, 'z': 9}>>> x.update(a=7,c="xxx")>>> x{'a': 7, 'c': 'xxx', 'b': 7, 'z': 9}

Python:Funções

Abstração É uma técnica de programação que nos permite pensarnum problema em diversos níveis A idéia é que quando estamos pensando num problemamacroscopicamente, não estamos preocupado comminúcias Dividir para conquistar: Um problema é dividido em diversos subproblemas As soluções dos subproblemassão combinadas numasolução do problema maior

Programação Estruturada É uma disciplina de programação que incorpora oprincípio de “Dividir para Conquistar” (Programação Orientada a Objetos é outra...) Programas são divididos em subprogramas Cada subprogramaé invocado por meio de umidentificador e uma lista de entradas Permite especificar como um problema pode ser resolvido emgeral

Page 18: Python

O mesmo subprogramapode ser invocado para resolverdiversos problemas de mesma natureza mas com valoresespecíficos diferentes Os resultados computados por um subprogramapodem sercombinados com os de outros subprogramas

Definindo funções Em Python, subprogramastêm o nome de funções Formato geral:def nome (arg, arg, ... arg):comando. . .comando Onde: nome é o nome da função args são especificações de argumentos da função Uma função pode ter 0, 1 ou mais argumentos comandos contêm as instruções a ser executadas quando afunção é invocada

Resultado de funções Uma função tipicamente computa um ou mais valores Para indicar o valor a ser devolvido como o resultado dafunção, usaseo comando return, que tem o formatoreturn expressão onde a expressão é opcional e designa o valor a ser retornado Ao encontrar o comando return, a função termina

imediatamente e o controle do programa volta ao pontoonde a função foi chamada Se uma função chega a seu fim sem nenhum valor deretorno ter sido especificado, o valor de retorno é None

Exemplo>>> def f():return>>> print f()None>>> def f():return "Oi">>> print f()Oi>>> def f(nome):return "Oi, "+nome+"!">>> print f("Joao")Oi, Joao!

Variáveis locais e globais Variáveis definidas em funções são locais, isto é, só podemser usadas nas funções em que foram definidas Variáveis definidas fora de funções são conhecidas comovariáveis globais É possível no código de uma função ler o conteúdo de umavariável global Para alterar uma variável global, ela precisa ser declaradano corpo da função usando o comando global

Exemplo>>> def f():print a>>> a = 1>>> f()1>>> def f():a = 5>>> f()>>> print a1>>> def f():global aa = 5>>> f()

>>> print a5

Argumentos de funções Argumentos (ou parâmetros) são como variáveis querecebem seus valores iniciais do chamador Essas variáveis, assim como outras definidas dentro dafunção são ditas locais, isto é, só existem no lugar ondeforam definidas Ao retornar ao ponto de chamada, as variáveis locais sãodescartadas Se uma função define n argumentos, a sua chamada deveincluir valores para todos eles Exceção: argumentos com valores default

Exemplo>>> def f(x):return x*x>>> print f(10)100>>> print x....NameError: name 'x' is not defined>>> print f()....TypeError: f() takes exactly 1 argument (0given)

Argumentos default É possível dar valores default a argumentos Se o chamador não especificar valores para essesargumentos, os defaults são usados Formato:def nome (arg1=default1, ..., argN=defaultN) Se apenas alguns argumentos têm default, esses devemser os últimos

Page 19: Python

Se não fosse assim, haveria ambigüidade na passagem deArgumentos

Exemplo>>> def f(nome,saudacao="Oi",pontuacao="!!"):return saudacao+","+nome+pontuacao>>> print f("Joao")Oi,Joao!!>>> print f("Joao","Parabens")Parabens,Joao!!>>> print f("Joao","Ah","...")Ah,Joao...

Exemplo>>> def f(nome,saudacao="Oi",pontuacao="!!"):return saudacao+","+nome+pontuacao>>> print f("Joao")Oi,Joao!!>>> print f("Joao","Parabens")Parabens,Joao!!>>> print f("Joao","Ah","...")Ah,Joao...

Passando argumentos com nomes É possível passar os argumentos sem empregar a ordemde definição desde que se nomeie cada valor passado como nome do argumento correspondente Ex.:>>> def f(nome,saudacao="Oi",pontuacao="!!"):return saudacao+","+nome+pontuacao>>> print f(saudacao="Valeu",nome="Joao")Valeu,Joao!! Alterando parâmetros É possível alterar parâmetros? Sim e não Como o parâmetro é uma variável local, ele pode seralterado sem problemas Entretanto, se um parâmetro recebe um valor que vem deuma variável global, esta não é alterada Ex.:>>> def f(x):x = 5

>>> a = 1>>> f (a)>>> print a

1 Note que quando passamos uma variável do tipo listacomo parâmetro, estamos passando uma referência paraum valor do tipo lista Nesse caso, alterar o parâmetro pode influenciar no “valor”da variável global Na verdade, o “valor” da variável do tipo lista é umareferência que não muda Este caso é idêntico a termos duas variáveis se referindo aomesmo valor

Exemplo>>> def f(x):x[:] = [5]>>> a = [1]>>> f(a)>>> a[5]>>> b = a>>> b[:] = [7]>>> a[7]

Documentando Funções Ao invés de usar comentários para descrever o que uma função, émais vantajoso usar docstrings Uma constante string escrita logo após o cabeçalho da função(comando def) Permite o acesso à documentação a partir do interpretador,usando a notação função . __doc__>>> def fat(n):... "Retorna o fatorial de n."... for i in range(n-1,1,-1): n*=i... return n...>>> fat(4)24>>> print fat.__doc__Retorna o fatorial de n.

Lista de parâmetros variável Se o último argumento de uma definição de funçãocomeça com * , os todos os valores passados a partirdaquele são postos numa tupla Ex.:>>> def imprime(nome,*atributos):... print nome,atributos...>>> imprime ('a',1,2,'b')a (1, 2, 'b')>>> def media(*valores):... total=0.0... for x in valores: total+=x... return total/len(valores)...>>> media(1,2,3,4)2.5

Lista de parâmetros variável (2) Se o último argumento de uma definição de funçãocomeça com ** , os todos os valores passados usandochaves a partir daquele são postos num dicionário Ex.:>>> def f(a,b,**c):print a, b, c>>> f(1,2,3)...TypeError: f() takes exactly 2 arguments (3 given)>>> f(1,2,x=3)1 2 {'x': 3}

Lista de parâmetros variável (3) É possível passar os valores de uma tupla para preencher parâmetrosposicionais de uma função bastando para isso precedêlade * Um dicionário podem ser usado para preencher parâmetros por chavebastando para isso precedêlode **

Page 20: Python

É preciso tomar cuidado para não abusar! Ex.:>>> def f(a,b,*c,**d):print a,b,c,d>>> f(*[1,2,3,4,5])1 2 (3, 4, 5) {}>>> f(**{"a":1,"b":2,"c":3,"d":4})1 2 () {'c': 3, 'd': 4}>>> f(1,2,3,**{"d":1})1 2 (3,) {'d': 1}>>> f(1,2,3,**{"a":1})...TypeError: f() got multiple values for keyword argument 'a'

Passando funções Nomes de funções podem ser manipulados como variáveis emesmo como argumentos de funções Para saber se um nome se refere a uma função, use opredicado callable() Ex.:>>> def f(g):return g(5)>>> def h(x):return x*x>>> f(h)25>>> m = h>>> callable(m)True>>> f(m)25

Escopo Escopo é o nome que se dá ao conjunto de nomes acessíveis deum determinado ponto de um programa Também é chamado de espaço de nomes ou namespace Um programa começa em um escopo (chamado escopo global)enquanto que cada função acrescenta um escopo próprio (local) Módulos e classes também definem escopos Ao se fazer acesso a um nome, todos os escopos, do mais

interno para o mais externo, são consultados. Isto explica por que definir uma variável numa função podefazer com que uma variável global deixe de ser acessível

Função vars() O dicionário obtido com a função vars() pode serusado para ter acesso a todas as variáveis definidas numescopo. Ex.:>>> vars(){'__builtins__': <module '__builtin__' (built-in)>,'__name__': '__main__', '__doc__': None}>>> def f():x = 1print vars()>>> vars(){'f': <function f at 0xb6e7f56c>, '__builtins__':<module '__builtin__' (built-in)>, '__name__':'__main__', '__doc__': None}>>> f(){'x': 1}

Funções definidas em funções Funções podem ser definidas dentro de funções Se uma função g é definida dentro de uma função f, elatem acesso ao seu próprio escopo (em primeiro lugar) etambém ao escopo de f Ex.:>>> def f(x):def g(y): return x*yreturn g(2)>>> print f(4)8

Funções definidas em funções (2) Observe que, se uma função g foi definida dentro de outrafunção f, então, se g é armazenada numa variável ou

transmitida para outra função ela carrega com si os valores doescopo de f (mas não o escopo global). Ex:>>> x = 2>>> def f(y):def g(z): return x*y*zreturn g>>> h = f(3)>>> print h(1)6>>> x = 3>>> print h(1)9

Python:Recursão

Recursão É um princípio muito poderoso para construção dealgoritmos A solução de um problema é dividido em Casos simples: São aqueles que podem ser resolvidos trivialmente Casos gerais: São aqueles que podem ser resolvidos compondo soluções decasos mais simples Semelhante à prova de teoremas por indução Casos simples: O teorema é verdadeiro trivialmente Casos genéricos: são provados assumindoseque todos oscasos mais simples também são verdadeiros Função recursiva Implementa um algoritmos recursivo onde a solução dos casosgenéricos requerem chamadas à própria função Uma função recursiva é a maneira mais direta (mas não

Page 21: Python

necessariamente a melhor) de se resolver problemas de naturezarecursiva ou para implementar estruturas de dados recursivas Considere, por exemplo, a definição da seqüência de Fibonacci: O primeiro e o segundo termo valem 0 e 1, respectivamente O iésimotermo é a soma do (i1)ésimoe o (i2)ésimotermo>>> def fib(i):if i==1: return 0elif i==2: return 1else: return fib(i-1)+fib(i-2)>>> for i in range(1,11):print fib(i),0 1 1 2 3 5 8 13 21 34

Exemplo: Busca binária Um exemplo clássico de recursão é o algoritmo conhecidocomo busca binária que é usado para pesquisar um valor emuma lista ordenada Chamemos de imin e imax os índices mínimo e máximo dalista onde a busca será feita Inicialmente, imin = 0 e imax = len(lista)-1 O caso base corresponde a imin == imax Então, ou o valor é igual a lista [imin] ou não está na lista Senão, podemos dividir o intervalo de busca em dois Seja meio = (imin+imax)/2 Se o valor é maior que lista [meio] , então ele se encontra em

algum dos índices entre meio+1 e imax Caso contrário, deve se encontrar em algum dos índicesentre e Busca binária: implementaçãodef testa(lista,valor):def busca_binaria(imin,imax):if imin==imax: return iminelse:meio=(imax+imin)/2if valor>lista[meio]:return busca_binaria(meio+1,imax)else:return busca_binaria(imin,meio)i = busca_binaria(0,len(lista)-1)if lista[i]==valor:print valor,"encontrado na posicao",ielse:print valor,"nao encontrado">>> testa([1,2,5,6,9,12],3)3 nao encontrado>>> testa([1,2,5,6,9,12],5)5 encontrado na posicao 2 Recursão iinfiiniita Assim como nos casos dos laços de repetição, é preciso cuidadopara não escrever funções infinitamente recursivas Ex.:def recursiva(x):if f(x): return Trueelse: return recursiva(x) Uma função recursiva tem que Tratar todos os casos básicos Usar recursão apenas para tratar casos garantidamente maissimples do que o caso corrente Ex.:def recursiva(x):if f(x): return Trueelif x==0: return Falseelse: return recursiva(x-1) Eficiência de funções recursivas Quando uma função é chamada, um pouco de memória éusado para guardar o ponto de retorno, os argumentos evariáveis locais

Assim, soluções iterativas são normalmente maiseficientes do que soluções recursivas equivalentes Isto não quer dizer que soluções iterativas sempre sejampreferíveis a soluções recursivas Se o problema é recursivo por natureza, uma soluçãorecursiva é mais clara, mais fácil de programar e,freqüentemente, mais eficiente Pensando recursivamente Ao invés de pensar construtivamente para para obter umasolução, às vezes é mais simples pensar em termos deuma prova indutiva Considere o problema de testar se uma lista a é umapermutação da lista b Caso básico: a é uma lista vazia Então a é permutação de b se b também é uma lista vazia Caso básico: a[0] não aparece em b Então a não é uma permutação de b Caso genérico: a[0] aparece em b na posição i Então a é permutação de b se a[1:] é uma permutação de b doqual foi removido o elemento na posição i Exemplo: Testa permutaçõesdef e_permutacao(a,b):"""Retorna True sse a lista a é umapermutação da lista b"""if len(a) == 0 : return len(b)==0

Page 22: Python

if a[0] in b:i = b.index(a[0])return e_permutacao(a[1:],b[0:i]+b[i+1:])return False>>> e_permutacao([1,2,3],[3,2,1])True>>> e_permutacao([1,2,3],[3,3,1])False>>> e_permutacao([1,2,3],[1,1,2,3])False>>> e_permutacao([1,1,2,3],[1,2,3])False Estruturas de dados recursivas Há estruturas de dados que são inerentemente recursivas, jáque sua própria definição é recursiva Por exemplo, uma lista pode ser definida recursivamente: [] é uma lista (vazia) Se A é uma lista e x é um valor, então A+[x] é uma lista comx como seu último elemento Esta é uma definição construtiva, que pode ser usada paraescrever funções que criam listas Uma outra definição que pode ser usada para analisar listas é: Se L é uma lista, então: L == [] , ou seja, L é uma lista vazia, ou x = L.pop() torna L uma lista sem seu último elemento x Esta definição não é tão útil em Python já que o comandopermite iterar facilmente sobre os elementos Exemplo: Subseqüênciiadef e_subseq(a,b):""" Retorna True sse a é subseqüência de b,isto é, se todos os elementos a[0..n-1] de aaparecem em b[j(0)], b[j(1)]... b[j(n-1)]onde j(i)<j(i+1) """if a == []:# Lista vazia é subseqüência de qq lista

return Trueif a[0] not in b:return Falsereturn e_subseq (a[1:],

b[b.index(a[0])+1:]) Encontrando a recorrência Alguns problemas não se apresentam naturalmente comorecursivos, mas pensar recursivamente provê a solução Tome o problema de computar todas as permutações deuma lista Assumamos que sabemos computar todas as permutaçõesde uma lista sem seu primeiro elemento x Seja perm uma dessas permutações Então, a solução do global contém todas as listas obtidasinserindo x em todas as possíveis posições de perm Exemplo: computar todas as permutações de uma listadef permutacoes(lista):""" Dada uma lista, retorna uma lista de listas,onde cada elemento é uma permutação da listaoriginal """if len(lista) == 1: # Caso basereturn [lista]primeiro = lista[0]resto = lista [1:]resultado = []for perm in permutacoes(resto):for i in range(len(perm)+1):resultado += \[perm[:i]+[primeiro]+perm[i:]]return resultado Torres de Hanói Jogo que é um exemplo clássicode problema recursivo Consiste de um tabuleiro com 3pinos no qual são encaixadosdiscos de tamanho decrescente A idéia é mover os discos de um

pino para outro sendo que: Só um disco é movimentadopor vez Um disco maior nunca podeser posto sobre um menor

Torres de Hanói: Algoritmo A solução é simples se supusermos existir um algoritmocapaz de mover todos os discos menos um do pino deorigem para o pino sobressalente O algoritmo completo para mover n discos do pino deorigem A para o pino de destino B usando o pinosobressalente C é Se n é 1, então a solução é trivial Caso contrário, Usaseo algoritmo para mover n1discos de A para C usandoB como sobressalente Moveseo disco restante de A para B Usaseo algoritmo para mover n1discos de C para B usandoA como sobressalente Torres de Hanói: Implementaçãodef hanoi(n,origem,destino,temp):

Page 23: Python

if n>1: hanoi(n-1,origem,temp,destino)mover(origem,destino)if n>1: hanoi(n-1,temp,destino,origem)def mover(origem,destino):print “Mover de“, origem, “para”,\“destino”

Com um pouco mais de trabalho, podemos redefinir afunção mover para que ela nos dê uma representação“gráfica” do movimento dos discos

Torres de Hanói: Exemplo