# 1.next 函数*************************************************************
# 斐波那契方法
def fibonacci():
numbers = []
while True:
if len(numbers) <2:
numbers.append(1)
else:
numbers.append(sum(numbers))
numbers.pop(0)
yield numbers[-1]
gen = fibonacci()
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# 2.StopIteration *************************************************************
def my_generator():
yield 1
yield 2
raise StopIteration #后续的代码不会继续执行
yield 3
# 2.生成器之间的交互*************************************************************
#普通的生成器
def sqare():
"求平方"
cursor = 1
while True:
yield cursor**2
cursor +=1
s = sqare()
# print(next(s))
# print(next(s))
# print(next(s))
# print(next(s))
# 有交互生成器
def sqare_vi():
"求平方"
cursor = 1
response = None
while True:
if response:
response = yield response**2
continue
response = yield cursor **2
cursor +=1
s = sqare_vi()
print(next(s))
print(next(s))
print(s.send(7))
print(s.send(9))
print(next(s))
print(next(s))
# *************************************************************
# 标准库的生成器
# python2 python3
# xrange range
# iterkeys keys
# itervalues values
# iteritems items
# zip zip
# map map
# 文件对象 文件对象
z = zip([1,2,3,4,4],[6,7,8,9])
# print(next(z))
# print(next(z))
# print(next(z))
# print(next(z))
# print(next(z))
m = map(lambda x,y :max([x,y]),[4,1,7],[3,4,5])
print(next(m))
# 文件对象
f = open(‘test.txt‘,‘r‘)
# print(next(f))
# print(next(f))
# print(next(f))
# print(next(f))
# next(f) 与 readline 的区别: 当文件读到最后一行,readline捕获StopIteration异常,并返回‘‘字符串
# 何时需要生成器*************************************************************
# 1,分块读取数据
# 2.分块计算数据
# 生成器内部的生成器*************************************************************
def gen1():
yield ‘foo‘
yield ‘bar‘
def gen2():
yield ‘spam‘
yield ‘eggs‘
def full_gen():
for i in gen1():
yield i
for j in gen2():
yield j
# for m in full_gen():
# print(m)
# m = full_gen()
# print(next(m))
import itertools
def full_gen1():
for word in itertools.chain(gen1(),gen2()):
yield word
full1 = full_gen1()
# print(next(full1))
# print(next(full1))
# print(next(full1))
# print(next(full1))
# 从python3.3后提供了一个更干净的语法
def gen_full2():
yield from gen1()
yield from gen2()
full2 = gen_full2()
# print(next(full2))
# print(next(full2))
# print(next(full2))
# print(next(full2))
迭代器:
只要定义了 __next__方法,就是一个迭代器
生成器也是一种迭代器,但是只能迭代一次,因为只保存一次值
yield a
next(yield 对象) 进行遍历
可迭代对象: 只要定义了 __iter__ 方法就是一个可迭代对象 列表,字符串,元组,字典和集合都是可迭代对象
使用 iter(可迭代对象) 可以转换为 迭代器
原文:https://www.cnblogs.com/xwyjh/p/13398666.html