惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
D
Docker
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
GbyAI
GbyAI
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
Vercel News
Vercel News
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
U
Unit 42

碎言

不懂就别瞎掰掰:【程序员的常识】写的什么玩意? AI 辅助编程下的程序设计与代码编写 使用 Next.js 和 Tailwind CSS 构建可编辑和删除的 ToDo 待办事项应用 探索编程新境界:MarsCode 助你一臂之力 使用 Next.js 和 Tailwind CSS 搭建静态图片展示站点并部署到 Vercel AI 辅助编程:免费工具的优缺点及官网一览 GitHub push更新总是失败,写个python脚本解决 把博客从GitHub迁移到到了vercel ComfyUI 和 Flux.1 安装与使用教程 Flux.1 入门必知:硬件、环境、模型 Git项目的子文件夹中的内容无法同步到远程仓库的解决方法 blender流体Fluid使用中没有流体、流体穿模等一些问题的解决方法 博客聚合网站:积薪,竟然关闭了! blender日常使用中的一些技巧 虽然只有我自己在用,但还是更新了碎言博客的源代码, 与其在迷茫中困惑,不如在努力中前进 差点忘了我还有一个博客... 秧歌、博客和AI 终于熬到了新手上路 好久没有更新博客了。。。 老妈大腿骨骨折,最近一直在医院护理 Hello, September! Ubuntu开机自动启动Docker容器运行WordPress Docker 简单快速安装部署WordPress Docker下安装MySQL 加碘盐能防核辐射的话,还怕什么核战争? shields.io 一个简洁、一致、清晰的徽章 Ubuntu下使用root登录ssh的设置 GitHub Actions 构建、部署 Next.js项目 我又用回了"IE"--edge
聊聊Python中晦涩的生成器(yield)与生成器表达式
J.sky · 2017-10-14 · via 碎言

输入图片说明

晦涩的生成器yield

刚开始接触Python的时候感觉很清爽,入门很简单,但后边学到生成器和协程的时候就感觉有些吃力了,是时候深入的学习一下了。

什么是生成器?

书上说:函数使用yield可以定义生成器对象,那么包含yield的函数主是一个生成器函数,它可以生成一个序列,方便迭代中使用,__next__()#python3中的特殊方法,应该避免使用特殊方法,next(c)使用内置函数next()即可。

def countdown(n):
    print("Counting down from %s" % n)
    while n > 0:
        yield n
        n -= 1
    return

c = countdown(10)
print(c.__next__())#python3中的特殊方法,应该避免使用特殊方法
print(next(c))#使用内置函数next()
for i in c :
    print(i,end=' ')

函数对象调用.__next__()函数时开始执行语句,遇到yield语句时停止。可以使用循环来操作生成器。 调用close()方法关闭未使用完的生成器。 那么问题来了,yield到底是什么?

我们把上边的代码稍加变化:

def countdown1(n):
    print("Counting down from %s" % n)
    while n > 0:
        yield n*n
        n -= 1
    return

c = countdown1(10)
print(next(c))
print(next(c))
print(next(c))
for i in c :
    print(i,end=' ')

运行之后我们可以发现程序运行到yield的时候返回了一个值,那么yield和return在功能上有些相似。

生成器表达式

如果你对列表推导有些了解,你会发现,生成器表达式只不过是把列表的[]换成了元组的(),但列表推导返回的是一个结果集,而生成器表达式返回的是一个生成器。 因为这个特点,我们可以通过流方式访问一个巨大的文件而不必把它直接加载到内存,这样很大的提高了程序的性能。

代码如下:

print('')
print("生成器表达式:")
b = (x*x for x in range(10) if (x % 2 ==0))
print(next(b))
print(next(b))
for i in b :
    print(i, end=' ')

本文源码下载: