Generator
First, yield operation mode
We define a generator as follows:
def put_on (name): print ("Hi {}, the goods are coming, ready to move to the warehouse!") ". Format (name)) while True: goods = yield print (" goods [%s] has been moved to the warehouse by%s. "% (goods,name)) p = put_on (" Bigberg ") #输出G: \python\install\python.exe g:/python/untitled/study4/test/ Double.pyprocess finished with exit code 0
When we convert a function through yield into a generator, the function is directly run without the result returned. Since the function is already a generator, we are going to get the value through next () and jump out of the function again when we encounter yield.
Print (Type (p)) #输出 <class ' generator ' >
We add the next () method:
def put_on (name): print ("Hi {}, the goods are coming, ready to move to the warehouse!") ". Format (name)) while True: goods = yield #遇到yield中断 Print (" Cargo [%s] has been moved to the warehouse by%s. "% (goods,name))p = put_on (" Bigberg ") p.__next__ () #输出Hi Bigberg, the goods are coming, ready to move to the warehouse!
At this point the function breaks at goods = yield, and when we call the next () function again, the function will only run after the break, that is, the red font portion of the example above.
Let's add another next ():
def put_on (name): print ("Hi {}, the goods are coming, ready to move to the warehouse!") ". Format (name)) while True: goods = yield print (" goods [%s] has been moved to the warehouse by%s. "% (goods,name)) p = put_on (" Bigberg ") p.__next__ () p.__next__ () #输出Hi Bigberg, the goods are coming, ready to move to the warehouse! The goods [None] have been Bigberg moved into the warehouse.
We can see that yield does not give goods value, and all goods are none.
Summary:
- Converting a function to a function with yield requires the next () method to run
- Yield simply preserves the interrupt state of the function, and another call to next () executes the part after yield
- Yield if there is no return value, a null value of None is returned
Second, send () pass value
def put_on (name): print ("Hi {}, the goods are coming, ready to move to the warehouse!") ". Format (name)) while True: goods = yield print (" goods [%s] has been moved to the warehouse by%s. "% (goods,name)) p = put_on (" Bigberg ") p.__next__ () p.send (" Melon seeds ") #输出Hi Bigberg, the goods come, ready to move to the warehouse! The goods [melon seeds] have been Bigberg moved into the warehouse.
Summary:
- __NEXT__ () Just calls this yield, or it can be said to awaken yield, but does not give the yield a value.
- Send () method call yield Yes, can pass value to yield
- You must use __NEXT__ () before using the Send () function, because you want to break first, and you can pass a value when you call it a second time.
def put_on (name): print ("Hi {}, the goods are coming, ready to move to the warehouse!") ". Format (name)) while True: goods = yield print (" goods [%s] has been moved to the warehouse by%s. "% (goods,name)) p = put_on (" Bigberg ") p.__next__ () p.send (" Melon Seeds ") p.send (" Peanuts ") p.send (" Biscuit ") p.send (" Milk ") #多次调用send () Hi Bigberg, the goods are coming, ready to move to the warehouse! The goods [melon seeds] have been Bigberg moved into the warehouse. The goods [peanuts] have been bigberg into the warehouse. The goods [biscuits] have been bigberg into the warehouse. The goods [milk] have been bigberg into the warehouse.
Third, single-threaded implementation of parallel effects (co-process)
Import timedef put_on (name): print ("Hi {}, the goods are coming, ready to move to the warehouse!") ". Format (name)) while True: goods = yield print (" goods [%s] has been moved to the warehouse by%s. "% (goods,name)) def transfer (name): p = put_on (' A ') p2 = put_on (' B ') p.__next__ () p2.__next__ ( ) Print ("%s sent the goods!") %name) for I in range (5): time.sleep (1) print ("%s handed over two pieces of goods"%name) p.send ("melon seeds") p2.send ("Peanuts") Transfer ("Bigberg") #输出Hi A, the goods are coming, ready to move to the warehouse! Hi B, the goods are coming, ready to move to the warehouse! Bigberg sent the goods to!bigberg handed over two pieces of cargo [melon seeds] have been moved into the warehouse. The goods [peanuts] have been moved into the warehouse by B. Bigberg handed over two pieces of cargo [melon seeds] have been moved into the warehouse. The goods [peanuts] have been moved into the warehouse by B. Bigberg handed over two pieces of cargo [melon seeds] have been moved into the warehouse. The goods [peanuts] have been moved into the warehouse by B. Bigberg handed over two pieces of cargo [melon seeds] have been moved into the warehouse. The goods [peanuts] have been moved into the warehouse by B. Bigberg handed over two pieces of cargo [melon seeds] have been moved into the warehouse. The goods [peanuts] have been moved into the warehouse by B.
python--Generator Co-op