35
Computadores e Programa¸c˜ ao Engenharia F´ ısica Engenharia Biom´ edica 2008–2009 2 o semestre Helmut Wolters, Jorge Landeck, Miguel Oliveira [email protected] 2009-04-01 H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa¸ ao 2009-04-01 1 / 35

Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Computadores e ProgramacaoEngenharia Fısica

Engenharia Biomedica2008–2009 2o semestre

Helmut Wolters, Jorge Landeck, Miguel Oliveira

[email protected]

2009-04-01

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 1 / 35

Page 2: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Definicao

As funcoes em Python sao de certa forma semelhantes as funcoes dalinguagem C e as funcoes/procedimentos do Pascal.Sintaxe:

def nome([arg_1,arg_2,...,arg_n]):<statements>return [value_1,value_2,...value_n]

Notas:

a instrucao def cria um objecto do tipo funcao e atribui-lhe um nomereturn devolve o(s) resultado(s) para a instrucao que chamou a funcaopara chamar uma funcao, depois de criado este objecto, basta invoca-lapelo seu nome.

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 2 / 35

Page 3: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Utilidade

Reutilizacao do codigo

Decomposicao de uma tarefa complexa numa serie de tarefas maissimples

Facilita a leitura e futuras modificacoes do programa

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 3 / 35

Page 4: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Exemplos

Exemplo 1:

>>> def produto(x,y):>>> return x*y>>>>>> print produto(2,3)>>> 6>>> z = 2>>> y = produto(9,z)>>> print y>>> 18>>> frase = ’aa’>>> z = produto(frase,2)>>> print z>>> ’aaaa’

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 4 / 35

Page 5: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Exemplos

Exemplo 2:

>>> def intersect(seq1,seq2):>>> res = []>>> for x in seq1:>>> if x in seq2:>>> res.append(x)>>> return res>>>>>> intersect([1,2,3],[1,7,2])>>> [1,2]

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 5 / 35

Page 6: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Documentacao

As funcoes definidas em Python podem conter texto de ajuda edocumentacao.Sintaxe:

def nome([arg_1,arg_2,...,arg_n]):’Texto de ajuda e documentac~ao.’<statements>return [value_1,value_2,...value_n]

A ajuda pode ser obtida com o comando:

>>>help(nome)

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 6 / 35

Page 7: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Documentacao

Este comando pode ainda ser usado para obter ajuda sobre as funcoespre-definidas do Python:

>>>import math>>>help(math.sqrt)Help on built-in function sqrt in module math:

sqrt(...)sqrt(x)

Return the square root of x.

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 7 / 35

Page 8: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: passagem de parametros

A passagem de argumentos e feita por referencia, ou seja poratribuicao de um nome no espaco de nomes local da funcao. Istosignifica que objectos imutaveis nao podem ser alterados dentro deuma funcao (nem fora dela), mas os objectos mutaveis (ex. listas,dicionarios) sim.

Por exemplo com a funcao:

def try_to_change(n):n=’A’

obter-se-a:

>>>name=’B’>>>try_to_change(name)>>>name’B’

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 8 / 35

Page 9: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: passagem de parametros

Ja com a funcao:

def change(n):n[0]=’A’

obter-se-a:

>>>name=[’B’,’C’]>>>change(name)>>>name[’A’,’C’]

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 9 / 35

Page 10: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Tipos de parametros

Parametros posicionais

Parametros chave-valor

Parametros chave-valor e valores por omissao

Listas arbitarias de parametros

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 10 / 35

Page 11: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Parametros posicionais

Todos os exemplos que vimos ate agora sao de parametros do tipoposicional.

A ordem pela qual estes parametros sao dados a funcao e importante.Com a funcao:

def operation(x,y,z):return x/y+z

teremos por certo que operation(x,y,z) e em geral diferente deoperation(y,x,z).

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 11 / 35

Page 12: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Parametros tipo chave-valor

Suponha a funcao:

def hello(greeting,name)print greeting+", "+name+"!"

Usando parametros do tipo posicional pode-se normalmente chamaresta funcao como:

>>> hello(’Hello’,’world’)Hello, world!

Pode contudo ser importante designar o nome das variaveis:

>>> hello(greeting=’Hello’,name=’world’)Hello, world!

Dizemos que estamos a usar uma chamada com parametros do tipochave-valor.

Neste caso a ordem nao interessa:

>>> hello(name=’world’,greeting=’Hello’)Hello, world!

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 12 / 35

Page 13: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Parametros chave-valor e valores por omissao

O tipo de parametros chave-valor pode tambem ser usado nadefinicao das funcoes para especificar valores que o parametro podetomar se o utilizador nao o utilizar (valores por omissao). Exemplo:

def add_tax(x,iva=20):... """Adds the IVA tax (given as percent)... to value x.... """... return x*(1+iva/100.)...print add_tax(100)120.0print add_tax(100,5)105.0print add_tax(100,iva=7)107.0

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 13 / 35

