生成器进阶

# 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}
原文地址:https://www.cnblogs.com/Ebola-/p/8185445.html