yeild est simplement un générateur Un générateur est une fonction qui se souvient de la dernière fois qu'elle a renvoyé sa position dans le corps de la fonction. . Le deuxième (ou nième) appel à une fonction génératrice saute au milieu de la fonction, laissant toutes les variables locales inchangées par rapport à l'appel précédent.
Le générateur est une fonction
Tous les paramètres de la fonction seront conservés
Le deuxième fois Les paramètres utilisés lors de l'appel de cette fonction sont ceux laissés la fois précédente
Le générateur "se souvient" également de l'état de ses données. N'oubliez pas non plus son emplacement dans la construction de contrôle de flux.
Le mécanisme de fonctionnement du générateur
Lorsque vous demandez au générateur de générer un nombre, le générateur s'exécutera jusqu'à ce que l'instruction yeild apparaisse, et le générateur vous donnera les paramètres de yeild, puis le Le générateur ne s'arrêtera pas. Lorsque vous lui demandez le numéro suivant, il continuera à fonctionner à partir du dernier état jusqu'à ce que l'instruction de rendement apparaisse, vous donnera les paramètres, puis s'arrêtera, et ainsi de suite jusqu'à ce qu'il quitte la fonction
Afin de comprendre le mécanisme du rendement, nous devons comprendre ce qu'est un générateur. Avant cela, présentons les itérateurs.
Lorsque vous créez une liste, vous pouvez l'obtenir une par une. appelé Itération :
<span style="font-size: 16px;">>>> mylist = [1, 2, 3]<br>>>> for i in mylist:<br>... print(i)<br>1<br>2<br>3<br></span>
Mylist est un itérateur Lorsque vous la comprenez comme une liste, elle est itérable :
<span style="font-size: 16px;">>>> mylist = [x*x for x in range(3)]<br>>>> for i in mylist:<br>... print(i)<br>0<br>1<br>4<br></span>
Tout ce qui peut être lu de manière itérative en utilisant for in est un conteneur d'itération, comme des listes, des chaînes, des fichiers. Ces itérateurs sont très pratiques car vous pouvez en prendre autant que vous le souhaitez, mais vous en avez. pour stocker toutes les valeurs, dont beaucoup sont totalement inutiles à garder en mémoire à chaque fois.
Generators(生成器)也是可迭代的,但是你每次只能迭代它们一次,因为不是所有的迭代器都被一直存储在内存中的,他们临时产生这些值:
<span style="font-size: 16px;">>>> mygenerator = (x*x for x in range(3))<br>>>> for i in mygenerator:<br>... print(i)<br>0<br>1<br>4<br></span>
生成器几乎和迭代器是相同的,除了符号[]变为()。但是你无法用两次,因为他们只生成一次:他们生成0然后丢弃,继续统计1,接着是4,一个接着一个。
Yield的用法有点像return,除了它返回的是一个生成器,例如:
<span style="font-size: 16px;">>>> def createGenerator():<br>... mylist = range(3)<br>... for i in mylist:<br>... yield i*i<br>...<br>>>> mygenerator = createGenerator() # create a generator<br>>>> print(mygenerator) # mygenerator is an object!<br><generator object createGenerator at 0xb7555c34><br>>>> for i in mygenerator:<br>... print(i)<br>0<br>1<br>4<br></span>
上面的例子几乎非常积累,但是它很好的阐释了yield的用法,我们可以知道createGenerator()生成的是一个生成器。
为了掌握yield的精髓,你一定要理解它的要点:当你调用这个函数的时候,你写在这个函数中的代码并没有真正的运行。这个函数仅仅只是返回一个生成器对象。有点过于奇技淫巧:-)
然后,你的代码会在每次for使用生成器的时候run起来。
现在是解释最难的地方:
当你的for第一次调用函数的时候,它生成一个生成器,并且在你的函数中运行该循环,知道它生成第一个值。然后每次调用都会运行循环并且返回下一个值,知道没有值返回为止。该生成器背认为是空的一旦该函数运行但是不再刀刀yield。之所以如此是因为该循环已经到达终点,或者是因为你再也不满足“if/else”的条件.
Recommandations associées :
Une brève analyse du rendement de python
Un bref analyse du rendement python Analyse
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!