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. (Como foi muito bem observado por um comentário de 06/02/2018, caracteres acentuados ocupam mais de um byte, no Python 2. No Python 3 isso não acontece, pois todas as strings são unicode);
  2. Quantos itens existem em qualquer objeto iterável (lista, tupla, set ou um objeto que você mesmo crie).
  3. Quantas chaves existem em um dicionário;

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.

5 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
  3. Só use len() quando você precisar saber:

    1. Quantos caracteres tem numa string;


    Tem certeza? Vejamos...
    Python 2.7.10 (default, Jul 15 2017, 17:16:57)
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> len("a")
    1
    >>> len("ñ")
    2
    >>>

    ResponderExcluir
    Respostas
    1. Muito bem observado e obrigado pela ajuda.

      Incluí uma nota sobre esse comportamento do Python 2.

      Excluir

Marcadores