"返回"仅在函数中返回一个值

时间:2013-12-16 06:30:00

标签: python function for-loop printing return

假设我写了一个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-loop放入函数时只获取一个值?

我一直在回避这个问题,方法是将for循环的所有结果附加到列表中,然后返回列表。

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

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

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

3 个答案:

答案 0 :(得分:9)

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

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

def func():
    for x in range(10):
        yield x

generator = func()
for item in generator:
    print item

答案 1 :(得分:5)

您想要的是生成器

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

然后你会像这样使用它:

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

您还可以通过执行以下操作来使用整个生成器

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

有关详细信息,请参阅:http://docs.python.org/2/tutorial/classes.html#generators

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

答案 2 :(得分:2)

在函数中return一次,函数结束,剩下的代码将不再被执行。 你的第二个解决方案很好,如果你想要更好的解决方案,你可以使用generator:

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

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

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