Escolar Documentos
Profissional Documentos
Cultura Documentos
>>> a
O operador or retorna o >>> chr (99)
'c'
'abcde' primeiro operando se for >>> ord ('a')
>>> a[0:2]
'ab'
vista como verdadeiro, caso 97
“valor”
Exemplo Lista de parâmetros variável
da variável global
>>> def (2)
f(nome,saudacao="Oi",pontuacao="!!"): Na verdade, o “valor” da
return saudacao+","+nome+pontuacao Se o último argumento de
variável do tipo lista é uma
>>> print f("Joao") uma definição de função
Oi,Joao!! referência que não muda
>>> print f("Joao","Parabens") começa com ** , os todos os
Este caso é idêntico a
Parabens,Joao!! valores passados usando
>>> print f("Joao","Ah","...") termos duas variáveis se
Ah,Joao... chaves a partir daquele são
referindo ao
postos num dicionário
Exemplo mesmo valor
Ex.:
>>> def >>> def f(a,b,**c):
f(nome,saudacao="Oi",pontuacao="!!"): Exemplo print a, b, c
return saudacao+","+nome+pontuacao >>> def f(x): >>> f(1,2,3)
>>> print f("Joao") x[:] = [5] ...
Oi,Joao!! >>> a = [1] TypeError: f() takes exactly 2 arguments (3
>>> print f("Joao","Parabens") >>> f(a) given)
Parabens,Joao!! >>> a >>> f(1,2,x=3)
>>> print f("Joao","Ah","...") [5] 1 2 {'x': 3}
Ah,Joao... >>> b = a
>>> b[:] = [7]
Lista de parâmetros variável
Passando argumentos com >>> a
[7] (3)
nomes
É possível passar os valores
É possível passar os Documentando Funções de uma tupla para preencher
argumentos sem empregar a Ao invés de usar parâmetros
ordem comentários para descrever o posicionais de uma função
de definição desde que se que uma função, é bastando para isso precedêla
nomeie cada valor passado mais vantajoso usar docstrings de *
com Uma constante string escrita Um dicionário podem ser
o nome do argumento logo após o cabeçalho da usado para preencher
correspondente função parâmetros por chave
Ex.: (comando def)
>>> def bastando para isso precedêlo
f(nome,saudacao="Oi",pontuacao="!!"): Permite o acesso à de **
return saudacao+","+nome+pontuacao documentação a partir do É preciso tomar cuidado
>>> print f(saudacao="Valeu",nome="Joao")
Valeu,Joao!! interpretador, para não abusar!
Alterando parâmetros usando a notação função . Ex.:
É possível alterar __doc__ >>> def f(a,b,*c,**d):
>>> def fat(n): print a,b,c,d
parâmetros? ... "Retorna o fatorial de n." >>> f(*[1,2,3,4,5])
Sim e não ... for i in range(n-1,1,-1): n*=i 1 2 (3, 4, 5) {}
... return n >>> f(**{"a":1,"b":2,"c":3,"d":4})
Como o parâmetro é uma ... 1 2 () {'c': 3, 'd': 4}
variável local, ele pode ser >>> fat(4) >>> f(1,2,3,**{"d":1})
24 1 2 (3,) {'d': 1}
alterado sem problemas >>> print fat.__doc__ >>> f(1,2,3,**{"a":1})
Entretanto, se um parâmetro Retorna o fatorial de n. ...
TypeError: f() got multiple values for keyword
recebe um valor que vem de argument 'a'
Lista de parâmetros variável
Passando funções x=1 Semelhante à prova de
print vars()
Nomes de funções podem >>> vars() teoremas por indução
ser manipulados como {'f': <function f at 0xb6e7f56c>, '__builtins__': Casos simples: O teorema é
<module '__builtin__' (built-in)>, '__name__':
variáveis e '__main__', '__doc__': None} verdadeiro trivialmente
mesmo como argumentos de >>> f() Casos genéricos: são
{'x': 1}
funções provados assumindose
Para saber se um nome se Funções definidas em que todos os
refere a uma função, use o funções casos mais simples também
predicado callable() Funções podem ser são verdadeiros
Ex.: definidas dentro de funções Função recursiva
>>> def f(g): Implementa um algoritmos
return g(5) Se uma função g é definida
>>> def h(x): dentro de uma função f, ela recursivo onde a solução dos
return x*x casos
>>> f(h) tem acesso ao seu próprio
25 escopo (em primeiro lugar) e genéricos requerem chamadas
>>> m = h à própria função
>>> callable(m) também ao escopo de f
True Ex.: Uma função recursiva é a
>>> f(m) >>> def f(x): maneira mais direta (mas não
25 def g(y): return x*y
return g(2) necessariamente a melhor) de
Escopo >>> print f(4) se resolver problemas de
8
Escopo é o nome que se dá natureza
ao conjunto de nomes Funções definidas em recursiva ou para implementar
acessíveis de funções (2) estruturas de dados recursivas
um determinado ponto de um Observe que, se uma função Considere, por exemplo, a
programa g foi definida dentro de outra definição da seqüência de
Também é chamado de função f, então, se g é Fibonacci:
espaço de nomes ou armazenada numa variável ou O primeiro e o segundo
namespace transmitida para outra função termo valem 0 e 1,
Um programa começa em ela carrega com si os valores respectivamente
um escopo (chamado escopo do O iésimo
global) escopo de f (mas não o escopo termo é a soma do (i1)
enquanto que cada função global). Ex: ésimo
acrescenta um escopo próprio >>> x = 2 e o (i2)
>>> def f(y):
(local) def g(z): return x*y*z
ésimo
Módulos e classes também return g termo
>>> h = f(3) >>> def fib(i):
definem escopos >>> print h(1) if i==1: return 0
Ao se fazer acesso a um 6 elif i==2: return 1
>>> x = 3 else: return fib(i-1)+fib(i-2)
nome, todos os escopos, do >>> print h(1) >>> for i in range(1,11):
mais 9 print fib(i),
0 1 1 2 3 5 8 13 21 34
interno para o mais externo,
são consultados. Python:
Recursão Exemplo: Busca binária
Isto explica por que definir Um exemplo clássico de
uma variável numa função recursão é o algoritmo
Recursão
pode conhecido
É um princípio muito
fazer com que uma variável como busca binária que é
poderoso para construção de
global deixe de ser acessível algoritmos usado para pesquisar um valor
A solução de um problema é em
Função vars() uma lista ordenada
dividido em
O dicionário obtido com a Chamemos de imin e imax
Casos simples:
função vars() pode ser os índices mínimo e máximo
São aqueles que podem ser
usado para ter acesso a todas da
resolvidos trivialmente
as variáveis definidas num lista onde a busca será feita
Casos gerais:
escopo. Ex.: Inicialmente, imin = 0 e
>>> vars() São aqueles que podem ser
{'__builtins__': <module '__builtin__' (built- resolvidos compondo soluções imax = len(lista)-1
in)>,
'__name__': '__main__', '__doc__': None} de O caso base corresponde a
>>> def f(): casos mais simples imin == imax
Então, ou o valor é igual a usado para guardar o ponto de Estruturas de dados
lista [imin] ou não está na lista retorno, os argumentos e recursivas
Senão, podemos dividir o variáveis locais Há estruturas de dados que
intervalo de busca em dois Assim, soluções iterativas são inerentemente recursivas,
Seja meio = (imin+imax)/2 são normalmente mais já
Se o valor é maior que lista eficientes do que soluções que sua própria definição é
[meio] , então ele se encontra recursivas equivalentes recursiva
em Isto não quer dizer que Por exemplo, uma lista pode
algum dos índices entre soluções iterativas sempre ser definida recursivamente:
meio+1 e imax sejam [] é uma lista (vazia)
Caso contrário, deve se preferíveis a soluções Se A é uma lista e x é um
encontrar em algum dos recursivas valor, então A+[x] é uma lista
índices Se o problema é recursivo com
entre e por natureza, uma solução x como seu último elemento
Busca binária: recursiva é mais clara, mais Esta é uma definição
implementação fácil de programar e, construtiva, que pode ser usada
def testa(lista,valor): freqüentemente, mais eficiente para
def busca_binaria(imin,imax):
if imin==imax: return imin Pensando recursivamente escrever funções que criam
else: Ao invés de pensar listas
meio=(imax+imin)/2
if valor>lista[meio]: construtivamente para para Uma outra definição que
return busca_binaria(meio+1,imax) obter uma pode ser usada para analisar
else:
return busca_binaria(imin,meio) solução, às vezes é mais listas é:
i = busca_binaria(0,len(lista)-1) simples pensar em termos de Se L é uma lista, então:
if lista[i]==valor:
print valor,"encontrado na posicao",i uma prova indutiva L == [] , ou seja, L é uma
else: Considere o problema de lista vazia, ou
print valor,"nao encontrado"
>>> testa([1,2,5,6,9,12],3) testar se uma lista a é uma x = L.pop() torna L uma
3 nao encontrado permutação da lista b lista sem seu último elemento
>>> testa([1,2,5,6,9,12],5)
Recursão
5 encontrado na posicao 2
Caso básico: a é uma lista x
iinfiiniita vazia Esta definição não é tão útil
Assim como nos casos dos Então a é permutação de b em Python já que o comando
laços de repetição, é preciso se b também é uma lista vazia permite iterar facilmente sobre
cuidado Caso básico: a[0] não os elementos Exemplo:
para não escrever funções aparece em b Subseqüênciia
Então a não é uma def e_subseq(a,b):
infinitamente recursivas """ Retorna True sse a é subseqüência de b,
Ex.: permutação de b isto é, se todos os elementos a[0..n-1] de a
Caso genérico: a[0] aparece aparecem em b[j(0)], b[j(1)]... b[j(n-1)]
def recursiva(x): onde j(i)<j(i+1) """
if f(x): return True em b na posição i if a == []:
Então a é permutação de b # Lista vazia é subseqüência de qq lista
else: return recursiva(x) return True
Uma função recursiva tem se a[1:] é uma permutação de if a[0] not in b:
b do return False
que return e_subseq (a[1:], b[b.index(a[0])+1:])
Tratar todos os casos qual foi removido o elemento Encontrando a recorrência
básicos na posição i Exemplo: Testa Alguns problemas não se
Usar recursão apenas para permutações apresentam naturalmente como
def e_permutacao(a,b):
tratar casos garantidamente """ recursivos, mas pensar
mais Retorna True sse a lista a é uma recursivamente provê a
permutação da lista b
simples do que o caso corrente """ solução
Ex.: if len(a) == 0 : return len(b)==0 Tome o problema de
if a[0] in b:
def recursiva(x): computar todas as permutações
i = b.index(a[0])
if f(x): return True
return e_permutacao(a[1:],b[0:i]+b[i+1:]) de
elif x==0: return False
return False
else: return recursiva(x-1) uma lista
>>> e_permutacao([1,2,3],[3,2,1])
Eficiência de funções True Assumamos que sabemos
recursivas >>> e_permutacao([1,2,3],[3,3,1])
False computar todas as permutações
Quando uma função é >>> e_permutacao([1,2,3],[1,1,2,3]) de uma lista sem seu primeiro
chamada, um pouco de False
>>> e_permutacao([1,1,2,3],[1,2,3]) elemento x
memória é False
Seja perm uma dessas Se n é 1, então a solução é
permutações trivial
Então, a solução do global Caso contrário,
contém todas as listas obtidas Usase
inserindo x em todas as o algoritmo para mover n1
possíveis posições de perm discos de A para C usando
Exemplo: computar todas as B como sobressalente
permutações de uma lista Movese
def permutacoes(lista): o disco restante de A para B
""" Dada uma lista, retorna uma lista de listas,
onde cada elemento é uma permutação da lista Usase
original """ o algoritmo para mover n1
if len(lista) == 1: # Caso base
return [lista] discos de C para B usando
primeiro = lista[0] A como sobressalente Torres
resto = lista [1:]
resultado = [] de Hanói: Implementação
for perm in permutacoes(resto): def hanoi(n,origem,destino,temp):
for i in range(len(perm)+1): if n>1: hanoi(n-1,origem,temp,destino)
resultado += \ mover(origem,destino)
[perm[:i]+[primeiro]+perm[i:]] if n>1: hanoi(n-1,temp,destino,origem)
return resultado def mover(origem,destino):
Torres de Hanói print “Mover de“, origem, “para”,\
“destino”
Jogo que é um exemplo Com um pouco mais de
clássico trabalho, podemos redefinir a
de problema recursivo função mover para que ela nos
Consiste de um tabuleiro dê uma representação
com 3 “gráfica” do movimento dos
pinos no qual são encaixados
discos
discos de tamanho decrescente
A idéia é mover os discos de Torres de Hanói: Exemplo
um
pino para outro sendo que:
Só um disco é movimentado
por vez
Um disco maior nunca pode
ser posto sobre um menor