• 生成器


    Python-15

    @(Python)

    一、 生成器

    • 生成器是一个函数,在这个函数内会出现yield,调用此函数时,函数体内的代码不会执行,这个被调用的函数就是生成器,格式形式:func(),此时func()是一个内存地址
    • 生成器(func())使用func().__next__()next(func())后,可以得到yield后面的值
    • 生成器是自定义后的迭代器,本质是迭代器

    1. 使用yield

    • 函数中没使用yield前,调用函数时,函数会执行函数体中的代码

    Alt text

    2. 使用yield

    • 函数中使用yield后,调用函数时,函数不会执行函数体中的代码,调用函数变为生成器(一个内存地址),generator表示生成器

    Alt text

    3.生成器使用next得到yield的值

    • 每次next找到yield的后,对暂停在yield,并获取yield后面的值,不会再继续执行下面的代码,下一次next会从暂停的地方继续走
    • 一次next对应一个yield返回值

    Alt text

    4. range在Python2和Python3中的区别

    • Python2中,将range后内容一次性都加载到内存,Python3在没有执行时,不占用内存,执行也是一次在内存中只有一个值

    Alt text

    5. 使用生成器模拟range的功能

    Alt text

    Alt text

    def range_func(start,stop,step=1):
        while start < stop:
            yield start
            start+=step
    
    for i in range_func(1,6):
        print(i)
    

    6. yield总结

    ① yield功能总结

    • 提供一种自定义迭代器的方式
    • yield可以暂停函数,并且返回值

    ② yield和return的区别

    • 相同点:都是在函数内,都可以返回值,返回值没有类型限制,没有个数限制
    • 不同点:return只能返回一次值,yield可以返回多次值

    7. yield用法形式(了解)

    • yield 值
    • x=yield
    • x=yield 值

    生成器.send()的使用

    • eat.send('xiang') 的执行顺序,先为当前暂停位置的yield传值,然后在执行next()操作
    • next就是找值,自定义迭代器,找的就是yield的值
    • 给函数体传值方式:参数,闭包,send方式(传一参就运行一次,只调了一次函数)

    Alt text

    二、三元表达式

    • 三元表达式:res=x if x > y else y,含义是条件成立时的返回值+if条件+else+条件不成立时的返回值
    • 表达式,是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合

    Alt text

    三、列表生成式

    • 列表生成器,是为了更方便的造列表
    • 不要写过多条件,最多再加一个if判断,保持简短整洁

    1. 没使用列表生成器前

    Alt text

    2. 使用列表生成器后

    ① 没使用列表生成器前

    Alt text

    ② 使用列表生成器后

    • 把要加入列表的值放在左边,for循环继续执行

    Alt text

    Alt text

    Alt text

    ③ [i for i in name]形式

    • 要求将['a','b','c','d']每个元素后面加上_name

    Alt text

    Alt text

    ④ [成立的条件i for i in name if+条件]形式

    • 要求将['a','b','c','d']的元素除了c,后面加上_name
    • 先执行右边,在执行左边 右边条件必须成立才执行左边

    Alt text

    1、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写
    names=[i.upper() for i in names]
    print(names)
    
    2、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度
    names=[len(i) for i in names if not i.endswith('sb')]
    

    四、字典生成式

    1. key:value形式

    • 字典生成式,需要左边以key:value的形式

    Alt text

    2. zip(k,v)拉链函数

    • 遵循迭代器协议,放可迭代对象,原理同list

    Alt text

    Alt text

    3. {k,v for k,v in zip(keys,values)}

    将元组、列表转成字典
    方法一:

    Alt text

    方法二:

    Alt text

    Alt text

    • 取出,还原

    Alt text

    六、集合生成式

    ① {i for i in range(10)}

    Alt text

    七、生成器表达式

    ① (i for i in range(10))

    Alt text

    • max(数字)比较一堆数的大小,得出最大值

    Alt text

    • 求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数)
    • 变成迭代器,内存只有一个值,这里使用生成器,不是用列表

    Alt text

    • 注意:这里的max()不要放在外面,因为放在外面文件就关闭了
    • 如果nums=(len(i) for i in f)变为nums=[len(i) for i in f]那么print就可以放在外面了,因为值都放在了列表里

    Alt text

    八、小结

    • 生成器(迭代器,iter后)阶段为准备
    • 造出生成器时,并没有运行生成器,只有next才执行
    • 使用next,list(),for,max()为运行代码阶段
    • 生成器表达式,不占用内存,同一时间只有一个值,而列表需要全部加载到内存

    迭代器对象=可迭代对象.__iter__()
    迭代器本身=迭代器对象.__iter__()
    下一个值=迭代器对象.__next__()

    迭代器和迭代器对象有什么区别?
    为什么一个变量名,可以叫迭代器?
    迭代器对象,是一个准备值的阶段?

  • 相关阅读:
    JavaWeb学习篇之----自定义标签&&JSTL标签库详解
    JavaWeb学习篇之----EL表达式详解
    JavaWeb学习篇之----Jsp详解
    JavaWeb学习篇之----Servlet过滤器Filter和监听器
    JavaWeb学习篇之----Session&&Cookie
    JavaWeb学习篇之----容器Request详解
    JavaWeb学习篇之----浏览器缓存问题详解
    JavaWeb学习篇之----容器Response详解
    JavaWeb学习篇之----HTTP协议详解
    factory工厂模式之抽象工厂AbstractFactory
  • 原文地址:https://www.cnblogs.com/itone/p/9524578.html
Copyright © 2020-2023  润新知