Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:what';我的嵌套循环有什么问题?_Python_Loops_While Loop_Nested - Fatal编程技术网

Python:what';我的嵌套循环有什么问题?

Python:what';我的嵌套循环有什么问题?,python,loops,while-loop,nested,Python,Loops,While Loop,Nested,使用while循环,我编写了一个以一个正整数作为输入的过程,并打印出一个乘法表,显示所有整数乘法,包括输入数。方程式被打印出来的顺序 例如,打印乘法表(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)

使用while循环,我编写了一个以一个正整数作为输入的过程,并打印出一个乘法表,显示所有整数乘法,包括输入数。方程式被打印出来的顺序

例如,打印乘法表(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

有人知道为什么吗?谢谢

在执行内部循环之前,需要初始化其计数器

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
def打印乘法表(n):
a=1
b=1#不会造成伤害,但现在真的不需要了

而考虑使用
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
-循环出错,但更容易避免您遇到的错误类型)

更容易理解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 

您使用
while
而不是
for
是否有什么原因,这在这里似乎更合适。此外,你的缩进仍然有点离题-功能的身体应该缩进。请考虑回到你过去写过的一些问题,并把帮助你解决问题的答案写为“答案”。我很想给他们打个标记,但我看不出我能在哪里找到它。请告诉我,在我的代码中,即使我没有在循环中初始化b,它仍然输出1*1和1*2。。。。唯一不起作用的是a值,它已经初始化了。。。有人能解释为什么吗?外循环的第一次迭代工作正常:执行内循环。但是外部循环的第二次迭代不会在内部循环执行后重新初始化
b
,这等于
n+1
。因此,内部循环不会执行(因为保护条件
b ooooops.:)现在已修复。谢谢我在C++中做大部分编程,偶尔也使用Python。虽然我通常在提交代码之前检查代码,但这次我在发布代码后添加了注释,因此语法高亮器和python解释器都不能放弃括号而改用genexp。这还有一个小怪癖:没有终端
\n
,尽管这可能并不重要。
>>> 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