zoukankan      html  css  js  c++  java
  • Python 入门之 Python三大器 之 生成器

    1、生成器

    (1)什么是生成器

    核心:生成器的本质就是一个迭代器

    迭代器是Python自带的,生成器程序员自己写的一种迭代器

    def func():
        print("这是一个函数")
        return "函数"
    func()
    
    def func():
        print("这是一个生成器")
        yield "生成器"
    

    (2)生成器的编写方式

    <1> 基于函数编写

    <2> 推导式编写

    (3)生成器函数

    ​ 通过生成器函数构建生成器

    <1> 函数体中出现yield代表要声明一个生成器 (generator -- 生成器)

    <2> 一个yield 对应 一个 next()

    def func():
        msg = input("请输入内容")
        yield msg
        print("这是第二次启动")
        yield "生成器2"
        yield "生成器3"
        yield "生成器4"
    
    g = func()     
    print(next(g))    
    print(next(g))
    print(next(g))
    print(next(g))   
    
     # 生成器的本质就是迭代器.迭代器如何取值,生成器就如何取值
    

    <3>yield 和 return 的区别:

    1>相同点:
    都是返回内容
    都可以返回多个,但是return写多个只会执行一个
    2>不同点:
    return终止函数 yield是暂停生成器
    yield 能够记录当前执行位置

    (4)生成器的作用:节省空间

    (5)使用场景

    当文件或容器中数据量较大时,建议使用生成器

    (6)区别什么是迭代器,什么是生成器

    <1> 通过地址:

    ​ 迭代器的地址:<list_iterator object at 0x000000987B6E97F0>

    ​ 生成器的地址:<generator object func at 0x00000087C2A10CA8>

    <2> 通过send()方法: (send()方法第一次必须发送None)

    没有send()方法就是迭代器
    有send()方法就是生成器
    def func():
        a = yield 1
        print(a)
        b = yield 2
        print(b)
    
    g = func()
    print(g.send(None))   # send  -- 发送
    print(g.send("yong"))   # send  -- 发送
    print(g.send("liang"))   # send  -- 发送
    
    1>send和next()区别:

    ​ 相同点:

    ​ send 和 next()都可以让生成器对应的yield向下执行一次。

    ​ 都可以获取到yield生成的值。

    ​ 不同点:

    ​ 第一次获取yield值只能用next不能用send(可以用send(None))。

    ​ send可以给上一个yield置传递值。

    (7)yield 和 yield from的区别

    yield 将可迭代对象一次性返回

    yield from 将可迭代对象逐个返回

    def func():
        def foo():
            print(11)
        lst = {"key":1,"key1":2}
        yield foo
    
    print(func().__next__())
    
    def func():
        lst = [1,2,3,45,6]
        lst1 = ["liang","cai","yong","haha"]
        yield from lst
        yield from lst1
    
    g = func()
    
    for i in g:
        print(i)
    
    lst = [1,2,3,45,6]
    lst1 = ["liang","cai","yong","haha"]
    for i in lst,lst1:
        print(i)
    

    (8)可迭代对象、迭代器、生成器的比较

    可迭代对象

    ​ 优点:list,tuple,str 节省时间,取值方便,使用灵活(具有自己私有方法)

    ​ 缺点:大量消耗内存

    迭代器

    ​ 优点:节省空间

    ​ 缺点:不能直接查看值,使用不灵活,消耗时间,一次性,不可逆行

    生成器

    ​ 优点:节省空间,人为定义

    ​ 缺点:不能直接查看值,消耗时间,一次性,不可逆行

  • 相关阅读:
    Tkinter组件之Entry
    Tkinter组件之LabelFrame
    Tkinter组件之Frame
    Tkinter组件之Radiobutton
    Tkinter 组件详解之Checkbutton
    Tkinter组件之Label
    Tkinter组件之Button
    Tkinter:事件绑定
    特征点匹配方式的选择
    跑通SOLOV1-V2实例分割代码,并训练自己的数据集
  • 原文地址:https://www.cnblogs.com/caiyongliang/p/11462822.html
Copyright © 2011-2022 走看看