加入收藏 | 设为首页 | 会员中心 | 我要投稿 潍坊站长网 (https://www.0536zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Python生成器深入分析

发布时间:2021-12-05 10:27:29 所属栏目:教程 来源:互联网
导读:1、生成器 (1)什么是生成器? 核心:生成器的本质就是一个迭代器 迭代器是Python自带的 生成器程序员自己写的一种迭代器 def func(): print(这是一个函数) return 函数 func() def func(): print(这是一个生成器) yield 生成器 (2)生成器的编写方式: 1

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("alex"))   # send  -- 发送
print(g.send("宝元"))   # 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 = ["alex","wusir","taibi","baoyuan"]
    yield from lst
    yield from lst1
 
g = func()
 
for i in g:
    print(i)
 
lst = [1,2,3,45,6]
lst1 = ["alex","wusir","taibi","baoyuan"]
 
for i in lst,lst1:
    print(i)
(8)可迭代对象、迭代器、生成器的比较:
可迭代对象
 
​ 优点:list , tuple .str 节省时间,取值方便,使用灵活(具有自己私有方法)
 
​ 缺点:大量消耗内存
 
迭代器
 
​ 优点:节省空间
 
​ 缺点:不能直接查看值,使用不灵活,消耗时间,一次性,不可逆行
 
生成器
 
​ 优点:节省空间,人为定义
 
​ 缺点:不能直接查看值,消耗时间,一次性,不可逆行

(编辑:潍坊站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读