expressões idiomáticas do python

27
Expressões idiomáticas do Python @xima

Upload: filipe-ximenes

Post on 09-Jul-2015

262 views

Category:

Software


0 download

DESCRIPTION

O que são expressões idiomáticas, por que elas são importantes quando estamos programando em Python e 10 exemplos.

TRANSCRIPT

Page 1: Expressões idiomáticas do python

Expressões idiomáticas do Python

@xima

Page 2: Expressões idiomáticas do python

Estes slides são uma tradução de outra apresentação.Os slides originais não são de minha autoria e estão disponíveis no link:http://safehammad.com/downloads/python-idioms-2014-01-16.pdf

Page 3: Expressões idiomáticas do python

"Características gramaticais, sintáticas e estruturais de uma determinada linguagem"

"Uma forma comumente utilizada e entendida de expressar um fato, ideia ou intenção"

O que são expressões idiomáticas?

Page 4: Expressões idiomáticas do python

Por que se importar com expressões idiomáticas?

"Programas devem ser escritos para pessoas lerem, e apenas incidentalmente para máquinas executarem"- Abelson & Sussman, SICP"Deve existir uma - e preferênciamente apenas uma - forma óbivia de se fazer"- Tim Peters, The Zen of Python (PEP 20)● A utilização de uma sintaxe ou construção de código comumente aceita, pode

ajudar na legibilidade e clareza.● Algumas expressões idiomáticas podem ser mais rápidas ou utilizar menos

memória que suas versões não idiomáticas.● Utilizar expressões idiomáticas podem tornar seu código mais pythonico.

Page 5: Expressões idiomáticas do python

10 expressões

Page 6: Expressões idiomáticas do python

if __name__ == '__main__':

1. Faça scripts ao mesmo tempo "importáveis" e executáveis.

Page 7: Expressões idiomáticas do python

Exemplodef main(): print('Fazendo algo no módulo', __name__)

if __name__ == '__main__': print('Executado pela linha de comando') main()

$ python mymodule.py

Executado pela linha de comando

Fazendo algo no módulo __main__

>>> import mymodule>>> mymodule.main()Doing stuff in module mymodule

Page 8: Expressões idiomáticas do python

2.Teste a "veracidade" ou "falsidade" dos valores

if x:

if not x:

Page 9: Expressões idiomáticas do python

Exemplo# BOMname = 'Safe'pets = ['Dog', 'Cat', 'Hamster']owners = {'Safe': 'Cat', 'George': 'Dog'}if name and pets and owners:

print('We have pets!')# NÃO MUITO BOMif name != '' and len(pets) > 0 and owners != {}:

print('We have pets!')

● Verificar a veracidade não atrela a expressão condicional ao tipo do objeto sendo verificado.

● Verificar a veracidade mostra claramente a intenção do código ao invés de desviar o foco para uma saida específica.

Page 10: Expressões idiomáticas do python

O que significa testar a "veracidade" de um valor.

True False

String não vazia String vazia

Número diferente de zero Número 0

Lista não vazia: len(x) > 0 Lista vazia: len(x) == 0

- None

True False

__nonzero__ (2.x) / __bool__ (3.x) __nonzero__ (2.x) / __bool__ (3.x)

Page 11: Expressões idiomáticas do python

3.Utilize "in" sempre que possível

Contém:if x in items:

Iteração:for x in items:

Page 12: Expressões idiomáticas do python

Exemplo (contém)# BOMname = 'Safe Hammad'if 'H' in name:

print('This name has an H in it!')# NÃO MUITO BOMname = 'Safe Hammad'if name.find('H') != -1:

print('This name has an H in it!')

● Utilizar 'in' para verificar se um item existe em uma sequência é claro e conciso.● Pode ser utilizado em listas, dicionários (chaves), conjuntos (sets), strings e nas suas

próprias classes, basta implementar o método especial: '__contains__'.

Page 13: Expressões idiomáticas do python

Exemplo (iteração)# BOMpets = ['Dog', 'Cat', 'Hamster']for pet in pets:

print('A', pet, 'can be very cute!')# NÃO MUITO BOMpets = ['Dog', 'Cat', 'Hamster'] i=0while i < len(pets):

print('A', pets[i], 'can be very cute!')i += 1

● Utilizar 'in' para iterar em uma sequência é claro e conciso.● Pode ser utilizado em listas, dicionários (chaves), conjuntos (sets), strings, e nas suas

próprias classes, basta implementar o método especial: '__iter__'

