/ / Python: listas de compreensão, acessando loop / python externos, loops, compreensão de lista, loops aninhados

Python: Listas de compreensão, acessando loop / python externos, loops, compreensão de lista, loops aninhados

Isso é provavelmente simples, mas não consigo encontrá-lo por algum motivo. Por exemplo:

def fnc(dt):
print dt
return;



#[(fnc(y)) for y in range(5) for x in range(5)]


for x in range(0, 5):
fnc(x)
for y in range(0, 5):
fnc(y)

Eu gostaria que a linha comentada tivesse um comportamento similar com o loop duplo aninhado abaixo. Isso é possível? Eu desisto, não consigo encontrar! Obrigado por qualquer entrada.

Respostas:

4 para resposta № 1

Você precisa usar as compreensões de lista aninhada para obter o mesmo resultado:

[(fnc(x),[fnc(y) for y in range(5)]) for x in range(5)]

Eu usei uma tupla (fnc(x), [...]) para saída x antes de realizar a compreensão da lista para y.


P.S .: Não use isso de verdade.


3 para resposta № 2

Você não precisa de uma compreensão de lista aqui. As compreensões de lista são para criar listas não para efeitos colateraiscomo você tem em seu para loop. Qualquer solução que forneça o mesmo resultado usando uma lista de comp. (como o abaixo) irá produzir uma lista inútil de Nones:

[fnc(y) for x in range(5) if fnc(x) or 1 for y in range(5)]

O código é despanonista e ilegível. Você nunca deve usá-lo. fnc(x) é sempre avaliado durante a avaliação do if, e o ramo é sempre levado porque está em curto-circuito com um truthy valor usando or, para que o loop aninhado sempre seja executado ∀ x.

A maneira Pythonic é usar uma baunilha para como você fez.


1 para resposta № 3

O que você pode fazer é tecnicamente possível(Eu estou pensando em uma classe com um iterador substituído que chama o func () na iteração, embora eu não tenho certeza se isso é realmente implementável). A implementação, no entanto, seria uma aberração.

A compreensão de listas é uma maneira rápida defiltrar, combinar e / ou processar dados em uma lista para gerar outro. Você deve pensar neles como uma forma de aplicar rapidamente uma função a todos os dados da lista, acrescentando cada vez que a função resultar na lista de saída. É por isso que não há sintaxe para, digamos, atribuições ou chamadas de função externas em compreensões. Se você precisar chamar uma função no loop interno antes de processar os dados, é melhor usar a abordagem de loop aninhado (que é também muito mais legível do que qualquer coisa equivalente hackeada para funcionar em uma compreensão)