15 de outubro de 2009

filter() ou list comprehension?

Eu postei na lista Python Brasil a seguinte pergunta:

Pessoal, bom dia.

Eu tenho uma lista retornada pela função re.split(r'(\w+)', s).

Para me livrar das ocorrências nulas, estou usando o seguinte comando:
partes = [t for t in re.split(r'(\w+)', s) if t]

No entanto, consigo o mesmo resultado se eu usar:
partes = filter(None, re.split(r'(\w+)', s))


O manual[1] diz que o filter() é equivalente ao uso da list comprehension.
O PEP 20[2] (Zen of Python) diz que explícito é melhor do que
implícito e que idealmente deveria haver apenas um jeito óbvio de
fazer as coisas.

Então minhas perguntas são:
1) Se eu consigo o mesmo efeito usando qualquer uma das formas, qual
eu deveria usar?
2) Por que?


[1] http://docs.python.org/library/functions.html#filter
[2] http://www.python.org/dev/peps/pep-0020/

O Conrado Gouvêa respondeu enviando um link do Guido Van Rossum (criador da linguagem) que esclarece essa questão: The fate of reduce() in Python 3000.

Em resumo, o post diz que as funções map(), filter() e lambda serão seriam desencorajadas no Python 3.

[update 1]Portanto, vou continuar com minha list comprehension. Afinal, não vou usar um lance que está planejado há quase 5 anos para sair de cena, certo?
Vou continuar com minha list comprehension porque o próprio criador da linguagem mostrou que ela torna a intenção do programador mais explícita.[/update 1]

[update 2]: (em 15/10/2009) o Thomas Woelz percebeu uma falha nesse meu post. Na realidade o artigo do Guido diz que essas funções seriam retiradas do Python 3000. Mas um update que está até em negrito -- e não foi suficiente para eu entender! (dããããã) -- diz que somente o reduce() será eliminado.
[/update 2]

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.

2 comentários:

  1. Não sei, o post teve um update dizendo que filter e map vão continuar a existir ok no 3000, somente que foram modificados para retornar iterators no lugar de listas. Onde ficou dito que o uso destas funções será desencorajada?

    Só o reduce de fato decidiram remover, mas ainda pode ser importado.

    ResponderExcluir
  2. @Thomas, realmente o Guido diz isso mesmo.

    Tanto que o título do artigo diz: "O destino do reduce() no Python 3000". Acho que só eu não percebi isso, né? rsrs

    Já atualizei meu post com sua consideração.

    Obrigado por perceber essa falha.

    ResponderExcluir

Marcadores