Home >Backend Development >Python Tutorial >A brief analysis of the role and usage of the yield keyword in Python
Foreword
In order to understand what yield is, you must first understand what a generator (generator
) is. Before talking about the generator, let’s talk about the iterator (iterator
). When creating a list (list
), you can one by one Reading each item, this is called iteration (iteration
).
>>> mylist = [1, 2, 3] >>> for i in mylist : ... print(i) 1 2 3
mylist
is an iterable object. When you use a list comprehension to create a list, you create an iterable object:
>>> mylist = [x*x for x in range(3)] >>> for i in mylist : ... print(i) 0 1 4
You can use "for... Make repeated reads. But you have to store all the elements in memory in advance, and when there are many elements in those objects, not every item will be useful to you.
The generator is also an iterable object, but you can only read it once, because it does not store all values in memory, it generates values dynamically:
>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator : ... print(i) 0 1 4
It looks like there is no difference except replacing [] with (). However, you cannot use
is a keyword similar to return
, except that this function returns a generator.
>>> def createGenerator() : ... mylist = range(3) ... for i in mylist : ... yield i*i ... >>> mygenerator = createGenerator() # create a generator >>> print(mygenerator) # mygenerator is an object! <generator object createGenerator at 0xb7555c34> >>> for i in mygenerator: ... print(i) 0 1 4
This example itself is meaningless, but it clearly illustrates that the function will return a set of values that can only be read once. To master yield, the first thing you must understand is: when you call the generator function, as in the above example
createGenerator() , the program does not execute the code in the function body, it just returns the generator object, which is quite subtle. The code inside the function body will not run until each loop iteration (for) of the generator.
keyword from the beginning, and then return the value after yield
as the return value of the first iteration. Then, each time this function is executed, it will continue to execute what you are doing The next time in the loop defined inside the function, the value is returned until there is nothing left to return.
If the yield
keyword is not defined inside the generator, then the generator is considered empty. This may happen because the loop is running out, or the if/else conditions are not met.