首页 > 编程语言 > 详细

python 生成器

时间:2020-07-29 19:46:02      阅读:57      评论:0      收藏:0      [点我收藏+]
# 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(可迭代对象) 可以转换为 迭代器

python 生成器

原文:https://www.cnblogs.com/xwyjh/p/13398666.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!