Aula 18
1 Exception
try: ---- ---- XXX ---- except: ---- ----
Um erro/exception em XXX interrompe o bloco e executa o except
1.1 exceptions
- NameError nome nao definido, variavel sem valor
- TypeError
- KeyError chave não existe no dicionario
- IndexError index numa lisra
- MemoryError nao consegue alocar memoria
lista de exceptions predefinidas
user defined exceptions
1.2 outras versoes de try/except
Diferentes tratamentos para diferentes exceptions
try: --- except TypeError: --- except (KeyError,IndexError): --- except: ---
try: ---- except: ---- else: --- so executa se nao houve exception
try: ---- except A: ---- finally: --- sempre executa mesmo que tenha exceptions que nao foram pegas
1.3 outros
Como levantar uma exception raise
Como definir sua propria exception
https://docs.python.org/3/tutorial/errors.html
Commando pass
try:
----
----
except:
pass
Dicionarios
try: dic[x]+=1 except: dic[x]=1
em vez de
if x in dic: dic[x]+=1 else: dic[x]=1
2 Funcoes
def func(a,b,linha):
''' descricao
descricao'''
----
----
----
return c
2.1 return
return expressaoreturn a,b- tuplareturn Nonepermite que a funçao seja chamada como procedimento/comando
def f(x):
----
return None
f(4)
2.2 default arguments
def askok(prompt, retries=4, reminder='Please try again!'): ----
prompt é obrigatorio
askok('Do you really want to quit?')askok('Do you really want to quit?',2)askok('Do you really want to quit?',2,'Sim ou nao')
Cuidado: o default so é avaliado uma vez
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(10))
print(f(30))
2.3 Chamando a funcao
askok('Do you really want to quit?',2,'Sim ou nao')
ou chamada por nome
- askok('Do you really want to quit?',remainder = 'Sim ou nao')
- askok('Do you really want to quit?',retries = 2)
- askok(retries = 2,prompt = 'Do you really want to quit?')
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
2.4 numero qq de argumentos
def somatoria(*lista):
soma=0.0
for x in lista:
soma+=x
return soma
3 Variaveis locais e globais
Não ha declaracao de variaveis entao vc nao sabe so vendo se uma variavel é local ou global
Uma variavel é em principio local se a função atribui um valor a ela
x=0 y=10 def f(): x=100 print(x+1) print(y+1) f() print(x)
x é local na funçao, y é global
ATENCAO: Modificar uma variavel mutavel nao é atribuir um valor a ela
l={'a':1,'b':2,'c':3}
def ff():
l['x']=44
ff()
print(l)
3.1 global
a declaraçao global indica que a variavel sera global
x=0 def f(): global x x=100 print(x+1) print(y+1) f() x
4 Funcoes internas a outras funcoes
def fora(x):
----
def dentro(y):
---
z = x+y
return z
---
x é local a fora mas é "global" para dentro O mais correto é
dizer que x é não local para dentro
4.1 nonlocal
def fora(x):
z=10
def dentro(y):
z = x+y
z é local a dentro
def fora(x):
z=10
def dentro(y):
nonlocal z
z = x+y
z é o z de fora (mas z não é global).
z=100
def fora(x):
z=10
def dentro(y):
global z
z = x+y
5 funcoes que retornam funcoes
def gg():
def aux(l):
l.reverse()
return l
return aux
potencialmente inutil mas sera a base dos decorators
5.1 closures
def gera():
x=0
def aux():
nonlocal x
x +=1
print(x)
return aux
x é uma variavel loca de gera e nao local de aux mas que se
mantem viva por todo o programa
- escopo é a regiao do programa que pode acessar uma variavel pelo seu nome
- extensão é o duraçao temporal de uma variavel
- para variaveis locais a estensao é a duracao do escopo, a não ser que a variavel seja um clousure.
6 Exercicios
- criar uma lista com apenas os valores pares de outra lista
- criar uma lista com os valores nas posicoes pares
- criar um dicionario com a contagem de cada elemento numa lista
- qual é a chave associada ao maior valore num dicionario
- qual o elemento mais comum numa lista
- uma lista é sublista de outra?
- dado 2 strings o fim de um é igual ao comeco do outro? (do projeto de prolog)