函数不会返回'for'循环的所有结果

Erg*_*rgo 5 python for-loop

我已经做了一个简单的功能,根据您决定运行的数字打印出时间表图表.由于我对该语言的基本理解,我遇到的问题是为什么它只返回第一个循环而没有别的.

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))
Run Code Online (Sandbox Code Playgroud)

我得到答案..

1 * 1 = 1
Run Code Online (Sandbox Code Playgroud)

我试图通过使用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))
Run Code Online (Sandbox Code Playgroud)

我得到答案..

1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
None
Run Code Online (Sandbox Code Playgroud)

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

shx*_*hx2 15

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
Run Code Online (Sandbox Code Playgroud)

这会将您的函数转换为生成函数,您需要迭代结果,即结果不是列表,而是可迭代的.

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

res = list(timestables(5))
Run Code Online (Sandbox Code Playgroud)

但是,如果你不这样做,你就不会.

恕我直言,这是最蟒蛇的方式.


Vol*_*ity 9

return荷兰国际集团内for环路-和功能停止执行后立即打他们一个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
Run Code Online (Sandbox Code Playgroud)

作为旁注,您应该使用字符串格式来构建字符串,就像这样.

lst.append('{a} * {a} = {b}'.format(a=a, b=a*a))
Run Code Online (Sandbox Code Playgroud)

现在我们可以摆脱所有这些中间变量(bc),我们可以使用列表理解.

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

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

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

现在我们可以测试这个功能了:

>>> print(timestables(5))
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
Run Code Online (Sandbox Code Playgroud)