range对象
range类型表示不可变的数字序列,通常用于在for循环指定的次数。
class range(start,stop,step)
start
start 形参的值 (如果该形参未提供则为 0)
stop
stop 形参的值
step
step 形参的值 (如果该形参未提供则为 1)
注意事项 a. range构造器的参数必须为整数(可以是内置的int或任何实现了__index__特殊方法的对象)。如果省略start参数,其默认值为0,若step为零则会引发ValueError。
b. step为正值,确定range内容的公式为r [ i ] = start + stepi 其中i >=0且r [ i ] < stop。
c.step为负值,确定range内容的公式仍然为r [ i ] =start + stepi,但限制条件改为i >= 0且r [ i ] >stop。
d.如果r [ 0 ]不符合值的限制条件,则该range对象为空。range对象确实支持负索引,但是会将其解读为从正索引所确定的序列的末尾开始索引。
#一些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))
[]
>>> list(range(1, 0))
[]
range类型相比常规list或tuple的优势在于一个range对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了start,stop和step的值,并会根据需要计算具体单项或子范围的值)。
yield的使用
yield的功能类似于return,但是不同之处在于它返回的是生成器。
生成器:
生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。
如果一个函数包含yield关键字,这个函数就会变为一个生成器。
生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。