一丶生成器
生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样
print("__iter__"in dir(gen))
生成器函数:函数中带有yield,执行生成器函数的时候返回生成器,而不是执行这个函数
def func
print("你好啊,我叫赛利亚")
yield"西岚的武士刀" #retunrn和yield都可以返回数据
ret=func() #ret是一个生成器
print(ret)
s=__next__() #当执行到__next__()的时候,函数菜真正开始执行
print("接收的是",s)
特点:
1.节省内存,几乎不占内存
2.惰性机制
3.只能往前走
send()也可以实现类似__next__()的效果,send()可以给上一个yild传值
def func()
print("韭菜盒子")
a=yield"哇哈哈"
print("肉包子"a)
b=yield"脉动"
print("锅包肉",b)
yield"冰红茶"
gen=func
ret=gen.__next__()
print(ret)
ret=gen.send("刘德华") #给上一个yield传值
print(ret)
send和__next__()的区别
1.send不可以开头
2.send可以给上一个yield传值,不能给最后一个yield传值
3.生成器本质是迭代器.print("__iter__"in dir(gen))
4.生成器可以直接用for
lst=list(gen)#把生成器中的每一个数据拿出来组合成一个列表
print(lst)
二丶推导器
列表:[结果 for循环 if筛选]
获取1-100内能被3整除的数
lst = [i for i in range(1, 101) if i % 3 == 0]
# 100以内能被3整除的数的平⽅
lst = [i*i for i in range(1, 101) if i % 3 == 0]
寻找名字中带有两个e的⼈的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
lst = [name for first in names for name in first if name.count("e") >= 2 ]
print(lst)
字典:{key:value for循环 if 筛选}
lst1 = ["东北", "陕西", "山西", "开封", "杭州", "广东", "济南"]
lst2 = ['大拉皮', "油泼面", "老陈醋", "灌汤包", "西湖鲤鱼", "早茶", "胶东一锅鲜"]
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
集合推导器 无需不重复 可哈希
{key for if}
元祖没有推导式
三丶生成器表达式
生成器表达式:记录一下代码.然后每次需要的时候去生成器中执行这个代码
列表推导式:一次性把所有的数据创建出来,容易产生内存浪费
特性
1.节省内存
2.惰性机制
3.只能向前
生成器函数
def func():
print(111)
yield 222
g = func() # 生成器
g1 = (i for i in g) # 生成器
g2 = (i for i in g1) # 生成器
print(list(g1)) # 222
print(list(g2))
print(list(g)) # 才会开始真正的取数据