【问题标题】:"Return" in Function only Returning one Value函数中的“返回”只返回一个值
【发布时间】:2014-01-03 11:32:30
【问题描述】:

假设我编写了一个 for 循环,它将输出所有数字 1 到 x:

x=4
for number in xrange(1,x+1):
    print number,
#Output:
1
2
3
4

现在,将相同的 for 循环放入函数中:

def counter(x):
    for number in xrange(1,x+1):
        return number
print counter(4)
#Output:
1

为什么我把for循环放到一个函数中只能得到一个值?

我一直在通过将 for 循环的所有结果附加到一个列表,然后返回该列表来回避这个问题。

为什么 for 循环会追加所有结果,而不只是一个?:

def counter(x):
    output=[]
    for number in xrange(1,x+1):
        output.append(number)
    return output

返回所有值的最佳方法是什么,附加到列表似乎效率很低。

【问题讨论】:

  • return 从函数返回。您可能对yield 感兴趣,但这首先需要了解return 的作用。

标签: python function for-loop printing return


【解决方案1】:

一旦return 在一个函数中,该函数结束并且剩余的代码将不再被执行。 您的第二个解决方案很好,如果您想要更好的解决方案,您可以使用生成器:

def counter(x):
    for number in xrange(1,x+1):
        yield number

然后你可以像这样使用它:

>>> for i in counter(5):
...     print i
... 
1
2
3
4
5

【讨论】:

    【解决方案2】:

    return 与关键字名称所暗示的完全一样。当您点击该语句时,它 返回 并且函数的其余部分不会执行。

    您可能想要的是 yield 关键字。这将创建一个生成器函数(一个返回生成器的函数)。生成器是可迭代的。每次执行 yield 表达式时,它们都会“生成”一个元素。

    def func():
        for x in range(10):
            yield x
    
    generator = func()
    for item in generator:
        print item
    

    【讨论】:

      【解决方案3】:

      你想要的是一个生成器

      def counter(x):
          for number in xrange(1,x+1):
              yield number
      

      然后你会像这样使用它:

      c = counter(5)
      next(c)  # 1
      next(c)  # 2
      

      您也可以通过以下方式消耗整个 generator

      xs = list(c)  # xs = [1, 2, 3, 4, 5]
      

      请参阅:http://docs.python.org/2/tutorial/classes.html#generators 了解更多信息。

      Python 中的return 语句从函数中返回并且不保存任何状态。每次调用该函数时,都会创建一个新的堆栈帧。另一方面,yield 是(或多或少)Python 的 continutations

      【讨论】:

        猜你喜欢
        • 2020-11-20
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        相关资源
        最近更新 更多