python生成器笔记

生成器理解笔记

生成器函数

# yield 和 return 不能一起使用
# 尽量不在yield后面又代码,或者在最后只加一个yield
# send函数可以在效果上和next函数一致
# 但是send在返回yield值时,还会给上一个yiedl的地方传入一个值 比如 ret = yield 123
# send不能再最后一个yield地方使用
def generator():
	print(1)
	yield 'a'
	print(2)
	yield 'b'
# 生成器函数,也是一个迭代器,可以执行__next__()和__iter()__
# 完美监听文件输出的一个小例子
def tail(filename):
	f = open(filename, encoding='utf-8')
	while True:
		line = f.readline()
		if line.strip():
			# print("@@@", line) 
			yield line.strip() # 这里用yield,是为了方便对输出的语句进行统一的整改
g = tail("a_file")
for i in g:
	print("something you want to add or change", i)

生成器实例,移动平均值

# 我们在拿到生成器后,第一步取值一定是next,所以可以做一个装饰器来激活这个生成器
def init(func):
	def inner(*args, **kwargs):
		ret = func(*args, **kwargs)
		ret.__next__()
		return ret
	return inner
def avg():
	count = 0
	sum = 0
	avg = 0
	while True:
		num = yield avg
		sum += num
		count += 1
		avg = sum / count
g = avg()
avg1 = g.send(10)
print(avg1)
avg2 = g.send(12)
print(avg2)

# 一个生成器的小技巧,当函数内部的某些可迭代数据结构要分别输出的时候,可以参考以下例子
def a_generator():
	a = "lala"
	b = [1, 2, 3]
	yield from a
	yield from b
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值