1. 一.昨日内容回顾
    惰性机制(只有执行__next__()才会取值)
    二.今日主要内容
    1.生成器
  2.  
  3. 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样.
    ※生成器记录的是代码
  4.  
  5. 2.生成器函数
    生成器函数: 在函数中return换成yield. 这个函数就是生成器函数
    def func():
    yield
  6.  
  7.      yield from iterable 相当于 for el in iterable: yield el
  8.  
  9. 取值:
    gen.__next__() 下一个
    gen.send() 可以给上一个yield传值,第一次执行不能用send(),不能给最后一个yield传值
  10.  
  11. gen = func() 函数并不会被执行,而是创建一个生成器对象
  12.  
  13. def func()
    print('你好啊,我叫赛利亚.')
    yield '西岚的武士刀' #return 和yield都可以返回数据
  14.  
  15. ret = func() #generator ret是一个生成器
    print(ret)
    s = ret.__next__()
    print(s)
  16.  
  17.      yield from:
          
  1. def func():
  2. lst = ["三国演义", "红楼梦", "北国的雪", "了不起的盖茨比"]
  3. # for el in lst:
  4. # yield el
  5. yield from lst
  6.  
  7. gen = func()
  8. print(gen.__next__())
  9. print(gen.__next__())
  10. print(gen.__next__())
  11. print(gen.__next__())
  1. def func():
  2. lst = ["三国演义", "红楼梦", "北国的雪", "了不起的盖茨比"]
  3. # for el in lst:
  4. # yield el
  5. yield from lst
  1. -------------生成器取值-------------------------
    def func():
    print(111)
    yield 222
  2.  
  3. g = func() # 生成器
  4.  
  5. g1 = (i for i in g) # 生成器
    g2 = (i for i in g1) # 生成器
  6.  
  7. # print(list(g)) # 才会开始真正的取数据
    print(list(g1)) # 222
    print(list(g2))
    print(list(g))
    --------------------------------------
    def eat():
    print("我吃什么啊")
    a = yield "馒头"
    print("a=",a)
    b = yield "⼤饼"
    print("b=",b)
    c = yield "⾲菜盒⼦"
    print("c=",c)
    yield "GAME OVER"
  8.  
  9. gen = eat() # 获取⽣成器
    ret1 = gen.__next__()
    print(ret1)
    ret2 = gen.send("胡辣汤") # a胡辣汤'赋值给a
    print(ret2)
    ret3 = gen.send("狗粮")
    print(ret3)
    ret4 = gen.send("猫粮")
    print(ret4)
    --------------------------------------
  10.  
  11. 库存10000件衣服,每次领用1
    def func():
    for i in range(10000):
    yield '衣服%s' % i
  12.  
  13. gen = func() #生成器 注意:生成器不能直接替换到下面yf中,否则会生成新的生成器
    yf1 = gen.__next__()
    yf2 = gen.__next__()
    yf3 = gen.next__()
    -----------------一次拿50个---------------------
    def func():
    lst = []
    for i in range(1, 10000):
    lst.append('衣服%s' % i)
    if i % 50 == 0:
    yield lst
    lst = []
  14.  
  15. gen = func()
    print(gen.__next__())
    print(gen.__next__())
    -----------------send()---------------------
    def func():
    print('韭菜盒子')
    a = yield '娃哈哈'
    print('肉包子', a)
    b = yield '脉动'
    print('锅包肉', b)
    yield '冰红茶'
  16.  
  17. gen = func()
    ret = gen.__next__()
    print(ret)
    # ret = gen.__next__()
    # print(ret)
  18.  
  19. ret = gen.send('大熊猫') #给上一个yield传值
    print(ret)
  20.  
  21. ret = gen.send('长颈鹿') #给上一个yield传值
    print(ret)
    --------------------------------------
    # 计算两个数的和
    def add(a, b):
    return a + b
  22.  
  23. # 生成器函数, 0-3
    def test():
    for r_i in range(4):
    yield r_i
  24.  
  25. # 获取到生成器
    g = test() # 惰性机制
  26.  
  27. for n in [2, 10]:
    g = (add(n, i) for i in g) # 循环的内部也是一个生成器 # 生成器记录的是代码
  28.  
  29. # __next__()
    # list()
  30.  
  31. print(list(g)) # 刚开始拿数据
  32.  
  33. --------------------------------------
    --------------------------------------
  34.  
  35. def func():
    print('拿出手机')
    print('打开陌陌')
    yield '手机'
    print('搜索附近的人')
    print('找到小姐姐')
    yield '电脑'
    print('我是最后一行')
  36.  
  37. gen = func()
    print(gen.__next__()) #打印到第一个yield
    print(gen.__next__()) #从上一次打印结束的位置开始打印到第二个yield, yield起到分段作用
    print(gen.__next__()) #报错. 打印完最后一行后找不到yield,所以提示StopIteration.
  38.  
  39. 3.各种推导式
    1.列表推导式:[结果 for循环 if条件]
    2.字典推导式:{key: value for循环 if条件}
    3.集合推导式: {key for循环 if条件}
  40.  
  41. 列表推导式:
    lst = ['python%s期' % i for i in range(1, 17)]
    print(lst)
  42.  
  43. --------------------------------------
    # 创建列表
    # for i in range(1,100,2):
    lst = [i for i in range(1, 100, 2)]
    print(lst)
  44.  
  45. lst = [i for i in range(1, 100) if i % 2 == 1]
    print(lst)
    在列表中装入python1期到python16
    lst = []
    for i in range(1, 17):
    lst.append('python%s期'i)
    print(lst)
  46.  
  47. --------------------------------------
    寻找名字中带有2e的名字
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
    ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
  48.  
  49. lst = [el2 for el in names for el2 in el if el2.count('e') >= 2]
    print(lst)
  50.  
  51. 字典推导式
    dic = {'张无忌': '九阳神功', '周芷若': '九阴真经', '楚留香': '帅'}
    d = {dic[k]: k for k in dic}
    print(d)
  52.  
  53. lst1 = ['东北' '陕西']
    lst2 = ['大拉皮儿' '油泼面']
    dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
    print(dic)
  54.  
  55. 集合推导式
    {key for if}
  56.  
  57. lst = [1, 1, 2, 2, 3, 3, 45]
    s = {el for el in lst}
    print(s)
  58.  
  59. 4.生成器表达式(笔试题)
    (结果 for循环 if条件)
    可以使用生成器表达式直接创建生成器
  60.  
  61. gen = (i for i in range(10)) #generator
    print(gen.__next__())
    print(gen.__next__())
  62.  
  63. 生成器表达式:记录一下代码.然后每次需要的时候去生成器中执行一次这个代码
    列表推导式: 一次性把所有的数据创建出来,容易产生内存浪费
  64.  
  65. 特点:
    1.节省内存
    2.惰性机制
    3.只能向前

