Pessoal, bom dia.
Eu tenho uma lista retornada pela funçãore.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]
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?
ResponderExcluirSó o reduce de fato decidiram remover, mas ainda pode ser importado.
@Thomas, realmente o Guido diz isso mesmo.
ResponderExcluirTanto 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.
peças = filtro (None, re.split (r '(\ w +), s)) este comando é mais conveniente do que o primeiro é praticamente o mesmo
ResponderExcluira fim de reduzir () em Python 3000.