迭代器的介绍
1.
迭代(iterate)意味着重复多次,就像循环那样(list, tuple)
2.
实现了方法iter的对象是可迭代的,而实现了方法next的对象是迭代器
3.
调用方法next时(或next()),迭代器返回其下一个值
4.
如果迭代器没有可供返回的值,触发StopIteration异常
如何从迭代器创建序列
//通过可迭代对象调用内置函数iter,可获得一个迭代器
l = [1,2,3,4,5] //列表l,是一个可迭代对象
ll = iter(l) //获得迭代器
ll.next()或者next(ll) //用next()可以顺序取值
//做一个迭代器
class PowNumber(object):
//迭代器 1,2,3,4,5,6..的平方
value = 0
def __next__(self):
self.value += 1
if self.value > 10: //要加入一个跳出口,不然会无限迭代
raise StopIteration
return self.value * self.value
def __iter__(self): //迭代器必须包含__next__和__iter__
return self
if __name__ = '__main__':
pow = PowNumber()
//手动迭代
print(next(pow)) //1
print(next(pow)) //4
print(next(pow)) //9
print(next(pow)) //16
//循环迭代器
for i in pow:
print(i)
生成器的介绍
1.
生成器是一种使用跟普通函数语法定义的迭代器
2.
包含yield语句的函数都被成为生成器
3.
不适用return返回一个值,而是可以生成多个值,每次一个
4.
每次使用yield生成一个值后,函数都将冻结,即在此停止执行
5.
被重新唤醒后,函数将从停止的地方开始继续执行
// code实现
def pow():
yield 1
yield 2
yield 3
yield 4
def pow_number():
return (x * x for x in [1,2,3,4,5]) //列表推导式,用( )会得到一个generator生成器,用[ ]会得到一个列表
//return [x * x for x in [1,2,3,4,5]]
def pow_number2():
for x in [1,2,3,4,5]:
yield x * x
if __name__ == '__main__':
rest = pow_number2() //得到一个generator对象
print(next(rest)) //
//生成器是一种特殊的迭代器,也有三种方式可以拿到里面的值
//1, l.__next__()
//2, next(l)
//3, for循环
用迭代器和生成器模拟range()函数
def use_range():
//python内置的range函数
for i in range(5, 10):
print(i)
class IterRange(object):
//用迭代器模拟range
def init(self, start, end):
self.start = start - 1
self.end = end
def __next__(self):
self.start += 1
if self.start >= self.end:
raise StopIteration
return self.start
def __iter__(self): //迭代器最少要包括 __next__ __iter__两个方法
return self
class GenRange(object):
//用生成器模拟range
def init(self, start, end):
self.start = start - 1
self.end = end
def get_num(self):
while True:
if self.start >= self.end - 1:
break
se;f.start += 1
yield self.start
//用写成函数面向过程的方式模拟range
def get_num(start, end):
start -= 1
while True:
if start > = end -1:
break
start += 1
yield start
if name = 'main':
use_range()
print('--------------')
iter = IterRange(5, 10)
print(next(iter))
print(list(iter)) //迭代器模拟range
gen = GenRange(5, 10)
print(next(gen))
print(list(gen)) //生成器模拟range
gen_f = get_num(5, 10)
print(gen_f)
print(list(gen_f))