Python中range经常被用到生成序列。
1、range在Python 2.7* 和Python 3.*中是不同的东西。
Python2中range是内嵌函数,返回值是列表,而Python3中是类,返回值是对象,需要使用list来转换成列表。
因此,代码print (range(5))的结果可要分情况说明:
在Python2中结果:[0,1,2,3,4],
在Python3中结果:range(0, 5).
type(range(5))的结果也要分情况说明:
在Python2中结果:<type 'list'>,
在Python3中结果:<class 'range'>
2、Python3中类range是一个迭代器吗?
注意,类range是可迭代对象,而不是一个迭代器。此处要区分可迭代对象和迭代器。
可迭代对象:实现了__iter__(),那么就是可迭代对象。
迭代器:实现了__iter__()和__next__(),那么就是迭代器。
因此迭代器一定是可迭代对象,可迭代对象不一定是迭代器。
那么为什么Python3中类range是可迭代对象而不是迭代器?
主要因为迭代器是有状态的,只能遍历一次,而可迭代对象是没有状态的。
因此下面的代码:
1
2
3
4
5>>> numbers = range(3) >>> tuple(numbers) (0, 1, 2) >>> tuple(numbers) (0, 1, 2)
对于numbers是可迭代对象,每次去初始化tuple时,都会获取新的迭代器,因此可以多次进行初始化别的容器。而这种需求在Python中经常被使用,因此将range不设计成迭代器是正确的。
而下面代码段:
1
2
3
4
5>>> numbers = iter(range(3)) >>> tuple(numbers) (0, 1, 2) >>> tuple(numbers) ()
numbers是迭代器,第一次使用numbers初始化tuple时,已经消耗掉numbers里的值,因此再次使用是,将得到空元祖。
3、为什么Python3中将range定义成类,而舍弃Python2中的函数?
这是由于range类型是一个迭代类型,他在for循环的每一次执行过程中,将动态的得到下一个值。而旧版本的range()由于返回值是一个list,所以在运行for循环之前就需要得到整个list的数值。如果range()的范围很大的话,这将会加重内存的负担,而range类型的这种动态生成的特性使得它能够使用更少的内存,快速的运行。
4、range的常规用法。
(1)、range
(stop):
相当于range(0, stop, 1),包括0,不包括stop。
(2)、range
(start, stop[, step])
如果step省略,则默认为1,如果start省略,默认是0,如果step为0,则将产生ValueError异常。
如果step>0,则每个数的计算方式:r[i] = start + step*i
且i >= 0
and r[i] < stop,
注意如果r[0]>=stop,则range将为空。
如果step<0,则每个数的计算方式:r[i] = start + step*i
, 且 i >= 0
and r[i] > stop,注意如果r[0]<=stop,则range将为空。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) # 相当于range(0,0,1),需要满足条件r[i]<stop,而r[0]=0=stop,因此此时为空 [] >>> list(range(1, 0)) # 相当于range(1,0,1),需要满足条件r[i]<stop,而r[0]=1>stop,因此为空 []
注意以上为空的情况。
最后
以上就是生动薯片最近收集整理的关于Python range知识点总结的全部内容,更多相关Python内容请搜索靠谱客的其他文章。
发表评论 取消回复