【问题标题】:Python: what's wrong with my nested loop?Python:我的嵌套循环有什么问题?
【发布时间】:2012-08-11 01:18:24
【问题描述】:

使用 while 循环,我编写了一个程序,该程序将一个正整数作为输入,并打印出一个乘法表,显示所有整数乘法直到输入数字(包括输入数字)。方程式的打印顺序很重要。

例如,print_multiplication_table(2) 给出:
1 * 1
1 * 2
2 * 1
2 * 2

这是我的代码:

def print_multiplication_table(n):
    a = 1
    b = 1
    while a <= n:
        while b <= n:
            print str(a) + " * " + str(b)
            b = b + 1
        a = a + 1

但是,这似乎不起作用,因为它只会打印出来

1 * 1
1 * 2

有人知道为什么吗?谢谢!

【问题讨论】:

  • 您使用while 而不是for 是否有原因,这在此处似乎更合适。此外,您的缩进仍然有点偏离 - 函数的主体应该缩进。
  • 请考虑回到您过去写过的一些问题,并将任何有助于您解决问题的答案标记为“答案”。
  • 我很想标记它们,但我没有看到任何可以标记的地方。我太菜鸟请告诉我

标签: python loops while-loop nested


【解决方案1】:

内部循环执行前需要初始化计数器

def print_multiplication_table(n):
    a = 1
    b = 1 # won't do harm, but doesn't really need now
    while a <= n:
        b = 1 # <-- note
        while b <= n:
            print str(a) + " * " + str(b)
            b = b + 1
        a = a + 1

【讨论】:

  • 但是,在我的代码中,即使我没有在循环内初始化 b ,它仍然会打印出 1 * 1 和 1 * 2 .... 唯一不起作用的是值 a,它已经被初始化了......谁能解释我为什么?
  • outer 循环的第一次迭代工作正常:inner 循环被执行。但是 outer 循环的第二次迭代不会重新初始化b,这等于在内部循环执行后n + 1。所以内部循环没有被执行(因为保护条件b &lt;= n为假)
  • 哎呀。 :) 现在修复。谢谢。好吧,我的大部分编程都是用 C++ 进行的,偶尔也会使用 python。虽然我通常在提交之前检查我的代码,但这次我在发布后添加了 cmets,所以语法荧光笔和 python 解释器都没有抱怨
【解决方案2】:

考虑使用for 代替while

def print_multiplication_table(n):
    for a in range(1, n+1):
        for b in range(1, n+1):
            print str(a) + " * " + str(b)

给出:

1 * 1
1 * 2
2 * 1
2 * 2

使用for 将自动跟踪您的计数器变量并避免您遇到的错误类型(这当然并不意味着您不能使用for-loops 出错,但更容易避免您遇到的错误类型)

【讨论】:

    【解决方案3】:

    使用 Python 理解更容易:

    >>> print '\n'.join('{} * {}'.format(a,b) for a in range(1,6) for b in range(1,6))
    1 * 1
    1 * 2
    1 * 3
    1 * 4
    1 * 5
    2 * 1
    # etc...
    

    或者,如果你想要终端换行:

    >>> gen=('{} * {}'.format(a,b) for a in range(1,6) for b in range(1,6))
    >>> print '\n'.join(gen),'\n'
    

    我使用单独的 gen 表达式只是为了更清楚地了解带有逗号的打印。这也有效:

    >>> print '\n'.join('{} * {}'.format(a,b) for a in range(1,6) for b in range(1,6)),'\n'
    

    没有理由在您的代码中显式调用str。如果你不这样做,你仍然可以使用 a 和 b 作为整数:

    >>> gen=('{} * {} = {:2}'.format(a,b,a*b) for a in range(1,3) for b in range(1,4))
    >>> print '\n'.join(gen),'\n'
    1 * 1 =  1
    1 * 2 =  2
    1 * 3 =  3
    2 * 1 =  2
    2 * 2 =  4
    2 * 3 =  6 
    

    【讨论】:

    • 可以去掉括号并使用 genexp 代替。这也有一个小怪癖:没有终端 \n,尽管这可能并不重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2019-09-09
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多