2016-11-29 2 views
2

J'ai posé une question sur une compréhension de la liste il ya quelques jours: Elegant way to delete items in a list which do not has substrings that appear in another listEst-ce une expression de générateur?

Quoi qu'il en soit, j'ai eu une bonne réponse à ma question. Il est une compréhension de la liste:

[p for p in process_list if all(e not in p for e in exclude_list)]

Je reçois l'idée et l'a appliqué à mon travail. Mais je ne suis pas sûr si je reçois la partie e not in p for e in exclude_list à droite. Cela ressemble à une expression génératrice mais je ne suis pas sûr. Je pense qu'il est préférable de poser cette question dans un autre post.

Donc, est-ce une expression de générateur ou autre chose?

+4

oui c'est une expression de générateur. –

+1

Oui. C'est une expression de générateur: '(ceci est une compréhension de générateur)'. '[ceci est une compréhension de la liste]' – inspectorG4dget

+1

Dans 'any()' si vous passez directement l'expression sans '[...]', elle est traitée comme l'expression du générateur –

Répondre

2

Oui, all(e not in p for e in exclude_list) est un appel contenant une expression de générateur. Les expressions de générateur qui sont l'argument seulement passées à un appel peuvent omettre les parenthèses. Ici, c'est le all() function qui est appelé.

De l'Generator expressions reference documentation:

Les parenthèses peuvent être omis sur les appels avec un seul argument. s'il y a,

La fonction all() (ainsi que la fonction d'accompagnement any() est souvent donné une expression de générateur, car cela permet une évaluation paresseuse d'une série de tests juste assez e not in p tests sont exécutés pour déterminer le résultat. toute not in p test qui est faux, all() rendement précoce et aucun des tests supplémentaires sont exécutés

3

Soit python vous dire ce qu'il est.

>>> p=[] 
>>> exclude_list=[] 
>>> type(e not in p for e in exclude_list) 
<class 'generator'> 
+0

Ceci est une excellente approche. Mais je pense que la chose qui m'a le plus troublée en premier lieu est de passer 'e pas dans p pour e dans exclude_list' à' all() '. Et ces parenthèses m'ont vraiment fait me demander si c'est toujours une expression génératrice. Mais maintenant je l'ai compris puisque Martijn l'a expliqué dans sa réponse, – zyc