为什么这段代码:
n = int(raw_input("How many rows? "))
for row in xrange(n):
for col in xrange(row+1):
print "*",
print
显示此结果(当n = 5时)?
*
* *
* * *
* * * *
* * * * *
编辑 - 我不明白它如何逐步获得此表单。 col是否意味着列数?因为列数等于行数没有意义,即使列的输入是(行+ 1)。
答案 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列。只需一步一步地遵循代码。