Funções
O que é uma função ?
“Sinónimo” de rotina, procedimento
- Funções intrínsecas do Python ( print () , input ()… )
- Funções intrínsecas dos módulos Python
- Funções definidas pelo utilizador
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 1
Funções
Forma de fornecer input e receber output.
Se existir um bloco de código que se repete
varias vezes ao longo de um programa pode-
se definir uma função e chamar essa função
quantas vezes as necessárias.
As funções tornam-se fundamentais quando temos muitas
linhas de código.
Nota: Nem todas as funções fornecem output.
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 2
Funções
Definir uma função
def func():
# código que corre sempre que se chama a função
print("Isto é um teste")
Para chamar a função ao longo do código é usar o
nome definido
ATENÇÃO:
func()
O Python depende da indentação (espaço
em branco no início de uma linha) para
definir o âmbito do código.
Na linha anterior à indentação :
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 3
Funções
As regras básicas para denominar uma função são
semelhantes às variáveis.
def multiplica():
a =2
b=3
return a*b
ATENÇÃO:
Antes de chamar uma função tem de estar definida.
As variáveis dentro de funções são variáveis locais e antes de
correr a função não estão definidas.
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 4
Funções / Exemplo
Criar um programa para mostrar o seguinte texto no
ecrã.
**********
ISEL
**********
ISEL
**********
Clássico
print ("***********")
print (" ISEL ")
print ("***********")
print (" ISEL ")
print ("***********")
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 5
Funções / Exemplo
Mas desta vez usar funções.
Funções
def a():
print ("**********")
def b():
print (" ISEL ")
a()
b()
a()
b()
a()
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 6
Funções
Os parâmetros são as variáveis listadas entre parênteses na
definição da função. Eles atuam como marcadores de posição para
os valores que serão usados na função.
Por exemplo, na função abaixo, x e y são parâmetros:
def soma(x, y):
return x+y
Os argumentos são os valores reais fornecidos (e recebidos pela
função) quando a função é chamada.
Por exemplo se se chamar a função soma com os números 2 e 3, 2
e 3 são os argumentos.
Resultado = soma (2,3)
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 7
Funções
Definir uma função com parâmetros
Os parâmetros são colocados entre parêntesis e podem ser um ou
mais.
def func2(n1, n2):
print(n1 + n2)
Para chamar a função com argumentos ao longo do código será
func2(4, 5) 9
Uma vez definida a função podemos utilizar outros argumentos
func2(10, 2) 12
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 8
Funções
Quando se define a função
def func3(n1, n2):
return n1 + n2
É possível utilizar os argumentos pela ordem que são utilizados,
resultado = func3(5, 4)
ou então usar outra sintaxe e em que se nomeia expressamente as
variáveis.
resultado = func3(n2=4, n1=5)
print(resultado)
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 9
Funções
Pode-se também definir um valor padrão para os parâmetros na
função.
def teste(cidade = “Lisboa”):
print (“Eu sou de” , cidade)
teste()
Eu sou de Lisboa
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 10
Funções
Com funções podemos ter dois tipos de resultados:
- Realizar uma tarefa
def func3(n1, n2):
print (n1 * n2)
- Retornar um resultado
def func3(n1, n2):
return (n1 * n2)
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 11
Funções
Definir uma função com return
def func3(n1, n2):
return n1 + n2
Executando a função func3(4, 5) a resposta será nula porque o
valor de return é guardado em memória mas não mostrado.
Para mostrar o valor teria de se atribuir uma variável ao retorno e
depois mostrar.
resultado = func3(4, 5)
print (resultado)
A vantagem desta abordagem é permitir outras operações com esta
mesma variável.
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 12
Funções
De uma função resulta sempre um resultado, mesmo que não
exista output direto:
def soma(): def teste(): def teste2(): def teste3():
a=2 return (431) return True return “1234”
b=3
return a+b Resultado Resultado Resultado sting
número inteiro booleano True “1234”
Resultado numérico 431
de uma equação
def teste4 (): def teste5 ():
return None ou print (“Numero”) mesmo que seja
um resultado nulo
Resultado Nulo Resultado Nulo,
usando return Realiza tarefa mas não
guarda em memória
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 13
Funções
Variáveis Locais e Globais:
nome = "Maria"
idade = 32
def sauda():
idade += 1
return "Parabens " + nome + ", a tua idade e " + str(idade)
sauda() UnboundLocalError: local variable 'idade' referenced before assignment
Escopo/âmbito (Scope) - é a área na qual uma variável é definida, acedida e
reescrita. As variáveis podem ser locais ou globais.
Por padrão, todas as variáveis definidas dentro de uma função são locais - não
se podem aceder fora da função. E como o escopo dentro da função é
diferente do global, é mesmo possível usar o mesmo nome para duas variáveis
diferentes se uma for global e outra local (não é contudo uma prática
aconselhável).
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 14
Funções
Variáveis Locais e Globais:
Para corrigir teria de se declarar a variável idade como uma variável global
nome = "Maria"
idade = 32
def sauda():
global idade
idade += 1
return "Parabens " + nome + ", a tua idade e " + str(idade)
sauda()
A variável nome não causa um erro porque apenas se está a aceder ao seu valor
dentro da função sauda, não a modificando. Quando se acede a uma variável dentro
de uma função, o Python primeiro procura essa variável dentro do escopo da função.
Se não encontrar a variável, procurará no âmbito global.
Como se está a usar a variável nome dentro da função sem modificá-la, o Python não
gera um erro. No entanto, com a variável idade, está modificar-se o seu valor dentro
da função, o que requer que se declare explicitamente como uma variável global
usando a palavra-chave global.
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 15
Funções
Variáveis Locais e Globais:
Usar variáveis globais é geralmente uma má prática e deve-se
evitar, pois torna o propósito de suas funções menos óbvio e
pode-se acabar com um código 'espaguete'. Uma melhor maneira
de fazer é passar a idade variável como um dos argumentos da
função (exemplo abaixo)
def sauda(nome, idade):
idade += 1
return "Parabens " + nome + ", a tua idade e " + str(idade)
sauda(“Maria“, 32)
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 16
Funções anónimas : Lambda
As funções lambda são funções anónimas definidas usando a
palavra chave lambda.
A sintaxe geral de uma função lambda é:
lambda argumentos: expressão
As funções Lambda são usadas quando precisamos de uma função
para um curto período de tempo e principalmente em combinação
com outras funções
Exemplo: f = lambda x : x + 10
print (f(5))
15
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 17
Funções anónimas : Lambda
•Vantagens: As funções Lambda são usadas para reduzir a
quantidade de código e simplificar a leitura.
•Desvantagens: Como as funções Lambda são limitadas a uma
única expressão, elas são menos poderosas do que as funções
regulares.
Outros exemplos:
b = lambda x, y: x * y f = lambda x: 'par' if x % 2 == 0 else 'ímpar'
print(b(5, 3)) print(f(7))
15 ímpar
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes 18
Recursividade
A recursividade é o processo de
repetição de um objeto/processo de
forma similar ao que já foi mostrado.
Na prática em programação a
recursividade serve para reduzir um
problema à sua forma mais simplificada.
Do ponto de vista do algoritmo é uma
técnica em que uma função se chama a si
própria.
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 19
Recursividade
Como o objetivo é não ter uma recursão
infinita deverão existir cláusulas:
- 1 ou mais elementos de base (que fecham
a recursão)
- 1 elemento de recursão que permite obter
elementos a partir de outros elementos
Uma das forma de entender a recursividade é compará-la com um
ciclo iterativo.
Nos sides seguintes mostra-se a abordagem iterativa e uso do
conceito de recursividade
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 20
Iteração - for
Programação iterativa (for) não recursiva
def factor(n): n ! = n * (n-1) * (n-2) * (n-3) * …. * 1
resultado=1
for i in range (1, n+1): Iteração
resultado=resultado * i Valor corrente da computação
return resultado
Exemplo: factor(3) O range cria uma sequência de inteiros 1, 2, 3
i=1 i=2 i=3
resultado=1*1 = 1 resultado=1* 2 = 2 resultado=2* 3 = 6
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 21
Iteração - while
Programação iterativa (while) não recursiva
def factor(n): n ! = n * (n-1) * (n-2) * (n-3) * …. * 1
resultado=1
while n >= 1: Iteração
resultado=resultado * n Valor corrente da computação
n=n-1 Valor corrente da
variável de iteração
return resultado
Exemplo: factor(3)
n n
n=3 resultado =1 * 3 = 3 resultado =3 * 2 = 6
3 >= 1 2 >= 1
resultado=1 n = 3 - 1 =2 n=2-1=1
n n
resultado =6 * 1 = 6 0 >= 1
1 >= 1
n=1-1=0
X
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 22
Recursividade
Programação recursiva n ! = a * (n-1) * (n-2) * (n-3) * …. * 1
= a * (n-1) * (n-2) * (n-3) * …. * 1
- elemento de recursão que simplifica o (n-1)!
problema a uma versão mais simples. O
caso recursivo é onde a função se = n * ( n -1)!
chama
Redução recursiva
- elemento base - é a condição que n= 0 , resultado = 1
permite que a recursão pare.
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 23
Recursividade
Programação recursiva
def factor(n):
if n==0:
return 1 Caso base
else:
Caso recursivo
return n * factor(n-1)
Exemplo: factor(3)
Fase desenrolar
factor(3) =3 * factor(2) =2 * factor(1) =1 * factor(0) =1
Fase enrolar
6 factor(3) =3 * 2 factor(2) =2 * 1 factor(1) =1 * 1 factor(0) =1
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 24
Recursividade exemplo
Programação recursiva
aplicada à sequência de
Fibonacci:
1,1,2,3,5, ………
1 n<=1
fib(n)
fib(n-1)+fib(n-2) n>2
def fib(n):
if n<=1:
return n n = int(input(“Numero ?”))
else: for i in range(n):
return fib(n-1) + fib(n-2) print(fib(i))
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 25
Recursividade exemplo
Programação recursiva aplicada a strings (verificar se uma frase
é uma capicua ou palíndromo):
def cap(res):
if len(res)<=1:
return True
elif res[0]==res[-1]:
return cap(res[1:-1])
else:
return False
frase="A torre da derrota"
frase=frase.lower()
res=""
for letra in frase:
if letra in "abcdefghijklmnopqrstuvxyz":
res=res + letra
cap(res)
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 26
Erros
Um erro é um problema num programa que impede o programa de
concluir sua tarefa. Uma das classificações para os erros:
• Erros de sintaxe: Erros que ocorrem quando o código não está
escrito de acordo com a gramática do Python.
(Exemplos: Esquecer de fechar aspas, esquecer dois pontos no final de uma declaração
de uma função, etc.)
• Exceções: Erros que ocorrem quando o código é executado e não
pode ser concluído.
(Exemplos: TypeError, uma operação é aplicada ao tipo de objeto errado, ValueError
ocorre quando uma função recebe um argumento do tipo certo, mas valor inapropriado)
Existem diferentes tipos de erros em Python, incluindo TypeError,
ValueError, NameError, FileNotFoundError, e muitos outros.
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Erros
AssertionError A função assert falhou StopIteration A função next() indica que não há mais
AttributeError A atribuição a uma referência falha. nenhum item a ser devolvido pelo
EOFError A função input() atingiu a condição eof. iterador.
FloatingPointError Uma operação de ponto flutuante SyntaxError Um erro de sintaxe é encontrado.
falhou. IndentationError Uma indentação incorreta.
GeneratorExit O gerador do método close() é invocado TabError A indentação consiste em tabs e
ImportError O módulo importado não é encontrado espaços inconsistentes
IndexError O índice de uma sequencia está fora do SystemError O interpretador deteta um erro interno.
intervalo. SystemExit Criado pela função sys.exit()
KeyError Uma chave não é encontrada num TypeError Uma função ou operação é aplicada a
dicionário. um objeto de tipo incorreto.
KeyboardInterrupt O utilizador prime uma tecla de UnboundLocalError Uma referência é feita a uma variável
interrupção (Ctrl+c ou delete). local em uma função ou método, mas
MemoryError Uma operação fica sem memória. nenhum valor foi ligado a essa variável.
NameError Uma variável não se encontra no âmbito UnicodeError Ocorreu um erro de codificação ou
local ou global. descodificação relacionado com o
NotImplementedError Criado por métodos abstratos. Unicode.
OSError Uma operação do sistema causa um erro UnicodeEncodeError Ocorreu um erro relacionado com o
relacionado com o sistema. Unicode durante a codificação.
OverflowError O resultado de uma operação aritmética UnicodeDecodeError Ocorreu um erro relacionado com o
é demasiado grande para ser Unicode durante a descodificação
representado. UnicodeTranslateError Ocorreu um erro relacionado com o
ReferenceError Erro de referência no acesso ao gestor de Unicode durante a tradução.
memória (garbage collected referent). ValueError Uma função obtém um argumento de
RuntimeError Um erro que não se enquadra em tipo correto mas de valor impróprio.
qualquer outra categoria. ZeroDivisionError O segundo operador de uma operação
de divisão ou módulo é zero.
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Erros
A razão mais comum de um erros em Python são erros de
sintaxe. O Python reporta geralmente o local e a razão do erro.
a=33
b=200
if b>a:
print "b maior que a"
----------------------------------------------
File "<ipython-input-4-41a8a2c99232>", line 4
print "b maior que a"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("b maior que a")?
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Erros
A linguagem tenta identificar qual o linha do erro, Mas por vezes o
erro situa-se na linha imediatamente anterior à identificada.
x=5
if x < 6:
File "<ipython-input-131-8d6cf11a36d0>", line 4
print ("Isto é teste" print("Isto é teste2")
print("Isto é teste2") ^ SyntaxError: invalid syntax
Neste exemplo faltam os parêntesis
outras vezes na linha especificada.
----------------------------------------------
NameError Traceback (most recent call last)
a=33 <ipython-input-3-7b7e146feb0a> in <module>
b=200 2 b=200
if b>a: 3 if b>a:
----> 4 printa("b maior que a")
printa("b maior que a") NameError: name 'printa' is not defined
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Erros - raise
A função raise em Python é usada para criar exceções e personalizar
as mesmas.
n=-5
if n < 0:
raise ValueError("O número não é positivo")
else:
print(n) Neste exemplo, estamos executando uma exceção/erro
ValueError com a mensagem “O número não é positivo ”.
------------------------------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Input In [10], in <cell line: 2>()
1n=-5
2 if n < 0:
----> 3 raise ValueError("O número não é positivo")
4 else:
5 print(n)
ValueError: O número não é positivo
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Erros
É possível lidar com os erros identificando-os e criando mecanismos
de gestão dos mesmos.
try :
Instruções que durante a execução podem causar erros
except:
Instruções que se executam sempre que ocorre um erro
na execução do bloco try correspondentes
else:
Instruções que se executam quando não ocorrem erros na
execução do bloco try correspondente
finally:
Instruções que se executam sempre que ocorram ou não
erros durante a execução do bloco try correspondente
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Erros
O try/except são usados para capturar e lidar com erros. O código
que pode gerar o erro é colocado dentro do bloco try e o código que
manipula a erro é escrito no bloco except. x=0
try:
y=1/x
except ZeroDivisionError:
y=0
print (y)
Podemos ter vários blocos erros para lidar com diferentes tipos
de erros. try:
# código que pode lançar vários erros
except ValueError:
# lidar com ValueError
except TypeError:
# lidar com TypeError
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Erros
A função else num bloco try/except permite definir um bloco de
código a ser executado se nenhum erro for lançada..
try:
# código que pode lançar um erro
except ValueError:
# lidar com ValueError
else:
# código a ser executado se nenhum erro for lançado
A função finally permite definir um bloco de código a ser executado
sempre, independentemente de um erro ter sido lançado ou não.
try:
# código que pode lançar um erro
except ValueError:
# lidar com ValueError
finally:
# código a ser executado sempre, independentemente de um erro ter sido lançado ou não
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Erros - Exemplo
a=5 Se
b=0 a=5
b = “b”
try:
c=(a/b) a, b tem de ser numeros
Se Isto aparece sempre
except ZeroDivisionError:
print("Divisão por zero, b tem de ser
diferente de 0") a=5
b=2
except TypeError:
print("a, b tem de ser numeros")
2.5
else:
print(c) Isto aparece sempre
finally:
print("Isto aparece sempre")
Divisão por zero, b tem de ser diferente de 0
Isto aparece sempre
Licenciatura em Engenharia Biomédica Programação, Nelson Nunes
Controlo fluxos
break, continue e pass são palavras-chave em Python usadas para
alterar o fluxo de loops e blocos de código com base em condições
específicas.
break: interrompe a execução do loop ou da instrução condicional.
continue: salta para a próxima iteração do loop.
pass: indica um bloco de código vazio
break - se quiser sair de um loop completamente,
continue - se quiser saltar uma iteração específica do loop
pass - se quiser um espaço reservado para código que será escrito
no futuro.
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 36
Controlo fluxos - break
A declaração break é usada para interromper a
execução de um loop ou de uma instrução condicional.
Interrompe a execução do loop mais interno e transfere
a execução para a próxima instrução após o loop.
for x in range(50):
print (x)
if x==5: 0
break 1
2
3
4
5
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 37
Controlo fluxos - break
A declaração break pode ser usada para sair de loops
infinitos.
i=5 lista = []
a=0 while True:
while i ==5: nome=input(“Nome:”)
print ('Loop infinito') if nome=="stop":
a=input("Escreva stop para parar !!!") break
if a=="stop": else:
break lista.append(nome)
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 38
Controlo - continue
Há situação em que não queremos interromper um ciclo
mas apenas retomá-lo em certos casos . Podemos por
separar um ciclo em duas partes usando o comando
continue. Esta função é usada para saltar a iteração atual
do loop e continuar com a próxima iteração.
for i in range(10): 0
if i == 5 or i==2: 1
continue 3
print(i) 4
6
7
8
9
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 39
Controlo - pass
Certas instruções não podem estar vazias, mas se, por
algum motivo, existir uma instrução sem conteúdo,
pode-se colocar a instrução pass para evitar obter um
erro. É usada como um espaço reservado quando a
sintaxe requer algum código, mas não se quer que
nada aconteça.
a = 33
b = 200
if b > a:
pass
Licenciatura em Engenharia Biomédica, ISEL Programação , Nelson Nunes 40