博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python生成器
阅读量:6509 次
发布时间:2019-06-24

本文共 2100 字,大约阅读时间需要 7 分钟。

一 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-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)) # 刚开始拿数据# 生成器记录的是代码

 

转载于:https://www.cnblogs.com/tcpblog/p/9671001.html

你可能感兴趣的文章
win7 蛋疼的时间格式转化
查看>>
while死循环问题-输入字符就会死循环
查看>>
C++中二维数组的动态创建与处理
查看>>
SPOJ 10628 COT - Count on a tree(在树上建立主席树)(LCA)
查看>>
general error c1010070: Failed to load and parse the manifest
查看>>
SpringInAction--Bean参数的自动注入
查看>>
AndroidStudio打包apk,安装出现签名冲突--解决办法
查看>>
Android开发中保存数据的四种方法方法
查看>>
文曲星猜数字游戏6步算法(含代码)
查看>>
php.ini 中文版[转]
查看>>
easyui refresh 刷新两次的解决方法(推荐)
查看>>
Transfer-Encoding: chunked,TE and Trailer
查看>>
关于BCS与SQL
查看>>
xz文件如何解压
查看>>
【实用类String】String类方法的应用案例:查找判断指定字符出现的次数和位置...
查看>>
HDU 2073 无限的路
查看>>
14DBCP连接池
查看>>
为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
查看>>
源码安装Nginx以及用systemctl管理
查看>>
利用R语言进行交互数据可视化(转)
查看>>