20 de novembro de 2012

Não use len()

É muito comum lermos código Python que tem isso:
>>> if len(lista) == 0:
...     # faz isso pq a lista está vazia...
>>> if len(lista) > 0:
...     # faz isso pq a lista tem itens...
Para ver se uma lista está vazia, eu já vi um teste assim: if lista == []:

É normal, quando estamos aprendendo uma nova linguagem, levarmos o que já sabemos de outra, mas por favor, não faça assim! Existe uma maneira mais expressiva (chamamos pythônica) de escrever esses trechos de código:
>>> if lista:
...     # faz isso pq a lista tem itens...
>>> if not lista:
...     # faz isso pq a lista está vazia...
... 

O exemplo acima funciona porque Python avalia como True objetos preenchidos e como False os objetos vazios.

O mesmo princípio também vale para strings, dicionários, números, tuplas e tipos booleanos. Vamos usar uma string como exemplo:
>>> nome = 'Huguinho'
>>> if nome:
...     print 'O nome é %s' % nome
...
O nome é Huguinho
>>> 
>>> nome = ''
>>> if not nome:
...     print 'Anônimo'
...
Anônimo
>>> 

É claro que o len() existe para ser usado, mas somente aonde convém:
>>> lista = ['Huguinho', 'Zezinho', 'Luisinho']
>>> if lista:
...     print 'Donald tem %d sobrinhos: %s' % (len(lista), ', '.join(lista))
... else:
...     print 'Donald não tem sobrinhos'
...
Donald tem 3 sobrinhos: Huguinho, Zezinho e Luisinho
>>> 

Finalizando, use o len() mas aprecie com moderação.

[Edição] Seguindo a dica do @andrewsmedina, vou dar um final diferente a esse post.

Só use len() quando você precisar saber:
  1. Quantos caracteres tem numa string;
  2. Quantos itens estão presentes numa lista, tupla, ou set;
  3. Quantas chaves existem num dicionário;
  4. Quantos itens existem em qualquer objeto iterável.

Mas não use len() para saber se um objeto está preenchido, ok?

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

3 comentários:

  1. Gostei da dica. Sempre usei da maneira dos primeiros exemplos e agora, irei melhorar minha escrita.

    ResponderExcluir
  2. Muito bem! Valeu! Doravante usarei esse método mais inteligente.

    ResponderExcluir

Marcadores