Expressões idiomáticas
do Python
@xima
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
"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?
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.
10 expressões
if __name__ == '__main__':
1. Faça scripts ao mesmo tempo
"importáveis" e executáveis.
Exemplo
def 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
2.Teste a "veracidade" ou "falsidade" dos
valores
if x:
if not x:
Exemplo
# BOM
name = 'Safe'
pets = ['Dog', 'Cat', 'Hamster']
owners = {'Safe': 'Cat', 'George': 'Dog'}
if name and pets and owners:
print('We have pets!')
# NÃO MUITO BOM
if 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.
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)
3.Utilize "in" sempre que possível
Contém:
if x in items:
Iteração:
for x in items:
Exemplo (contém)
# BOM
name = 'Safe Hammad'
if 'H' in name:
print('This name has an H in it!')
# NÃO MUITO BOM
name = '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__'.
Exemplo (iteração)
# BOM
pets = ['Dog', 'Cat', 'Hamster']
for pet in pets:
print('A', pet, 'can be very cute!')
# NÃO MUITO BOM
pets = ['Dog', 'Cat', 'Hamster'] i=0
while 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__'
4.Permute valores sem precisar de uma
variável temporária
a, b = b, a
Exemplo
# BOM
a, b = 5, 6
print(a, b) # 5, 6
a, b = b, a
print(a, b) # 6, 5
# NÃO MUITO BOM
a, b = 5, 6
print(a, b) # 5, 6
temp = a
a = b
b = temp
print(a, b) # 6, 5
● Evite poluir o código com variáveis temporárias que só serão utilizadas uma única vez.
5.Construa strings usando sequências
''.join(some_strings)
Exemplos
# BOM
chars = ['S', 'a', 'f', 'e']
name = ''.join(chars)
print(name) # Safe
# NÃO MUITO BOM
chars = ['S', 'a', 'f', 'e']
name = ''
for char in chars:
name += char
print(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.
6.MFPPP é preferível a OAT
"É Mais Fácil Pedir Perdão que Permissão."
"Olhe Antes de Tropeçar."
try: vs. if ...:
except:
Exemplo
# BOM
d = {'x': '5'}
try:
value = int(d['x'])
except (KeyError, TypeError, ValueError):
value = None
# NÃO MUITO BOM
d = {'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.
7.Enumere
for i, item in enumerate(items):
...
Exemplo
# BOM
names = ['Safe', 'George', 'Mildred']
for i, name in enumerate(names):
print(i, name) # 0 Safe, 1 George etc.
# NÃO MUITO BOM
names = ['Safe', 'George', 'Mildred']
count = 0
for 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.
8.Construa listas utilizando compreensão
de lista
[i * 3 for i in data if i > 10]
Exemplo
# BOM
data = [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.
9.Crie dicionários a partir de chaves e
valores com 'zip'
d = dict(zip(keys, values))
Exemplo
# BOM
keys = ['Safe', 'Bob', 'Thomas']
values = ['Hammad', 'Builder', 'Engine']
d = dict(zip(keys, values))
print(d) # {'Bob': 'Builder',
# 'Safe': 'Hammad',
# 'Thomas': 'Engine'}
# NÃO MUITO BOM
keys = ['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.
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)
''.join(['O','b','r','i','g','a','d','o'])

Expressões idiomáticas do python

  • 1.
  • 2.
    Estes slides sãouma 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
  • 3.
    "Características gramaticais, sintáticase 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?
  • 4.
    Por que seimportar 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.
  • 5.
  • 6.
    if __name__ =='__main__': 1. Faça scripts ao mesmo tempo "importáveis" e executáveis.
  • 7.
    Exemplo def main(): print('Fazendo algono 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
  • 8.
    2.Teste a "veracidade"ou "falsidade" dos valores if x: if not x:
  • 9.
    Exemplo # BOM name ='Safe' pets = ['Dog', 'Cat', 'Hamster'] owners = {'Safe': 'Cat', 'George': 'Dog'} if name and pets and owners: print('We have pets!') # NÃO MUITO BOM if 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.
  • 10.
    O que significatestar 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)
  • 11.
    3.Utilize "in" sempreque possível Contém: if x in items: Iteração: for x in items:
  • 12.
    Exemplo (contém) # BOM name= 'Safe Hammad' if 'H' in name: print('This name has an H in it!') # NÃO MUITO BOM name = '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__'.
  • 13.
    Exemplo (iteração) # BOM pets= ['Dog', 'Cat', 'Hamster'] for pet in pets: print('A', pet, 'can be very cute!') # NÃO MUITO BOM pets = ['Dog', 'Cat', 'Hamster'] i=0 while 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__'
  • 14.
    4.Permute valores semprecisar de uma variável temporária a, b = b, a
  • 15.
    Exemplo # BOM a, b= 5, 6 print(a, b) # 5, 6 a, b = b, a print(a, b) # 6, 5 # NÃO MUITO BOM a, b = 5, 6 print(a, b) # 5, 6 temp = a a = b b = temp print(a, b) # 6, 5 ● Evite poluir o código com variáveis temporárias que só serão utilizadas uma única vez.
  • 16.
    5.Construa strings usandosequências ''.join(some_strings)
  • 17.
    Exemplos # BOM chars =['S', 'a', 'f', 'e'] name = ''.join(chars) print(name) # Safe # NÃO MUITO BOM chars = ['S', 'a', 'f', 'e'] name = '' for char in chars: name += char print(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.
  • 18.
    6.MFPPP é preferívela OAT "É Mais Fácil Pedir Perdão que Permissão." "Olhe Antes de Tropeçar." try: vs. if ...: except:
  • 19.
    Exemplo # BOM d ={'x': '5'} try: value = int(d['x']) except (KeyError, TypeError, ValueError): value = None # NÃO MUITO BOM d = {'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.
  • 20.
    7.Enumere for i, itemin enumerate(items): ...
  • 21.
    Exemplo # BOM names =['Safe', 'George', 'Mildred'] for i, name in enumerate(names): print(i, name) # 0 Safe, 1 George etc. # NÃO MUITO BOM names = ['Safe', 'George', 'Mildred'] count = 0 for 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.
  • 22.
    8.Construa listas utilizandocompreensão de lista [i * 3 for i in data if i > 10]
  • 23.
    Exemplo # BOM data =[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.
  • 24.
    9.Crie dicionários apartir de chaves e valores com 'zip' d = dict(zip(keys, values))
  • 25.
    Exemplo # BOM keys =['Safe', 'Bob', 'Thomas'] values = ['Hammad', 'Builder', 'Engine'] d = dict(zip(keys, values)) print(d) # {'Bob': 'Builder', # 'Safe': 'Hammad', # 'Thomas': 'Engine'} # NÃO MUITO BOM keys = ['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.
  • 26.
    10.E o maisalgumas … ! ● 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)
  • 27.