day13 python
 
一.生成器
    生成器的本质就是迭代器
    生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__())
    由生成器函数或生成器表达式来创建
    其实就是手写的迭代器
 
二.生成器函数
    函数中如果有yield, 那么这个函数就是生成器函数. 调用生成器函数: 函数名(), 得到的是生成器, 这个时候不执行
    yield: 相当于return可以返回数据, 但是不会结束函数, 会往下走, 分段执行函数,
    rst.__next__() 执行函数, 执行到下一个yield
    rst.__next__() 继续执行函数, 执行到下一个yield
#普通函数
def func():
    return 1
print(func())
 
#生成器函数
def func():
    print('bajie')
    yield 1     #只需要把return改成yield, 此时不会执行你的函数, 得到的是生成器
    print('八戒')
    yield 2
print(func())
 
rst = func()            #获取的是生成器, 这个时候不执行
print(rst.__next__())   #本质是迭代器, 可以用 __next__ 方法, 此时会执行到下一个yield
print(rst.__next__())   #若没有下一个yield, 会在函数的结束前报错: StopIteration
    
    生成器函数的应用
#普通函数, 占内存
def order():
    lst = []
    for i in range(1, 10001):
        lst.append('clouse %s' % i)
    return lst
print(order())
 
#生成器函数
def order():
    for i in range(1, 10001):
        yield 'clouse %s' % i
rst = order()               #获取生成器(相当于老母鸡)
print(rst.__next__())       #几乎不占资源, 需要的时候生成
print(rst.__next__())       #惰性机制
print(rst.__next__())       #只能向前
    
    send()方法
    和__next_()一样, 可以执行到下一个yield, 同时还有另外一个功能, 可以给上一个yield位置传值
def func():
    print('one line')
    a = yield 123           #执行第一个__next__, 会在生成器中找到yield, 然后暂停, a = 这个没有执行, 如何解决 a 无值的问题?
    print(a)
    print('two line')
    b = yield 456
    print(b)
    print('stree line')
    c = yield 789
    print(c)
    print('four line')
    d = yield 666
 
g = func()
print(g.__next__())
print(g.send('---------'))  #给上一个yield结束的位置发送一个值
print(g.send('---------'))
print(g.send('---------'))
    
    生成器可以用for循环
def func():
    yield 1
    yield 33
    yield 222
    yield 4444
 
for i in func():        #for的内部一定有__next__()方法
    print(i)
 
print(list(func()))     #这种也可以拿到生成器的值, 内部也有__next__()方法
 
三.推导式
    循环装数据
lst = []
for i in range(1, 16):
    lst.append('python %s' % i)
print(lst)
    
    列表推导式, 用一句话来生成一个列表
lst = ['python %s' % i for i in range(1, 16, 2)]                           # [ 前面是结果(列表中元素的格式) 空格 用for来产生i的值 ]
lst = ['python %s' % i for i in range(1, 16) if i%2 ==1]                   #完整语法 [结果 for循环 判断]
print(lst)
 
names = [['bajie','wukong'],['bajie', 'datanog'],['ooaa','bajiebajie']]     #找到名字中用两个字母a的名字
lst = [name for ll in names for name in ll if name.count('a') == 2]         #标点全用空格代替
print(lst)
    
    字典推导式
lst = [11,22,33,44]
 
dic = {i:v for i,v in enumerate(lst) if i < 2}                              #语法和列表推导式类似
print(dic)
    
    集合推导式
s = {i for i in range(100) if i%2 == 1}                                     #和字典推导式类似, 只有一个key
 
print(s)
 
四.生成器表达式(没有元组推导式)
    因为元组不可变(不能增删改), 叫做生成器表达式
tu = (i for i in range(10) if i < 6)    #得到的是生成器
print(tu)
print(tu.__next__())
print(tu.__next__())
    
    生成器的惰性机制: 1.生成器取值每次都要到源头取, 源头只能向前, 数据取完就没有了
def func():
    print('one line')
    yield 666
    yield 777
    yield 888
 
g1 = func()                 #获取生成器
g2 = (i for i in g1)        #生成器
g3 = (i for i in g2)        #生成器
print('---------------')    #到这里所有的生成器都没有执行
print(list(g1))     #[666, 777, 888]    全拿了
print(list(g2))     #[]     #所以这里为空
print(list(g3))     #[]     #同理这里为空
 
    生成器, 要值的时候才会拿
