Python range知识点总结

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*ii >= 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,因此为空
[]

注意以上为空的情况。

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值