Page 14: Expressões idiomáticas do python

4.Permute valores sem precisar de uma variável temporária

a, b = b, a

Page 15: Expressões idiomáticas do python

Exemplo# BOMa, b = 5, 6print(a, b) # 5, 6

a, b = b, aprint(a, b) # 6, 5

# NÃO MUITO BOMa, b = 5, 6print(a, b) # 5, 6

temp = a a = bb = tempprint(a, b) # 6, 5

● Evite poluir o código com variáveis temporárias que só serão utilizadas uma única vez.

Page 16: Expressões idiomáticas do python

5.Construa strings usando sequências

''.join(some_strings)

Page 17: Expressões idiomáticas do python

Exemplos# BOMchars = ['S', 'a', 'f', 'e']name = ''.join(chars)print(name) # Safe# NÃO MUITO BOMchars = ['S', 'a', 'f', 'e']name = ''for char in chars:

name += charprint(name) # Safe

● O método 'join' chamado em uma string e recebendo uma lista de strings como parâmetro, leva tempo linear para executar.

● Somar repetidamente as strings leva tempo quadrádico.

Page 18: Expressões idiomáticas do python

6.MFPPP é preferível a OAT

"É Mais Fácil Pedir Perdão que Permissão."

"Olhe Antes de Tropeçar."

try: vs. if ...: except:

Page 19: Expressões idiomáticas do python

Exemplo# BOM d = {'x': '5'}try:

value = int(d['x'])except (KeyError, TypeError, ValueError):

value = None

# NÃO MUITO BOMd = {'x': '5'}if 'x' in d and \ isinstance(d['x'], str) and \ d['x'].isdigit():

value = int(d['x'])else:

value = None

● Levantar exceções em Python não é "custoso" com é em java por exemplo.● Utilize "duck typing" os invés de ficar verificando valores.

Page 20: Expressões idiomáticas do python

7.Enumere

for i, item in enumerate(items):...

Page 21: Expressões idiomáticas do python

Exemplo# BOMnames = ['Safe', 'George', 'Mildred']for i, name in enumerate(names):

print(i, name) # 0 Safe, 1 George etc.# NÃO MUITO BOMnames = ['Safe', 'George', 'Mildred']count = 0for name in names:

print(i, name) # 0 Safe, 1 George etc.count += 1

● Disponível desdo o Python 2.3● Utilize o parâmetro 'start' do 'enumerate' que está disponível desdo o Python 2.6 para começar

em um número diferente de 0.

Page 22: Expressões idiomáticas do python

8.Construa listas utilizando compreensão de lista

[i * 3 for i in data if i > 10]

Page 23: Expressões idiomáticas do python

Exemplo# BOMdata = [7, 20, 3, 15, 11]result = [i * 3 for i in data if i > 10]print(result) # [60, 45, 33]# NÃO MUITO BOM (QUASE SEMPRE)data = [7, 20, 3, 15, 11]result = []for i in data:

if i > 10:result.append(i * 3)print(result) # [60, 45, 33]

● Sintaxe consisa.● Tome cuidado para não sair do controle, nesse caso a segunda forma é melhor.

Page 24: Expressões idiomáticas do python

9.Crie dicionários a partir de chaves e valores com 'zip'

d = dict(zip(keys, values))

Page 25: Expressões idiomáticas do python

Exemplo# BOMkeys = ['Safe', 'Bob', 'Thomas']values = ['Hammad', 'Builder', 'Engine']d = dict(zip(keys, values))print(d) # {'Bob': 'Builder',

# 'Safe': 'Hammad', # 'Thomas': 'Engine'}

# NÃO MUITO BOMkeys = ['Safe', 'Bob', 'Thomas']values = ['Hammad', 'Builder', 'Engine']d = {}for i, key in enumerate(keys):

d[keys] = values[i]print(d) # {'Bob': 'Builder',

# 'Safe': 'Hammad', # 'Thomas': 'Engine'}

● Existem diversas formas de se construir dicionários.

Page 26: Expressões idiomáticas do python

10.E o mais algumas … !● while True:

braak # polêmico

● Geradores e expressões geradoras● Evite: from module import *

Prefira: import numpy as np● Utilize variáveis descartáveis:

for k, _ in [('a',1), ('b', 2), ('c', 3)]:

● dict.get() e dict.setdefault()● collections.defaultdict● Ordene listas utilizando: l.sort(key=key_funct)

Page 27: Expressões idiomáticas do python

''.join(['O','b','r','i','g','a','d','o'])