概述
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是可迭代对象而不是迭代器?
主要因为迭代器是有状态的,只能遍历一次,而可迭代对象是没有状态的。
因此下面的代码:
>>> numbers = range(3)
>>> tuple(numbers)
(0, 1, 2)
>>> tuple(numbers)
(0, 1, 2)
对于numbers是可迭代对象,每次去初始化tuple时,都会获取新的迭代器,因此可以多次进行初始化别的容器。而这种需求在Python中经常被使用,因此将range不设计成迭代器是正确的。
而下面代码段:
>>> 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将为空。
>>> 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 range知识点总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复