DAY12-----生成器

一丶生成器

生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样

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)) # 才会开始真正的取数据
原文地址:https://www.cnblogs.com/lilei1996/p/9669304.html