Page 14: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Parametros chave-valor e valores por omissao

Quando omitido, o argumento iva toma o valor por omissao (20%).O exemplo ilustra ainda a possibilidade de chamar explicitamente pornome um argumento da funcao, o que ajuda, por vezes, a legibilidadedo programa. Chama-se a atencao para o seguinte: na chamada deuma funcao, a seguir a um argumento dado explicitamente por nome,todos os outros argumentos que lhe seguem tambem terao que serdados da mesma forma, pelo que a seguinte chamada da funcao eilegal:

print add_tax(buy=200,5)SyntaxError: non-keyword arg after keyword arg

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 14 / 35

Page 15: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Parametros chave-valor e valores por omissao

E ainda de notar que a resolucao dos nomes dados por omissao nadefinicao de uma funcao so e avaliada uma vez, precisamente quandoa funcao e definida, e nao quando a funcao e chamada; este detalhepode dar origem a erros subtis!

taxa = 20def add_tax(x,iva=taxa):... return x*(1+iva/100.)...print add_tax(100)120.0taxa = 21print add_tax(100)120.0

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 15 / 35

Page 16: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Parametros chave-valor e valores por omissao

Um outro resultado inesperado:

def save(x,L=[]):... L.append(x)... print Lsave(1)[1]save(2)[1, 2]L =[’a’,’b’]save(3,L)[’a’, ’b’, 3]save(3)[1, 2, 3]

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 16 / 35

Page 17: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Listas arbitrarias de parametros

E por vezes desejavel escrever funcoes que possam aceitar um numerovariavel de argumentos. Para o efeito, os sımbolos *args e **keywutilizados como argumentos de uma funcao (na sua definicao ouchamada) significam um numero arbitrario de argumentos posicionais(*args) e de argumentos com valor por defeito (**keyw). Noprimeiro caso args e uma tupla que contem os argumentosposicionais e no segundo keyw um dicionario contendo os argumentose os valores por omissao.

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 17 / 35

Page 18: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Listas arbitrarias de parametros

def union(*args):res = []for seq in args:

for x in seq:if not x in res:

res.append(x)return res

a = [1,2,3]; b =[2,7,8]; c =[0,3]print union(a,b,c)[1, 2, 3, 7, 8, 0]L = [a,b,c]print union(*L)[1, 2, 3, 7, 8, 0]

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 18 / 35

Page 19: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

A resolucao dos nomes no interior de uma funcao segue a seguinteregra: em primeiro lugar e procurado o nome no espaco dos nomeslocal da funcao, isto e os nomes que foram atribuıdos a objectos nointerior da funcao atraves de uma instrucao de atribuicao, ou usandoas instrucoes def ou class. Se o nome nao foi encontrado,pesquisa-se de seguida o espaco dos nomes global, isto e, os nomesdefinidos no modulo principal. Caso o nome tambem nao exista nesteespaco, passa-se a pesquisar no espaco dos nomes pre-definidos(built-in). Se o nome nao for encontrado a este nıvel e levantada umaexcepcao “NameError: name is not defined.”

Este regra simples pode ser relembrada com a mnemonica LGB(Local, Global, Built-in).

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 19 / 35

Page 20: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

A instrucao de atribuicao no interior de uma funcao cria um nome noespaco dos nomes local, pelo que efectuar uma atribuicao a umavariavel do modulo principal no interior de uma funcao nao tem oefeito esperado!

z = 22def addanumber(x):z = x

addanumber(1)print z22

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 20 / 35

Page 21: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

Quando se pretende “alterar” um nome do espaco global e necessariodeclara-lo como global no interior da funcao da seguinte forma:

z = 22def addanumber(x):global zz = z + x

addanumber(1)print z23

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 21 / 35

Page 22: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

Deve-se evitar, sempre que possıvel a alteracao de variaveis globais nointerior de funcoes. De uma forma mais elegante, o programa anteriorseria escrito assim:

z = 22def addanumber(x):return z + x

z = addanumber(1)print z23

Agora a alteracao do valor da variavel z e delegado para o programaprincipal, de forma explıcita. Trata-se de uma funcao segura, semefeitos laterais.

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 22 / 35

Page 23: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

Nao e necessario utilizar a declaracao global para podermos acederao valor de z no interior da funcao. Seguindo a regra LGB o nome econsiderado como global. Uma vez que nao lhe e atribuıdo um valorno interior da funcao, z nao existe no espaco de nomes local dafuncao!

Por outro lado, a atribuicao de um nome a um objecto no interior deuma funcao transforma o nome em local, a menos que ele sejaexplicitamente declarado global. Isto e assim mesmo que o nomeexista ja no espaco global (nomes identicos podem existir em espacosdiferentes, mas nao tem qualquer relacao entre si).

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 23 / 35

Page 24: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

Vejamos o que acontece na primeira versao do programa se omitirmosa declaracao global. . .

