Aula 20

Python online

Python Tutorial

Standard library

1 Exercicio 10

Implemente um iterator que recebe um iterator e retorna os elementos sem repetições do mesmo elemento em sequencia.

iterator:  a a a b b a c a b b b d ...

saida:     a b a c a b d ...

2 pacotes/modulos

Pacotes pre definidos

import math

math.sin(3.14)
from math import sin,cos

sin(3.14)
import math as ma

ma.sin(3.14)

Veja o link para o standard library

  • math - funcoes matematicas
  • random - geracao de numeros aleatorios
  • re - expressoes regulares
  • os.path - diretorios e arquivos
  • sys e os - interface com o sistema operacional
  • collections - typos de dados para collections
  • itertools - iterators
  • functools - programacao funcional
  • operator - operadores como funcao
  • pickle - salva e le objetos ython
  • concurrent.futures - processamento em paralelo
  • urllib - acesso ao http
  • time - informacoes temporais

Pacotes externos - requer instalacao pip ou conda

  • numpy - arrays
  • pandas - data frames (tabelas)
  • scipy - operacoes scientificas e estatisticas
  • scikip-learn - aprendizado de maquina
  • beautifulsoup - processar paginas html
  • cherrypy - web server

3 Programacao funcional

3.1 funcoes anonimas

lambda mas a funcao so pode ter 1 linha

lambda x : x > 0 

3.2 map, filter

map(lambda x : x+3, [4,5,6,7])

filter(lambda x: x>0, [4,-5,6,-7])

3.3 fold (reduce)

foldl:

from functools import reduce

reduce(combinacao, lista, inicial)

3.4 funcoes que recebem funcoes como um argumento extra

key: uma funçao que é aplicada em cada elemento e cujo valor é usa

max( iteratable, key=func)
list.sort(key=func)
sorted( iteratable, key=func)
max(lista,key=func)
=
max([(func(x),x) for x in lista][1]

Solucoes p/ o exercicio passado - retorna o item mais frequente

usando dicionarios - linear

max(set(l),key=l.count) - entre linear e quadratico

max([(l.count(x),x) for x in l])[1] - quadratico
  

3.5 operator

x[i] ou x['çhave'] ou x.chave podem ser convertidos em funcoes

  • itemgetter - f = itemgetter(2) entao f(x) retorna x[2]
  • f = itemgetter(2,3,5) entao f(x) retorna (x[2],x[3],x[5])
  • getitem - getitem(x,2) é o mesmo que x[2]
  • setitem - setitem(x,2,"aaa") é o mesmo que =x[2] = "aaa"
  • itemgetter retorna uma funcao, getitem faz o mesmo que o operador mas com sintaxe de chamada de funcao.
  • attrgetter - f = attrgetter("chave") entao f(x) retorna =x.chave

itemgetter é util para o key

4 Decorators

Forma de modificar o comportamento (externo) de classes e funcoes.

  • funcoes que se lembram de execucoes passadas
  • funcoes que fazem logs
  • sao funcoes que recebem funcoes como argumentos e retornam uma outra funcao (que cuida dessa parte externa)
def llog(f):
   def wrapper(*args): 
      print("entrada:",args)
      x = f(*args)
      print("saida:",x)
      return x
   return wrapper

def aux(x,y):
   return 2*x+y
      
zz = llog(aux)

4.1 notacao @

aux = llog(aux)

@llog
def aux(x,y):
   return 2*x+y

4.2 Decorators com estado - decorators como objetos

Voce pode retornar um objeto. se o objeto for chamado como funcao, o metodo __call__ desse objeto sera executado

class decconta:
   def __init__(self,f):
      self.f=f
      self.conta=0
   def __call__(self,*args):
      self.conta += 1
      return self.f(*args)

xx=decconta(aux)

4.3 mais info

5 Exercicios

  • decorator para imprimir o tempo de execucao
  • decorator para construir um string com linhas para a hora e argumentos e saida de cada chamada da funcao. O string sera acessado via atributo
  • decorator para memoizar a funcao. Memoizacao é criar um dicionario que se lembra dos valores de entrada e de saida da funcao ja executado. Se um desses valores de entrada for re-executado, a funcao nao sera re-executada - ela apenas retorna o valor de saida memoizado
  • decorator para log argumentos e horario num arquivo (append no arquivo) dado como argumento do decorator (ver o primer on decorators)