# def generator():
# content = yield 1
# print(content)
# yield 2
# g = generator()
# ret = g.__next__()
# print(ret)
# ret = g.send('hollo')
# send获取下一个值的效果和next基本一致
# 只是在获取下一个值的时候给上一个yield传递一个参数
# 使用send的注意事项
# 1,第一次使用生成器的时候给上一个yield的位置传递一个数据
# 2,最后一个yield不能接受外部的值的(一般来说想连续是用send,但后面无返回值或者已经不需要的时候可以设置一个yield,后面不用返回值也可以)
# 获取移动平均值
# def average():
# sum = 0
# count = 0
# avg = 0
# while True:
# num = yield avg
# sum += num
# count += 1
# avg = sum/count
# avg_g = average()
# avg_g.__next__()
# avg1 = avg_g.send(10)
# avg1 = avg_g.send(20)
# print(avg1)
# 预计生成器的装饰器
def init(f):
def inner(*args,**kwargs):
set = f(*args,**kwargs)
set.__next__()
return set
return inner
@init
def average():
sum = 0
count = 0
avg = 0
while True:
num = yield avg
sum += num
count += 1
avg = sum/count
avg_g = average()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)
生成器表达式以及列表推导式
区别
1,括号不一样
2,返回的值不一样 ==== 几乎不占内存
列表表达式和生成器表达式
1、列表表达式
简化代码,返回的必须是一个列表
#普通代码 result=[] for i in [1,2,3] result.append[i*i] print(result) #列表表达式 print([i*i for i in [1,2,3]])
(1)30内能被3整除的数的实例
print([i for i in range(1,31) if i%3==0])
(2)找到嵌套列表中有两个‘e’的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] print([for list in names for name in list if name.count('e')==2])
2、生成器表达式
把列表解析的[]换成()得到的就是生成器表达式;列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
laomuji=('鸡蛋%s' %i for i in range(10)) #生成器表达式 print(laomuji) #返回生成器地址<generator object <genexpr> at 0x000001E17AF23BA0> print(next(laomuji)) #输出结果为:鸡蛋0 print(laomuji.__next__()) #输出结果为:鸡蛋1 print(next(laomuji)) #输出结果为:鸡蛋2 #next(laomuji)等价于laomuji.__next__()
3、字典推导式
#将字典键与值对调 mcase = {'a': 10, 'b': 34} print({mcase[k]:k for k in mcase})
4、集合推导式
自带去重功能,将列表解析式的[]换成{}得到集合推导式
print({i*i for i in [1,-1,2]}) #结果为{1,4}