python - 产量与生成器表达式 - 返回不同类型

标签 python generator yield

有这段代码:

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/

相关文章:

python - 在 Numba 中关闭列表反射

python - 计算一次,缓存结果,并从缓存中无限返回的函数(Python)

c# - yield 在 LINQ 之外有用吗?

python - 为什么这个 python 生成器每次都返回相同的值?

c# - foreach 循环中的无限 IEnumerable

python - 特征列在 tensorflow 中如何工作?

Python Linter 表示方法调用中的值在已修补的单元测试中丢失,但测试运行正常。为什么?

node.js - 将回调转换为 thunk

Python 如何使用 map() 将列表拆分为子列表?

java - java中的快速实值随机生成器