2017-04-30 1 views
0

J'ai trouvé du code dont j'avais besoin dans cette réponse https://stackoverflow.com/a/37401376/1727657. Mais je ne comprends pas ce que next() fait dans ce contexte. Quelqu'un pourrait-il expliquer?Comment fonctionne next() dans ce code python

Voici un court script de test que j'ai fait pour le comprendre. L'idée est de voir si la chaîne de test txt contient l'une des chaînes de myset et, si oui, laquelle. Cela fonctionne mais je ne sais pas pourquoi.

myset = ['one', 'two', 'three'] 
txt = 'A two dog night' 
match = next((x for x in myset if x in txt), False) 
if match: #if match is true (meaning something was found) 
    print match #then print what was found 
else: 
    print "not found" 

Ma prochaine question sera de se demander si next() me donnera l'indice de match (ou dois-je faire find() sur txt)?

+2

https://docs.python.org/3/library/functions.html#next – Grimmy

+1

Je suppose qu'ils utilisent '' next'' ici parce qu'ils ne veulent que la première correspondance. La ligne aurait pu être juste '' match = [x pour x dans myset si x dans txt] '' pour obtenir toutes les correspondances. – Grimmy

Répondre

1

Pour expliquer comment la prochaine est utilisée en détail ici.

match = next((x for x in myset if x in txt), False) 

Ceci renvoie le premier/valeur suivante (dans ce cas le mot actuel qui correspondent) créé par l'expression du générateur passé dans le premier argument. Si l'expression du générateur est vide, False sera renvoyé à la place.

Quiconque a écrit le code était probablement uniquement intéressé par la première correspondance, donc next a été utilisé.

Nous pourrions utiliser:

matches = [x for x in myset if x in txt] 

et il suffit d'utiliser len pour déterminer le nombre de coups.

Pour afficher une utilisation simple de next:

generator = (x for x in myset) 
print generator 
print next(generator) 
print next(generator) 
print next(generator) 

Sorties:

<generator object <genexpr> at 0x100720b90> 
one 
two 
three 

L'exemple ci-dessus déclenche une exception StopIteration si nous essayons d'appeler next lorsque la liste/générateur est vide parce que nous n'utilisons pas le second argument pour remplacer ce qui doit être retourné lorsque le générateur est vide.

Ce que fait vraiment next sous le capot s'appelle la méthode __next__() du type. C'est important de garder l'esprit quand on fait des cours.

Si quelque chose n'est pas clair, n'hésitez pas à féliciter et je vais élaborer. Rappelez-vous également que print est votre ami lorsque vous ne comprenez pas ce qui se passe.