range()函数

阅读: 40442     评论:13

在C语言中,如果想要循环一个变量从1到100,要怎么写呢?

for(i = 1,i<=100,i++)

你在C的代码中,几乎随处可见上面的for循环。Python非常贴心,为我们设计了range函数,直接实现上面的功能。range函数是内置函数,无须特别导入,在任何地方都可以直接使用它。下面看一下具体用法:

1.提供一个数字参数,直接遍历数字:

for i in range(10):
    print(i) 

## 结果:
0
1
2
3
4
5
6
7
8
9

从结果中,可以看出,只给一个数字类型参数,range会遍历从0到参数减1的数字。要特别注意,range默认从0开始,到参数减1,也就是左闭右开的规则,这也是Python很多地方的规则,比如切片。

2.也可以指定遍历的区间:

for i in range(1, 12):
    print(i)

## 结果:
1
2
3
4
5
6
7
8
9
10
11

类似range(1, 12)的调用,会遍历从1到11的数字,左闭右开.

3.还可以指定步长,就像切片一样

for i in range(1, 12, 2):
    print(i)

## 结果:
1
3
5
7
9
11    

4.但更多的时候是结合range和len函数,遍历一个序列的索引

a = ['Google', 'Baidu', 'Huawei', 'Taobao', 'QQ']
for i in range(len(a)):
    print(i, a[i]) 

range函数是Python使用频率非常高的一个内置函数,它除了以上的使用特点外,还具有类似生成器的特性,这里先看个例子:

for i in range(1000000000000000000000000000000000):
    print(i)
    if i > 10:
        break

range的参数是个多大的数我反正是眼花了,数不过来,但可以肯定的是,如果为了实现这个for循环,而事先在内存中准备好从1到10000000000000000000000000这么多个数,那么你的内存肯定溢出了,死机是正常的。不用怀疑,大多数情况下程序都是这么干的。不同的是,range在内部的实现机制上,并不会直接在内存中一次性生成如此多的数,而是需要一个就生成一个,然后返回一个,这样不但节省了内存,也防止了上面例子中数字过大而无法表示的情况。

另外要注意,range下面的用法,不会有任何结果,也不会弹出异常:

>>> for i in range(1, 10, -2):
    print(i)

# 什么都没发生    
>>> for i in range(10, 1):
    print(i)

# 什么都没发生    
>>> 

但是如果这么做,却是可以的:

>>> for i in range(10,1,-1):print(i)

10
9
8
7
6
5
4
3
2

总结出什么经验了吗?如果你要用负数步长,那么你的区间设定就要从大到小;如果你的区间设定是从大到小,那么你就需要使用负数步长,这和列表的切片特性是一样样的。


 变量作用域 递归函数 

评论总数: 13


点击登录后方可评论

4那里 a = ['Google', 'Baidu', Huawei', 'Taobao', 'QQ'] Huawei 少了个'号啊



已经修改,感谢指出!



for i in range(10,0,-1):#这里用的是逗号不是冒号 print(i) >>>>10,9,8,7,5,6,5,4,3,2,1,0#注意这里有10 for i in range(0,10): print(i) >>> 0 1 2 3 4 5 6 7 8 9#这里面没有10



range函数函数里面的参数过大会报OverflowError的错误



没碰到过溢出的错误。



博主,range函数不是生成器也不是迭代器吧?



你是对的,range不是生成器也不是迭代器,是本身独有的range类。



这教程是众多 python教程中的 三星盖世s9



本教程的内容编写、发布、校阅等等都是博主自己个人完成的,没有什么小编哦^-^.



为博主打call!



注意,range()不支持倒序和负数步长! -------------------分割线------------------------- 没有报错的原因: In [58]: list( range(10,2)) Out[58]: [] 因为是空的,for循环在执行的时候,迭代的结果为空,所有就不执行了: 其实是支持倒序和负数步长的: In [56]: list( range(10,2,-1)) Out[56]: [10, 9, 8, 7, 6, 5, 4, 3] ----------------------分割线---------------- 这里不太严谨



要特别注意,range默认从0开始,到参数减1,也就是左闭右开的规则,这也是Python很多地方的规则,比如切片。 认真的看一下,其实已经都包括了



如果你要反向取的话: 起始的位置和结束的位置就需要改变,因为方向变了, list(range(20,2,-2)), 但是我觉得按照规则进行,那么舒服,反着没有什么价值。