【问题标题】:Using "yield" in a function在函数中使用“yield”
【发布时间】:2016-05-04 21:05:07
【问题描述】:

我想在一个接收 1 个参数 n 的函数中生成类似的东西,使用 yield 生成:

      1
     1+2
    1+2+3
      …
      …
1+2+3+⋯+n−1+n

这是我最后一次尝试:

def suite(n):
    total = 0
    for i in n:
        total+=i
        yield total

这是我收到的:

Traceback (most recent call last):
  File "notebook", line 4, in suite
TypeError: 'int' object is not iterable

【问题讨论】:

  • 你应该迭代range(n)

标签: python generator yield


【解决方案1】:

你的错误在这里:

for i in n:

n 是一个整数而不是可迭代的。也许你想在这里使用xrange()(仅限 Python 2)或range()(推荐用于 Python 3):

for i in range(n):

请注意,这将从 0 开始迭代,而不是 1(直到并包括 n - 1)。您可以使用range(1, n + 1),也可以简单地将总和加 1:

def suite(n):
    total = 0
    for i in range(n):
        total += i + 1
        yield total

这与生成器没有任何关系;无论您是否使用yield,尝试循环遍历一个普通的int 对象都行不通。

【讨论】:

    【解决方案2】:

    因为您的函数声明与 for 循环不对应。你不能迭代整数,你应该使用一些可迭代的来代替。最简单的方法是使用范围:

    正确的版本是:

    def suite(n):
        total = 0
        for i in range(n):
            total += i
            yield total
    >>>suite(6)
    

    或者,您可以进行另一项更改以产生一些可迭代的总和:

    def suite(iterable):
        total = 0
        for i in iterable:
            total += i
            yield total
    
    >>>suite([1,2,3])
    

    【讨论】:

    • 这与函数声明无关。在函数外使用该循环也会出现同样的错误。
    • 查看编辑后的答案。我的意思是该声明与 for 循环不对应。
    【解决方案3】:

    使用range 创建一个迭代器以在for 循环中使用:

    def suite(n):
        total = 0
        for i in range(1, n+1):
            total+=i
            yield total
    

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 2020-10-23
      • 1970-01-01
      • 2016-09-29
      • 2012-01-07
      • 1970-01-01
      • 2016-06-20
      • 2015-12-03
      • 2014-01-18
      相关资源
      最近更新 更多