Aula 19

Python online

Python Tutorial

Standard library

Exception

try:
   ----
   ---- AAA
   ----
except:
   ----
   ----

Um erro/exception em AAA interrompe o bloco e executa o except

exceptions

lista de exceptions predefinidas

user defined exceptions

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

outros

Como levantar uma exception: raise

Como definir sua propria exception

https://docs.python.org/3/tutorial/errors.html

Commando pass

try:
    ----
    ----
except:
    pass

Dicionários

try:
   dic[x]+=1
except:
   dic[x]=1

em vez de

if x in dic: 
   dic[x]+=1
else:
   dic[x]=1

pilha de execução

Exceções vão interrompendo a execução dos contextos (funções - pilha de execução) até que um except capture a exceção

O ambiente iterativo ou o ambiente em batch capturam todas as exceções que chegam neles - no ambiente em batch o programa é terminado. No iterativo so a pilha de execução é interrompida.

Funções

def func(a,b,linha):
    ''' descricao 
       descricao'''
    ----
    ----
    ----
    return c

return

def f(x):
    ----
    return None

f(4)

default arguments

def askok(prompt, retries=4, reminder='Please try again!'):
  ----

prompt é obrigatório

Cuidado: o default so é avaliado uma vez (quando??)

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(10))
print(f(30))

Chamando a função

ou chamada por nome

http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

numero qq de argumentos

def somatoria(*lista):
    soma=0.0
    for x in lista:
       soma+=x
    return soma

Variaveis locais e globais

Não há declaracao de variáveis entao vc não sabe só 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 não é atribuir um valor a ela

l={'a':1,'b':2,'c':3}
def ff():
  l['x']=44  # l é global


ff()
print(l)

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

Funcoes internas a outras funções

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

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

funções que retornam funções

def gg():

    def aux(l):
      l.reverse()
      return l

    return aux

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 não local de aux mas que se mantem viva por todo o programa