def add(a, b):              #求和
    return a + b
 
def test():                 #生成器函数(0,1,2,3)
    for i in range(4):
        yield i
 
g = test()                  #获取生成器
 
for n in [2, 10]:                       #n = 2, 10
    g = (add(n, i) for i in g)          #当n=2时, g = (add(n, i) for i in g) 此时无执行(只记录代码, 不带值), 当n=10时 g = (add(n, i) for i in g), 把上次g带入本次
                                        #为 g = (add(n, i) for i in add(n, i) for i in g))
                                        # (20,21,22,34)<-10 (10,11,12,13)<-(10,11,12,13)<-10 (0,1,2,3)<-(0,1,2,3)
 
print(list(g))                          #当遇到list时,生成器执行, 此时 n = 10(所有的n都是10), 代入上面的表达式
 
                                        #__next__(), send(), for循环, list 这四种情况, 生成器才执行, 去取值
 
 
 
练习:
    enumerate()
lst = ['bajie', 'wukong', 'datang']
for i, el in enumerate(lst, 100):        #获取下标和元素, 默认从0开始,可以当成下标. 这里是从100开始
    print(i, el)
 
 
 
 
 
 
 

day13 python生成器函数 推导式 生成器的更多相关文章

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

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

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

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

  3. Day12--Python--生成器,生成器函数,推导式,生成器表达式

    一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...

  4. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  5. Python生成器、推导式之前襟后裾

    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...

  6. python基础学习笔记——生成器与推导式

    生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...

  7. python — 生成器、推导式、递归

    目录 1 生成器(函数的变异) 2 推导式 3 递归 1 生成器(函数的变异) 判断一个函数是否是生成器函数:只需看函数内部是否有yield # 生成器函数(内部是否包含yield) def func ...

  8. Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)

    1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...

  9. Python【day 12】生成器和推导式

    一.生成器和生成器函数1.生成器和生成器函数的概念 1.生成器的本质是迭代器 2.函数中包含yield,就是生成器函数 2.生成器函数的写法 def func(): a =10 yield 20 ge ...

随机推荐

  1. ltp-ddt eth_iperf_tcp iperf dualtest遇到的问题

    ltp-ddt eth_iperf_tcp server端:iperf -s -i 5 -w 1M client端将ddt的核心代码抠出来: iperf -c 1921.68.40.41 -m -M ...

  2. python 中 len()和range()

    https://blog.csdn.net/qq_36357820/article/details/77850841

  3. mysql小知识

    char(10): 换行符 char(13): 回车符 UPDATE tablename SET field = REPLACE(REPLACE(field, CHAR(10), ”), CHAR(1 ...

  4. create-react-app按需引入antd-mobile

    1.引入 react-app-rewired 并修改 package.json 里的启动配置: npm i react-app-rewired@2.0.2-next.0 // 需要安装低版本 否则np ...

  5. python代码整体左移或右移

    IDE 是  PyCharm 选中代码块: 1)右移:直接 Tab 2)左移:Shift + Tab

  6. navicat12过期问题,Windows平台。

    首先关闭Navicat 然后 win+R,输入regedit 回车,打开注册表编辑器: 删除HKEY_CURRENT_USER\Software\PremiumSoft\Data 展开HKEY_CUR ...

  7. SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法

    SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法 在使用数据库的过程中,经常会遇到数据库迁移或者数据迁移的问题,或者有突然的数据库损坏,这时需要从数据库的备 ...

  8. iOS设计模式之装饰者模式

    一,什么是装饰模式 模式定义 装饰者包含被装饰者的所有接口和引用,方法实现完全是引用调用自己的方法,在装饰者子类添加新功能. 注释: Category不要重写被装饰对象的方法,否则改变了被装饰对象的行 ...

  9. 【SpringBoot】 理解Spirng中的IOC原理

    前言 前文已经介绍了Spring Bean的生命周期,在这个周期内有一个重要的概念就是: IOC容器 大家也知道IOC是Sping 的重要核心之一,那么如何理解它呢,它又是产生什么作用呢?本文就IOC ...

  10. WPF自定义控件(三)

    今天我们开始制作我们的按钮,主要的效果就是一个按钮正常状态.鼠标滑过.按下三态显示不同的图片. 首先我们需要给扩展按钮添加三个属性,分别是正常状态图片,鼠标滑过图片,按钮按下图片. 先贴出Button ...