有这样的代码:
def f():
return 3
return (i for i in range(10))
x = f()
print(type(x)) # int
def g():
return 3
for i in range(10):
yield i
y = g()
print(type(y)) # generator
当有返回生成器语句时,为什么f
返回{yield
和generator expression都返回generator(至少在删除return 3
语句时),但是当有一次生成器表达式返回,第二次有yield
关键字时,函数编译还有其他规则吗?在
这在python3.3中进行了测试
与
^{pr2}$第二个return语句永远不会被执行,只是在
f
中有一个生成器表达式并不能使它成为生成器。在当您在函数体中使用
yield
语句时,它就变成了生成器。调用生成器函数只返回生成器对象。它不再是一个正常的函数,而是由generator对象接管了控制权。在从^{} expression documentation :
在常规函数中,调用该函数会立即将控制权切换到该函数体,而您只需测试函数的结果,该结果由它的
return
语句设置。在生成器函数中,return
仍然表示生成器函数的结束,但这会导致引发StopIteration
异常。但是,除非调用4个生成器方法(.__next__()
、.send()
、.throw()
或.close()
)中的一个,否则生成器函数体根本不会执行。在对于您的特定函数
f()
,您有一个正则函数,包含一个生成器。该函数本身没有什么特别之处,只是它在return 3
执行时提前退出。下一行的生成器表达式是独立的,它不影响定义它的函数。您可以在不使用函数的情况下定义它:使用生成器表达式生成生成器对象,就像在函数中使用
^{pr2}$yield
,然后调用该函数生成生成器对象。因此,您可以在f()
中调用g()
,其结果与使用生成器表达式的结果相同:g()
仍然是一个生成函数,但是在f()
中使用它不会使f()
也成为生成函数。只有yield
可以做到这一点。在我相信你的意思是:
^{pr2}$相关问题 更多 >
编程相关推荐