为什么这个程序会给出这个结果?

时间:2012-09-08 04:55:25

标签: python

为什么这段代码:

n = int(raw_input("How many rows? "))
for row in xrange(n):
    for col in xrange(row+1):
        print "*",
    print

显示此结果(当n = 5时)?

*
* *
* * *
* * * *
* * * * *

编辑 - 我不明白它如何逐步获得此表单。 col是否意味着列数?因为列数等于行数没有意义,即使列的输入是(行+ 1)。

2 个答案:

答案 0 :(得分:3)

好吧,让我们一行一行地思考,就好像我们是电脑一样。

  • n = int(raw_input("How many rows? "))我们获取用户输入的内容,将其转换为整数,并将结果存储在n中。
  • for row in xrange(n):我们正在循环xrange(n),这与[0, 1, 2, 3, 4]大致相同(尽管xrange不会立即存储完整列表,并且所以内存效率更高)。所以现在我们知道,每当我们将来看到row时,我们就必须将它们替换为我们所使用的那些数字中的任何一个。
  • for col in xrange(row+1):此行与上一行类似;现在col是从0计算到row中存储的值的列表中的值之一。因此,如果row在外循环的此迭代中为2,则内循环将运行3次。第一次col将等于0,第二次1,第三次等于2。 (对于每个col值,row将保留2,因为row仅在外循环经历迭代时发生更改。)
  • print "*",这是实际打印*的地方。这里棘手的一点是该行末尾的逗号。没有逗号的print语句只打印一些内容然后移动到下一行。当您添加逗号时,它基本上会打印该行但在行后面添加一个空格而不是新行(\n)。因此,由于每个col值都会调用此行,因此会为每个*值打印一个col后跟一行空格。
  • print请注意,这不在col循环中。该语句只打印一个换行符。这里的想法是在每行打印后打印一个新行,以便将下一行的*添加到新行,而不是前一行。如果此print不在此处,则所有星星都会打印在一行上。

因此,对于每个row值,此程序会在一行上打印row+1*个。

回答问题编辑:

我可以看到col如何成为一个令人困惑的名字。 col只是正在打印的*当前列号。要更清楚地了解此情况,请尝试将print "*",替换为print col,。你应该得到以下内容:

0
0 1
0 1 2
0 1 2 3
0 1 2 3 4

(请注意,range(3)生成[0,1,2],而range(3+1)生成[0,1,2,3]。)

答案 1 :(得分:1)

你的代码告诉它做那个。说n = 5。然后你跳进for循环。 var row第一次为0.因此,当你为列启动第二个for循环时,你会写xrange(row+1)。好吧,如果row为0,那么row + 1 = 1.所以它将显示一个星。然后踢出第一个for循环。好的,第二次迭代,变量行变为一。因此,row + 1 = 2,所以当你再次输入第二个for循环时,它将循环直到命中两次。然后重新开始,并且该过程重复进行,直到您有5行,每行有足够的列来实现该行+ 1列。只需一步一步地遵循代码。