Day12--Python--生成器,生成器函数,推导式,生成器表达式的更多相关文章

  1. python 生成器函数.推导式.生成器表达式

    一.生成器 什么是生成器,生成器的实质就是迭代器 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 1 def func ...

  2. day13 python生成器函数 推导式 生成器

    day13 python   一.生成器     生成器的本质就是迭代器     生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__())     由生成器函数或生成器表达式来创建   ...

  3. Python_Mix*生成器,生成器函数,推导式,生成器表达式

    生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...

  4. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  5. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  6. python全栈开发day13-迭代器、生成器、列表推导式等

    昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...

  7. python基础(14):生成器、列表推导式

    1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...

  8. python学习笔记013——推导式

    1 推导式简介 推导式comprehensions(又称解析式),是Python的一种独有特性. 推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 推导式有三种形式: 1)列表推导式 (li ...

  9. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

随机推荐

  1. Delphi数据集与记录

    1.1Delphi数据库应用程序的层次结构 Delphi数据库应用程序通过数据存取构件对数据库进行访问,通过可视的数据构件(Data Control)将数据呈现给用户,并与用户进行交互.Delphi数 ...

  2. CSAW 2016:Rock-100

    ELF文件 拖进ida 震惊: 这一堆堆都是什么神仙函数呀!! f5看一下伪代码 可以看出来 其实看起来函数很多 但是真正管用的函数也就那么几个 如果sub_4017E6的值是0 那么就会输出flag ...

  3. Clover file list

    /Volumes/EFI//EFI: total 4 drwxrwxrwx 1 jianweiliu staff 512 Apr 20 12:17 APPLE drwxrwxrwx@ 1 jianwe ...

  4. codeforces474D

    Flowers CodeForces - 474D 话说某个幸运的小伙伴X拿到了kevin女神送的蛋糕,然而他的吃法非常奇特,他独创了两种吃蛋糕的办法:一.一次吃一整个蛋糕:二.一次吃k个蛋糕. 那么 ...

  5. Nginx 针对建立TCP连接优化

    L:124 sysctl -a | grep file-max //通过命令查看系统最大句柄数 [root@3 ~]# sysctl -a | grep file-max fs.file-max = ...

  6. 大学实验3指导:利用单链表实现A-B

    实验目的:深入理解单链表的建立及操作 实验内容: 1.建立单链表A与B 2.实现主要的函数,查找.插入.删除等 3.实现操作A-B 步骤1:包含必要的函数库,对结构体LNode中的抽象数据类型Elem ...

  7. Python3入门基础--str常用方法

    Python基础之String常用方法 str():将其他类型的变量转换为str类型,例如: name = 'Jack' age = 22 course = ['web','Java','mysql' ...

  8. Linux 多网卡绑定bond

    mode=0:负载均衡模式,增加带宽,两块网卡使用的是同一个MAC地址,所以必须配置网卡相连的交换机,这两个端口应采用聚合方式. mode=1:主备模式,一个线断了,另一条自动备援. mode=6:负 ...

  9. 【转】MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC

    @2018-12-18 [小记] vs-2013 编译 cJSON code in git-hub 时遇见问题 error LNK2019,解决如下 [问题描述]MSVCRTD.lib(crtexew ...

  10. [Vani有约会]雨天的尾巴(树上差分+线段树合并)

    首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋z类型的救济粮. 然后深绘里想知道,当所有的救济粮 ...