生成器
- python2.7中rang()和xrang()都表示生成一定范围的值
- rang()会返回一个集合,值一次性创建出来
- xrang()会返回一个生成器,里面没有值,当迭代的时候才逐个创建,节省内存
- 生成器:具有生成某个东西的能力,在需要用到的时候才创建
def myrang():
print('1')
yield 1
print('2')
yield 2
print('3')
yield 3
ret = myrang()
print(ret) # <generator object myrang at 0x10217a8e0>
r1 = ret.__next__()
print(r1)
r2 = ret.__next__()
print(r2)
r3 = ret.__next__()
print(r3)
r4 = ret.__next__() # 报错
print(r4)
- 生成器函数 & 生成器
- 当函数中含有关键字yield(生成)时,该函数为生成器函数
- 执行生成器函数,函数内部代码不会执行,会返回一个生成器
- 当生成器调用__next__()会执行一下,有多少个yield,就可以执行多少次__next__(),如果__next__()次数超过yield个数,则报错
- 当函数题内部遇到return,则return后面的代码不会再执行,即使还有yield
- 自定义xrang(2.7)|rang(3.x)
def myrang(num):
cur = 0
while True:
if num <= cur:
return
yield cur
cur += 1
迭代器
- 生成器具有生成某个东西的能力,但是如果不去调用__next__()函数,则不会生成值
- 如果要把生成器中的内容拿出来可要用到迭代器
- 迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
it = iter([1,2,3,4,5])
ret = it.__next__()
print(ret)
ret = it.__next__()
print(ret)
b = it.__next__()
print(b)
- 通过for循环可以帮我们实现迭代,同时自动判断是否还有__next__()