Aula 18
1 Exception
try: ---- ---- AAA ---- except: ---- ----
Um erro/exception em AAA 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 lista
- 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 expressao
return a,b
- tuplareturn None
permite 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
Onde a variavel é atribuida não é importante
x=0 y=10 def f(): print(x+1) print(y+1) if False: x=100 % nunca é executado! f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in f UnboundLocalError: local variable 'x' referenced before assignment
ATENCAO: Modificar uma variavel mutavel nao é atribuir um valor a ela
l={'a':1,'b':2,'c':3} def ff(): l['x']=44 # l é global 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 a = gera() a() a() x
x
é uma variavel local 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.