生成器初始

#-*- encoding:utf-8 -*-

#为了节省空间等原因,自己实现的能实现生成器功能的就叫生成器
#生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。
# yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
#生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

#初始生成器之定义生成器
# def generator_func():
# a=1
# print('a的值是:')
# yield a
# b=2
# print('b的值是:')
# yield b
# print(generator_func())
# g=generator_func()
# print(next(g))
# print(next(g))

#初始生成器之定制衣服2000000
# def produce():
# for i in range(2000000):
# yield "生产了第%s件衣服"%i
# gene=produce()
# print(gene.__next__())
# print(next(gene))
# num=0
#生成器他首先是一个可迭代对象,所以是可以for循环调用的。就是通过for循环,调用next方法
# for i in gene:
# print(i)
# num+=1
# if num==5:
# break

###更多应用1:文件监控示例
# import time
# def tail(filename):
# f = open(filename,'r',encoding='utf-8')
# f.seek(0, 2) #从文件末尾算起
# while True:
# line = f.readline() # 读取文件中新的文本行
# if not line: #如果行为空
# time.sleep(0.1)
# continue
# yield line
# tail_g = tail('tmp')
# for line in tail_g:
# print(line)

#send
#send 获取下一个值的效果和next基本一致
#只是在获取下一个值的时候,给上一个yield的表达式传递一个数据
#使用send的注意事项
# 第一次使用生成器的时候 是用next获取下一个值
# (因为第一次执行生成器函数的时候,不存在上一个yield表达式)
# 最后一个yield不能接受外部的值
# def generator():
# print(123)
# content = yield 1
# print('=======',content)
# print(456)
# yield 2
#
# g = generator()
# ret = g.__next__()
# print('***',ret)
# ret = g.send('hello') #send的效果和next一样
# print('***',ret)

#计算移动平均值
# def averager():
# total=0.0
# count=0
# average=None
# while True:
# term=yield average #这里的yield实际的作用就是用来接收send值
# total+=term
# print('total:',total)
# count+=1
# average=total/count
# g_avg = averager()
# print(next(g_avg))#起到预激活的作用
# print(g_avg.send(10))
# print(g_avg.send(30))
# print(g_avg.send(5))
###装饰器,预激活
def init(f):
def inner(*args,**kwargs):
g=f(*args,**kwargs)
next(g)
return g
return inner
@init
def average():
sum=0
count=0
ave=0
while True:
term=yield ave
# print(term)
count+=1
sum+=term
ave=sum/count
g=average()
print(g.send(100))
# print(g.send(200))
# print(ave2)

转载于:https://www.cnblogs.com/lixiaoxuan/articles/8966370.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值