码迷,mamicode.com
首页 > 编程语言 > 详细

python生成器

时间:2018-09-18 20:42:05      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:range   李彦宏   循环   list()   hello   lis   list   val   列表   

一 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 for x 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-3
def 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生成器

标签:range   李彦宏   循环   list()   hello   lis   list   val   列表   

原文地址:https://www.cnblogs.com/tcpblog/p/9671001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!