-4

为什么这段代码:

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

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

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

编辑 - 我不明白它是如何一步一步得到这个表格的。col是指列数吗?因为即使列的输入是(行+1),列数等于行数也是没有意义的。

4

2 回答 2

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):这一行与上一行类似;nowcol是列表中的值之一,从.0中存储的值开始计数row。所以如果row2在外循环的这次迭代中,内循环将运行 3 次。第一次col将相等0,第二次1和第三次将相等2。(对于这些col值中的每一个,row将保持2,因为row仅在外部循环经过迭代时才会更改。)
  • print "*",这是*s 实际打印的地方。这里棘手的一点是行尾的逗号。不带逗号的print语句只打印一些内容,然后移至下一行。当您添加逗号时,它基本上会打印该行,但在该行之后添加一个空格而不是一个新行 ( \n)。因此,由于对每个col值都调用了这一行,因此它将*在一行上为每个值打印 a 后跟一个空格col
  • print请注意,这不在 col 循环内。该语句只打印一个换行符。这里的想法是在打印每一行之后打印一个新行,以便*将下一行的 s 添加到新行,而不是前一行。如果这print不在这里,所有的星星都将打印在一行上。

因此,对于每个值,该程序在一行上row打印s 的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]。)

于 2012-09-08T05:47:24.910 回答
1

你的代码告诉它这样做。假设n = 5。然后你跳入for循环。第一次通过 var 行是 0。因此,当您为列启动第二个 for 循环时,您编写xrange(row+1). 好吧,如果 row 为 0,则 row + 1 = 1。所以它将显示一个星号。然后跳到第一个 for 循环。好的,第二次迭代,变量 row 变为 1。因此,row + 1 = two,所以当你再次进入第二个 for 循环时,它会循环直到 hit 命中两个。然后重新开始,这个过程会不断重复,直到你有 5 行,每行都有足够的列来满足该行 + 1 列。只需一步一步地按照代码进行操作。

于 2012-09-08T05:18:51.287 回答