z = 22def addanumber(x):z = z + x

addanumber(1)UnboundLocalError: local variable ‘z’referenced before assignement.

A instrucao de erro e bem explıcita. Seguindo a regra LGB, z e umavariavel local e nao tem nada a ver com a outra variavel homonimadefinida no programa principal. . .

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 24 / 35

Page 25: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

Nota: A resolucao dos nomes locais e feita estaticamente, quando da“pre-compilacao” do codigo e nao quando o programa corre. Istoexplica a seguinte situacao, que costuma surpreender os “novatos”:

x = 99def prt():

print ‘‘The value of x is’’,x

prt()The value of x is 99

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 25 / 35

Page 26: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

O programa funciona. Mas se lhe acrescentarmos uma linha, deixa defuncionar. . .

x = 99def prt():

print ‘‘The value of x is’’,xx = 88

prt()UnboundLocalError: local variable ‘x’

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 26 / 35

Page 27: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Resolucao de nomes: regra de alcance

E obvio que se mudarmos a ordem das linhas o programa volta afuncionar. . .

x = 99def prt():

x = 88print ‘‘The value of x is’’,x

prt()The value of x is 88

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 27 / 35

Page 28: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Devolucao de parametros

A instrucao de retorno “return” pode devolver qulaquer tipo que oPython reconheca e em qualquer numero.

Pode por exemplo nao devolver nada. Nesta situacao a funcaoexecuta uma tarefa mas nao retorna nada. Por exemplo:

def test():print "This is a test"return

e um destes casos. Pode ate omitir-se a instrucao “return”.

Nota: em Python todas as funcoes devolvem pelo menos um valor.No caso de nao existir return ou quando se evoca return semreferencia a um objecto, o objecto devolvido pela funcao e None.Normalmente, este objecto e simplesmente ignorado quando se chamaa funcao.

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 28 / 35

Page 29: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Devolucao de parametros

E tambem perfeitamente legıtimo em Python que uma funcaodevolva mais de um objecto. Os objectos que se pretende devolverenumeram-se na instrucao return e sao devolvidos empacotadosnuma tupla.

def multiples(x)return x,2*x,3*x,4*x

multiples(3)(3,6,9,12)

Para desempacotar os objectos devolvidos utiliza-se a seguinte forma:

x,y,z,t = multiples(3)print x,y,z,t3 6 9 12

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 29 / 35

Page 30: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Devolucao de parametros

A devolucao de valores multiplos e muito util. Por exemplo, facamosuma funcao para trocar os valores de duas variaveis. Uma versaonao-pitonica nao funciona!

def swap(x,y)temp = xx = yy = temp

x = 2; y = 3swap(x,y)print x,y2 3

Consegue explicar porque e que este swap nao funciona?

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 30 / 35

Page 31: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Devolucao de parametros

Felizmente, o problema tem uma solucao simples:

def swap(x,y)return y,x

x = 2; y = 3x,y = swap(x,y)print x,y3 2

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 31 / 35

Page 32: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Devolucao de parametros

Na realidade, embora seja um bom exemplo da devolucao de valoresmultiplos, a funcao swap e inutil porque em Python a troca de duasvariaveis pode fazer-se muito simplesmente numa unica linha!

x = 2; y = 3print x,y2 3x,y = y,xprint x,y3 2

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 32 / 35

Page 33: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Recursao

Em Python, tal como na maioria das linguagens de programacaomodernas, as funcoes podem ser definidas de forma recursiva (i.e.,que incluem na propria definicao referencias a propria funcao.

Por exemplo, a seguinte funcao calcula n! de forma recursiva.

def fact(n):... if n == 1:... return 1... else:... return n*fact(n-1)...fact(3)6

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 33 / 35

Page 34: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Recursao

A sequencia de passos que o programa efectua quando executa estafuncao e o seguinte:

fact(3) -> 3*fact(2) (reserva memoria no stack)fact(2) -> 2*fact(1) (reserva memoria no stack)fact(1) -> 1volta para tras:fact(2) <- 2*1fact(3) <- 3*2*1 = 6

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 34 / 35

Page 35: Computadores e Programa˘c~ao · H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programa˘c~ao 2009-04-01 1 / 35 Fun˘c~oes: De ni˘c~ao As fun˘c~oes em Python s~ao de

Funcoes: Recursao

A definicao de funcoes de forma recursiva e expressiva, mas a suaexecucao (em termos de tempo de calculo e, nalguns casos, de gastode memoria intermedia — stack) pode ser dispendiosa. Ha contudoalgoritmos que podem ser expressos de forma muita simplesrecursivamente e que, expressos de outra forma sao muitocomplicados. Ha tambem muitos casos em que o tempo de execucaoda forma recursiva de uma funcao nao lhe e desfavoravel. . .

H.Wolters, J.Landeck, M.Oliveira (aula 5) Computadores e Programacao 2009-04-01 35 / 35