[Python]NEXT方法
python中,含有yield关键字的对象就是一个生成器;
每次调用next方法时会执行到yield后面的语句,然后返回yield后面代码块的执行结果
其实也可以调用send方法,下面给个例子方便理解
next方法:
def foo():
    bar_a = yield 1         # bar_a是语句块(yield 1)的返回值,默认为None
    bar_b = yield bar_a
    yield "最后一个值,再迭代就要报StopIteration了"
f = foo()                   # 创建生成器,此时没有执行foo()里的任何语句
print(f)	#1
print(next(f))	#2              # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建
print(next(f))	#3              # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。
                            	# 然后执行到语句块(yield bar_a),bar_b也还没有被创建
print(next(f)	#41处打印出来的内容为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py
<generator object foo at 0x00000127A19FAD60>2处打印出来的内容为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py
<generator object foo at 0x000001B4120EAD60>
13处打印出来的内容为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py
<generator object foo at 0x000002999698AD60>
1
None4处打印出来的内容为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py
<generator object foo at 0x000001E2E9FBAD60>
1
None
最后一个值,再迭代就要报StopIteration了为了更好的理解程序,采用了新的方法:
def foo():
    print("现在执行到了bar_a = yield 1之前")
    bar_a = yield 1         # bar_a是语句块(yield 1)的返回值,默认为None
    print("现在执行到了bar_a = yield 1之后")
    
    print("经过bar_a = yield 1之后,bar_a的数值为:{}".format(bar_a))
    print("现在执行到了bar_b = yield bar_a之前")
    bar_b = yield bar_a
    print("现在执行到了bar_b = yield bar_a之后")
    yield "最后一个值,再迭代就要报StopIteration了"
f = foo()                   # 创建生成器,此时没有执行foo()里的任何语句
print(f)	#1
print("*************************************")
print(next(f))	#2              # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建
print("*************************************")
print(next(f))	#3              # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。Z
#                             	# 然后执行到语句块(yield bar_a),bar_b也还没有被创建
print("*************************************")
print(next(f))	#4最后的输出结果为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391\Scripts> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp_2.py
<generator object foo at 0x0000028A864B0BA0>
*************************************
现在执行到了bar_a = yield 1之前
1
*************************************
现在执行到了bar_a = yield 1之后
经过bar_a = yield 1之后,bar_a的数值为:None
现在执行到了bar_b = yield bar_a之前
None
*************************************
现在执行到了bar_b = yield bar_a之后
最后一个值,再迭代就要报StopIteration了通过上面,大致可以理解, yield 和 return 的区别
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号