range()函数给我带来了麻烦

时间:2014-10-01 15:18:19

标签: python range

如果我输入这样的内容,我会得到这些值:

print range(1,10) 
[1,2,3,4,5,6,7,8,9]

但是如果我想在for循环中使用相同的值,那么它将从0开始,这是我的意思的一个例子:

for r in range(1,10):
    for c in range(r): 
        print c,
    print ""

输出是这样的:

0 
0 1 
0 1 2 
0 1 2 3 
0 1 2 3 4 
0 1 2 3 4 5 
0 1 2 3 4 5 6 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 8

为什么0在这里?不应该从1开始到9结束吗?

4 个答案:

答案 0 :(得分:3)

您正在循环中创建第二个 range()对象。默认起始值​​为0

每次迭代都会在range(r)上创建一个循环,意味着范围从0到r,独占,以生成输出数字。对于range(1),这意味着您会获得一个仅包含[0]的列表,而range(1)则会获得[0, 1]等等。

如果您想生成从1到r 包含`的范围,只需在实际打印的数字上加1:

for r in range(1,10):
    for c in range(r): 
        print c + 1,
    print ""

或范围从1到r + 1

for r in range(1,10):
    for c in range(1, r + 1): 
        print c,
    print ""

两者都产生您的预期输出:

>>> for r in range(1,10):
...     for c in range(r): 
...         print c + 1,
...     print ""
... 
1 
1 2 
1 2 3 
1 2 3 4 
1 2 3 4 5 
1 2 3 4 5 6 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 9 
>>> for r in range(1,10):
...     for c in range(1, r + 1): 
...         print c,
...     print ""
... 
1 
1 2 
1 2 3 
1 2 3 4 
1 2 3 4 5 
1 2 3 4 5 6 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 9 

答案 1 :(得分:2)

  • 如果只将一个参数传递给range函数,它会将其视为结束值(不包括它),从零开始。

  • 如果将两个参数传递给range函数,它会将第一个值视为起始值,将第二个值视为结束值(不包括它)。

  • 如果将三个参数传递给range函数,它会将第一个值视为起始值,将第二个值视为结束值(不包括它),将第三个值视为步骤值。

您可以通过此类

进行少量试运行来确认这一点
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]    # Default start value 0
>>> range(5, 10)
[5, 6, 7, 8, 9]                   # Starts from 5
>>> range(5, 10, 2)
[5, 7, 9]                         # Starts from 5 & takes only the 2nd element

答案 2 :(得分:2)

不。

for r in range(1,10):
    for c in range(r): 
        print c,
    print ""

range(),当只给出一个参数时,将数字从0打印到参数,不包括参数:

>>> range(6)
[0, 1, 2, 3, 4, 5]

因此,在代码的第三次迭代中,会发生以下情况:

for r in range(1,10): # r is 3
    for c in range(r): # range(3) is [0,1,2]
        print c, #you then print each of the range(3), giving the output you observe
    print ""

答案 3 :(得分:0)

https://docs.python.org/2/library/functions.html#range

来自文档:

参数必须是普通整数。如果省略step参数,则默认为1.如果省略start参数,则默认为0。