【问题标题】:Converting a yield statement to a Generator Expression in Python在 Python 中将 yield 语句转换为生成器表达式
【发布时间】:2013-12-16 11:55:23
【问题描述】:

我有一个关于将 yield 语句转换为生成器表达式的问题

所以我有这个小的 yield 方法,它获取一个函数和一个起始数字作为其输入,并且基本上为每个先前调用的数字调用该函数,即:

  • 第一次调用返回初始号码
  • 第二次调用返回函数(初始编号)
  • 第三次调用返回函数(第二个数字)
  • 第四次调用返回函数(第三个数字)

等等。 这是Python中的代码:

def some_func(function, number):
    while True:
        yield number
        number = function(number)

有什么方法可以将这个 sn-p 转换为生成器表达式? 我猜有一种非常pythonic和优雅的方式来做到这一点,但我就是无法理解它。

我对生成器表达式很不熟悉,因此我为什么要寻求帮助,但我确实想扩展我对 Gen Exp 的一般知识,特别是 Python 的知识

【问题讨论】:

  • 生成器表达式实际上并没有像那个局部变量那样的“记忆”,它们也不能递归地调用自己。也许我会对答案感到惊讶,但在我看来,您的函数已经是优雅和 Pythonic 的方式。
  • 生成器表达式需要 a) 另一个迭代器来循环,并且 b) 不能访问其他变量。我会按原样坚持这个功能。
  • 您可以查看this question 的答案,并将(x for x in whatever) 包裹起来。最近有很多人就同一个问题提出了不同的问题,尽管他们倾向于说“不使用 yield”而不是“使用 genexp”。

标签: python python-3.x generator yield generator-expression


【解决方案1】:

坚持你现在拥有的。您可以将函数转换为生成器表达式,但这将是一个难以理解的混乱。

生成器表达式需要另一个迭代器来循环,而你的生成器函数没有。生成器表达式也不能真正访问任何其他变量。只有表达式和循环,还有可选的if 过滤器和更多循环。

下面是生成器表达式的样子:

from itertools import repeat

number = [number]
gen = ((number[0], number.__setitem__(0, function(number[0]))[0] for _ in repeat(True))

我们滥用number 作为“变量”。

【讨论】:

  • 呃。这有点像 Python 中的 Perl 编程... g
猜你喜欢
  • 2020-04-07
  • 2022-01-01
  • 2013-12-07
  • 2013-07-09
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2014-05-22
相关资源
最近更新 更多