Python3生成器 - vip共享吧
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们


导航菜单
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们
Python

Python3生成器

2024/9/6 韩俊  Python教程 677 0

通过列表推导式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的。 假如创建一个包含上百万个成员的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素, 那后面绝大多数元素占用的空间都白白浪费了。

如果我们可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的 list,从而节省大量的空间,在 Python 中,这种一边循环一边计算的机制,称为生成器(Generator)。

生成器定义和使用

要创建一个生成器,有很多种方法,最简单的方式是:只要把一个列表推导式的 [] 改成 (),就创建了一个生成器。

myge = (item for item in range(10))
print(type(myge))

我们可以直接输出集合的每一个元素,但我们怎么输出生成器的每一个元素呢, 如果要一个一个输出元素,可以通过生成器的 __next__ 函数或者 Python 内置的 next 函数(实际上该函数间接调用生成器的 __next__ 函数)。

myge = (item for item in range(3))
print(myge.__next__())
print(myge.__next__())
print(myge.__next__())

# 等价于上面代码
myge = (item for item in range(3))
print(next(myge))
print(next(myge))
print(next(myge))

生成器保存的是算法,每次调用 __next__ 函数 就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的错误。

myge = (item for item in range(3))
print(myge.__next__())
print(myge.__next__())
print(myge.__next__())
print(myge.__next__())  # 抛出异常

用生成器的 __next__ 方法太单一不灵活,我们可以使用 for 循环,因为生成器也是可迭代对象。

from collections.abc import Iterable

myge = (item for item in range(3))
print(isinstance(myge, Iterable))

for item in myge:
    print(item)

注意事项:我们基本上永远不会调用 next 函数,而是通过 for 循环来迭代它,因为 for 循环在遍历生成器时, 计算到最后一个元素就会自动停止遍历,不会抛出 StopIteration 的错误,这样很友好。

让函数变成生成器

生成器非常强大,如果推算的算法比较复杂,用类似列表推导式的 for 循环无法实现的时候,还可以用函数来实现, 我们先来看一个简单的例子,写一个可以生成无限偶数的生成器。

def ge_even():
    data = 1
    while True:
        if data % 2 == 0:
            yield data
        data += 1

even = ge_even()
print(type(even))  # even 是个生成器

for item in even:
    print(item)

只要函数定义中包含 yield 关键字,那么这个函数就不再是一个普通函数,而是一个生成器,该生成器和其它生成器具有一样的性质, 比如可以用他的 __next__ 函数,可以用 for 循环遍历。

def ge_func():
    yield 1
    yield 2
    yield 3

myge = ge_func()
print(myge.__next__())
print(myge.__next__())
print(myge.__next__())

myge = ge_func()
for item in myge:
    print(item)

本节重要知识点

生成器和推导式的区别。

遍历生成器的方法。

如何把函数变成生成器。

点赞:0 分享

上一篇
python3迭代器
下一篇
Python3推导式
作者头像 作者名称 作者性别
韩俊

热门推荐

1 Python3推导式
2 Python中urllib模块详解
3 Python中xml文件处理
4 Python中HTMLParse模块详解
5 python中time模块详解
6 Python序列化和反序列化

评论列表

取消回复

    •  
      Login

      韩俊

      趁你现在还有时间,尽你自己最大的努力,努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。这个世界永远比你想的要更精彩,不要败给生活。

      退出登陆
      • 10358文章
      • 455评论
      • 80微语
  • 广告赞助

  • 二零二五年08月
    一二三四五六日
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
  • 分类

    • 网站模板源码
    • IT技术笔记
    • 好资源分享
    • 共享网络资源
  • 最新文章

      • 升职寄语祝福语简短
        • 前辈师傅离职祝福语简短
          • 期待搬新家祝福语简短
            • 初中家长留言祝福语简短
              • 姥姥八十岁祝福语简短
                • 顺利答辩的祝福语简短
                  • 农村儿女结婚祝福语简短
                    • 升职后祝福语简短
  • 热门文章

    • 酷狗音乐VIP账号 酷狗音乐会员账号共享2017.01.29更新
    • 芒果tv vip会员账号 芒果tv会员账号共享2017.01.29更新
    • 爱奇艺vip账号 爱奇艺/PPS会员账号共享2016.12.12更新
    • 优酷/土豆vip会员账号 优酷会员账号共享2017.01.29更新
    • 活动:免费获得爱奇艺VIP/PPS会员账号50天以上的使用权!
    • 酷我音乐VIP账号 酷我音乐会员账号共享2016.12.31更新
    • 暴风影音会员账号 暴风影音会员账号共享2016.12.31更新
    • 迷雾通:免费使用的VPN软件
  • 最新评论

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/10.jpg

      你丫的 文章写得太好了 支持下!![F3...

    • https://www.vipshare8.com/content/templates/meta/Static/images/avatar.jpg

      很棒!刚在某网站看到这个,很欣赏,可惜下...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3861064027

      呃呃呃 oooo

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了111:根据激活的时间有一年的有效期!

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=792480561

      到2025就到期了吗?

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      [blockquote]打卡时间:16:...

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/7.jpg

      俊哥,想借用迅雷一用!但需要手机验证!看...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3293901900

      感谢大大的分享

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了好奥v:如果没有解析成功,可以切换接口...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=131241242441

      现在视频解析网站怎么用不了啦?

  • 网站统计 I 当前在线:948人

    • 本站管理:1位
    • 用户总数:593位
    • 置顶文章:2篇
    • 日志总数:10358篇
    • 微语总数:80条
    • 评论总数:455条
    • 标签总数:83条
    • 页面总数:8页
    • 分类总数:14个
    • 链接总数:16条
    • 运行天数:3762天
    • 最后更新:8月16日
    • 登录
    • 注册
    • 找回
    Copyright © 2025vip共享吧网站地图 网站备案豫ICP备19004194号-1

    免责声明:本站资源仅供用于学习和交流,本站部分素材内容来源于网络,如有侵权/投稿等,请及时联系站长.

    • 首页
    • 秒懂百科 秒懂百科
    • 搜索
    • 史上今日

    大家都在搜

    • 华数tv会员账号
    • nginx
    • 阴阳师
    • 喜马拉雅FM会员账号
    • 小程序
    • MySql
    • 百度文库下载
    • 掌阅vip账号共享
    • 手机赚钱软件
    • 网站源码
    • 咪咕会员账号
    • 2345网址导航
    • sem优化
    • 网赚
    • 优酷账号共享
    • 酷我音乐VIP账号
    • 
    • 