有这段代码:
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
在有return generator语句的情况下返回int
?我猜 yield
和生成器表达式都返回生成器(至少当语句 return 3
被删除时)但是当有 once 生成器表达式时还有一些其他的函数编译规则当里面有yield
关键字时返回和第二次?
这是在 Python 3.3 中测试的
最佳答案
当您在函数体中使用 yield
语句时,很快它就会变成一个生成器。调用生成器函数只会返回该生成器对象。它不再是一个正常的功能;生成器对象接管了控制权。
来自yield
expression documentation :
Using a
yield
expression in a function definition is sufficient to cause that definition to create a generator function instead of a normal function.When a generator function is called, it returns an iterator known as a generator. That generator then controls the execution of a generator function. The execution starts when one of the generator’s methods is called.
在常规函数中,调用该函数会立即将控制权切换到该函数体,您只是在测试函数的结果,由它的 return
语句设置。在生成器函数中,return
仍然表示生成器函数结束,但这会导致引发 StopIteration
异常。但直到您调用 4 个生成器方法之一(.__next__()
、.send()
、.throw()
或 .close()
), 生成器函数体根本不执行。
对于您的特定函数 f()
,您有一个常规函数,它包含一个生成器。该函数本身没有什么特别之处,只是它在执行 return 3
时提前退出。下一行的生成器表达式独立存在,它不影响定义它的函数。你可以在没有函数的情况下定义它:
>>> (i for i in range(10))
<generator object <genexpr> at 0x101472730>
使用生成器表达式生成生成器对象,就像在函数中使用 yield
一样,然后调用该函数生成生成器对象。因此,您可以在 f()
中调用 g()
,得到与使用生成器表达式相同的结果:
def f():
return 3
return g()
g()
仍然是生成器函数,但在 f()
中使用它不会生成 f()
也是一个生成器函数。只有 yield
可以做到这一点。
关于python - 产量与生成器表达式 - 返回不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16780434/