python生成器,,一 python生成


一 python生成器

1 生成器的本质就是迭代器.(可迭代对象)
生成器由生成器函数来创建或者通过生成器表达式来创建

def p():

  print("hello world !")

  yield

gen = p() # gen就是一个生成器,每次取p()都会是一个新的生成器

gen_other = p() gen 和gen_other是两个生成器

2. 生成器函数 生成器函数:在函数中return换成yield. 这个函数就是生成器函数

def func():

  yield

gen = func() 函数并不会被执行, 而是创建一个生成器对象

取值:

gen.__next__() 下一个

gen.send() 可以给上一个yield传值, 第一次执行不能用send()

def func():

  a = None

  for i in range(50):

    print(i)

   a = yield (i,a)

gen = func()

print(gen.__next__())

print(gen.send("发票"))

>>>0

  (0, None)

  1

  (1, "发票")

  

特性:

  1. 节省内存 (不获取执行结果是不执行,获取是按照yield的位置端点,可以避免数据过多是占用内存)

  2. 惰性机制 (不主动获取是,不执行结果,用__next__()或者下一个yield之前的数据)

  3. 只能向前(同一个生成器,执行按协定的顺序来,执行完毕之后不再重复执行)

3. 各种推导式
1.列表推导式: [结果 for循环 if条件]

  li = [x forx in range(5)]

  print(li)

  >>>[0, 1, 2, 3, 4, 5]
2.字典推导式: { key: value for循环 if条件}

  dic = {k:k+10 for k in range(3) }

  print(dic)

  >>>{0: 10, 1: 11, 2: 12, 3: 13}
3.集合推导式: {key for循环 if条件}

  se = {x for x in ["a", "a", "b","c", "1", "2", "1"]}

  print(se)

  >>>{"a", "b", "c", "1", "2"}

4 生成器表达式

  (结果 for循环 if条件)

惰性机制 记录在内存中的一段代码

  gen = (x for x in range(5)) #小括号中的它就是一个生成器表达式可以使用__next__(), 含有__iter__()

  gen.__next__()

  >>>0

  for i in gen :

  print(i)

  >>> 1

    2    

    3  

    4  

for E

1---------

# def func():
# for i in range(1, 10000):
# yield "衣服%s" % i
#
# gen = func()
# for i in range(50):
# yf = gen.__next__()
# for i in range(50):
# yf = gen.__next__()
# for i in range(50):
# yf = gen.__next__()

2-----------

def func():    yield "麻花藤"    yield "李彦宏"    yield "马云"    yield "刘强东"gen = func()# print(gen.__next__()) # 麻花藤# print(gen.__next__()) # 麻花藤# print(gen.__next__()) # 麻花藤# print(gen.__next__()) # 麻花藤# 生成器的本质是迭代器.# print("__iter__" in dir(gen))## # 生成器可以直接使用for循环# # for el in gen:# #     print(el)## lst = list(gen) # 把生成器中的每一个数据拿出来组合成一个列表# print(lst)

3 -----

def add(a, b):    return a + b# 生成器函数, 0-3def test():    for r_i in range(4):        yield r_i# 获取到生成器g = test() # 惰性机制for n in [2, 10]:    g = (add(n, i) for i in g)  # 循环的内部也是一个生成器#  __next__()# list()print(list(g)) # 刚开始拿数据# 生成器记录的是代码

python生成器

评论关闭