【问题标题】:Function doesn't return all results from 'for' loop函数不会从“for”循环返回所有结果
【发布时间】:2014-01-16 15:42:15
【问题描述】:

我制作了一个简单的函数,可以根据您决定使用的数字打印出时间表图表。由于我对该语言的基本理解,我遇到的问题是为什么它只返回第一个循环而不返回其他任何内容。

def timestables(number):
  for a in range(1, number+1):
    b = a*a
    c = a
    return (str(c) + " * " + str(c) + " = " + str(b))

print(timestables(5))

我得到了答案..

1 * 1 = 1

我试图通过使用 print 而不是 return 来纠正这个问题,但这最终导致 None 也出现。

def timestables(number):
  for a in range(1, number+1):
    b = a*a
    c = a
    print (str(c) + " * " + str(c) + " = " + str(b))

print(timestables(5))

我得到了答案..

1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
None

如何从 for 循环返回所有给定结果以避免出现 None 错误?

【问题讨论】:

  • 缩进在 python 中很重要。请修复您帖子中的缩进

标签: python for-loop


【解决方案1】:

yield他们。

def timestables(number):
  for a in range(1, number+1):
    yield '%s + %s = %s' % (a, a, a*a )

for x in timestables(5):
  print x

这会将您的函数变成生成器函数,并且您需要对结果进行迭代,即结果不是列表,而是可迭代的。

如果您需要一个列表,最简单的方法是显式创建一个:

res = list(timestables(5))

但同样,如果你不这样做,你就不会。

恕我直言,这是最pythonic的方式。

【讨论】:

  • 刚刚输入这个,你比我快。
  • ...除了使用字符串格式会使其 more pythonic(也更简单)
  • @Volatility,是的,我同意。除了这个问题是关于循环,而不是字符串......
【解决方案2】:

您在for 循环内returning - 一旦遇到return 语句,函数就会立即停止执行。

要解决此问题,您可以使用列表来存储这些值,然后返回该列表。

def timestables(number):
    lst = []
    for a in range(1, number+1):
        b = a*a
        c = a
        lst.append(str(c) + " * " + str(c) + " = " + str(b))
    return lst

作为旁注,您应该使用string formatting 来构建字符串,就像这样。

lst.append('{a} * {a} = {b}'.format(a=a, b=a*a))

现在我们可以去掉所有这些中间变量(bc),而可以使用list comprehension

def timestables(number):
    return ['{a} * {a} = {b}'.format(a=a, b=a*a) for a in range(1, number+1)]

如果不希望函数返回列表,而是多行字符串,可以使用str.join

def timestables(number):
    return '\n'.join('{a} * {a} = {b}'.format(a=a, b=a*a) for a in range(1, number+1))

现在我们可以测试函数了:

>>> print(timestables(5))
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25

【讨论】:

  • 使用yield 或生成器表达式会比构建列表更好,但是+1 用于解释为什么 return 没有达到OP 的预期。
  • 感谢您的详细回复,看起来干净多了!!但是,我试图弄清楚如何仅使用 print 函数来获得所需的结果。
【解决方案3】:

你可以返回一个数组:

def timestables(number):
    out = []
    for a in range(1, number+1):
        b = a*a
        c = a
        out.append( str(c) + " * " + str(c) + " = " + str(b))

    return out
print(timestables(5))

【讨论】:

  • 我希望保留当前格式而不是将其转换为列表。不过感谢您的回复!
  • 您可以随时加入列表以将其转换为字符串'\n'.join(out)
猜你喜欢
  • 2015-10-05
  • 2014-09-04
  • 2010-11-06
  • 2018-11-06
  • 2015-08-08
  • 1970-01-01
  • 2022-07-21
  • 2017-09-30
  • 2020-06-09
相关资源
最近更新 更多