当前位置: 首页 > 编程日记 > 正文

面试必备|带你彻底搞懂Python生成器

640?wx_fmt=jpeg

2019年人工智能系统学:

https://edu.csdn.net/topic/ai30?utm_source=ai100_bw

作者 | Rocky0429

转载自 Python空间(ID:Devtogether)

写在之前

Python 的高级语言特性一直是我们学习 Python 的一个难点,大部分人并没有做到熟练的掌握,甚至去学习它都感觉很困难,「生成器」作为其中甚是有用的特性之一,更是如此。

因为在其它的主流语言(C/C++/JAVA)中并没有生成器的概念,加之其具有一定的难度,学习起来花费的时间成本较大,很多人自我安慰式的视其为“鸡肋”,然后果断放弃如此有用的一个高级语言特性,实在是一件很惋惜的事情。

其实不光是对于「生成器」而言,对于其它的高级语言特性还是建议大家要花点时间去搞懂的,不说其它,这些东西作为面试中常考的内容也应该引起你的重视,毕竟公司不是傻瓜,没有用的东西干嘛要考你?

接下来就让我们来一起学习「生成器」,我尽量用大家都听的懂的话,层层递进的讲解,保证大家都能看懂,前提是要有耐心,文章较长,建议先收藏再看。

答应我,一定要有耐心。

迭代器

在这说「迭代器」的原因是生成器」自动实现了「迭代器协议」,所谓协议,就是一种约定为了更好的理解生成器,我们需要简单知道一下「迭代器协议」到底是个什么东西。其实只需要满足两个两个条件:1.实现 __iter__ 方法;2.对象实现 next() 方法,要么返回迭代中的下一项,要么就是以 StopIteration 异常终止迭代。

对象就是「可迭代对象」,即实现了迭代器协议的对象,它实现了迭代器协议。其实像是 Python 中 for 循环,sum 函数等等就是使用迭代器协议访问对象。

你可能看着有点懵,怎么又是「迭代」又是「迭代器」又是「可迭代对象」的,这对大家来说是很抽象的概念,但是不用怕,我在很久之前的文章中,已经很详细的介绍过这俩哥们,你只需要点击下面的链接去看就好了,这也是面试中常见的问题哦:

零基础学习 Python 之初识迭代

Python 拓展之迭代器

生成器

如果你理解了上一节的内容,那么恭喜你,接下来学习「生成器」就会简单很多。Python 使用生成器对「延迟操作」提供了支持,所谓「延迟操作」就是在需要它的时候才产生结果,而不是说立即产生结果。

首先我们先来看一个入门级别的版本,你只需要点击下面的链接即可:

零基础学习 Python 之初识生成器

接下来讲的相当于是上面文章的一个延伸和再拓展。

Python 其实有两种不同的方法来提供生成器,一种是函数形式,另一种是表达式形式,说全一点儿就是「生成器函数」和「生成器表达式」。

1.生成器函数

「生成器函数」和普通的函数定义类似。区别在于普通函数使用 return 返回结果,生成器函数是用 yield 返回结果。

yield 的作用是在调用的时候返回相应的值,一次返回一个结果,在每个结果中间挂起函数的状态(即暂停执行),下一次执行是从上次暂停的位置开始,继续向下执行。

下面我们来做一道题,要求写出「将一个全是整数的列表进行操作后只保留奇数」。相信大多数人都能很快的写出下面这样的函数:

def get_odd(lst):
   res = []
   for i in lst:
       if i % 2:
           res.append(i)
   return res

def main():
   lst = range(10)
   for i in get_odd(lst):
       print(i)

if __name__ == '__main__':
   main()

上面这个没什么难度,既然我们学了「生成器」,我在前面还这么舔它,是不是我们该用生成器来做一下这道题?看看用生成器来做同样的功能,到底有什么不同:

def get_odd(lst):
   for i in lst:
       if i % 2:
           yield i

def main():
   lst = range(10)
   for i in get_odd(lst):
       print(i)

if __name__ == '__main__':
   main()

对比一下这个功能的两种做法,使用「生成器」以后,代码变的行数更少了(省去了对 res 的操作,不用把结果存在 res 里),代码整体看起来更清晰了(一看就知道干嘛的,不用一上来去想 res 是个什么鬼,append 进去的是个什么玩意儿)。

2.生成器表达式

「生成器表达式」和列表推导式类似。区别在于使用列表推导,一次会产生所有的结果,而用「生成器表达式」则不会这样,它是按需产生。

列表推导式的写法如下:

>>> res = [x for x in range(5)]
>>> res
[0, 1, 2, 3, 4]

生成器表达式就是将上面的 [] 变成 () 即可:

>>> res = (x for x in range(5))
>>> res
<generator object <genexpr> at 0x109d9f570>
>>> next(res)
0
>>> next(res)
1
>>> next(res)
2
>>> next(res)
3

我们也顺便简单的看一下「生成器」的优势在「生成器表达式」中是怎么体现的。如果我们想对一系列整数求和,直接用生成器可以写成下面这样:

>>> sum((x for x in range(5)))
10

当然为了方便起见,也可以省略圆括号,即写成下面这样:

>>> sum(x for x in range(5))
10

但是如果你用常规的写法去写,就会写成下面这样:

>>> sum([x for x in range(5)])
10

上面的代码先构造了一个列表,然后再用 sum 函数求和,多了一步,天差地别,光在时间效率上,就已经输掉了裤子。

所以综合上面文章所讲,「生成器」光在明面上的优点就有好几个:代码行数更少;代码更易读;时效更高...

所以,你还敢视它为“鸡肋”吗?

60s测试:你是否适合转型人工智能?

https://edu.csdn.net/topic/ai30?utm_source=ai100_bw

(本文为 AI科技大本营转载文章,转载请微信联系原作者)

群招募

扫码添加小助手微信,回复:公司+研究方向(学校+研究方向),邀你加入技术交流群。技术群审核较严,敬请谅解。

640?wx_fmt=jpeg

推荐阅读:

  • 优秀开发者必备技能包:Python调试器

  • 十大经典排序算法动画与解析,看我就够了!(附代码)

  • 访问量最高超7百万的Stack Overflow问题竟然是...

  • 新鲜开源:基于TF2.0的深度强化学习平台

  • 交易机器人春天已来?先看完这篇再说吧

  • 程序员求职新思路:互联网巨鳄瓜分 ToB 资源全公开

  • 移动开发还有未来吗?

  • 全面剖析企业私有云

  • 月入5万,程序员夫人们过上"贵妇"生活了吗?

640?wx_fmt=png

点击“阅读原文”,查看历史精彩文章。

相关文章:

Kubecon 2017大会Google高级产品经理David Aronchick访谈:机器学习和Kubernetes

\看新闻很累&#xff1f;看技术新闻更累&#xff1f;试试下载InfoQ手机客户端&#xff0c;每天上下班路上听新闻&#xff0c;有趣还有料&#xff01;\\\在德克萨斯州奥斯汀市举办的Kubecon大会已于近日闭幕&#xff0c;会议吸引了超过4000名工程师&#xff0c;Kubernetes成为了…

【Qt】Qt程序查看动态链接库(windows)

windows下使用dumpbin查看Qt程序运行时需要链接的动态库 打开终端 打开Qt自带的MSVC终端 如:Qt 5.10.0 64-bit forDesktop(MSVC 2017) 查看dumpbin命令 dumpbin微软官网说明 https://docs.microsoft.com/zh-cn/cpp/build/reference/dumpbin-options 直接输入命令dumpbin…

MSN 无法登录 错误代码 8007007e

故障原因&#xff1a; 发生这个错误的原因是一些朋友在网上下载了独立MSN提取包版本进行安装的&#xff0c;因为这个提取包只包含了Windows Live Messenger 2009&#xff0c;却缺少Windows Live Communications Platform&#xff0c;所以造成无法登录的问题。 解决办法&#xf…

你不知道的Vue响应式原理

文章首发于github Blog。 本文根据Vue源码v2.x进行分析。这里只梳理最源码中最主要的部分&#xff0c;略过非核心的一些部分。响应式更新主要涉及到Watcher&#xff0c;Dep&#xff0c;Observer这几个主要类。 本文主要弄清楚以下几个容易搞混的问题&#xff1a; Watcher&#…

优秀开发者必备技能包:Python调试器

作者 | Roky0429 来源 | Python空间&#xff08;ID:Devtogether&#xff09; 人工智能的现状及今后发展趋势如何&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 写在之前 不管是之前搞 acm 用 c/c 写算法还是后来用 Python 写代码&#xff0c;我发现在程…

【Qt】dumpbin详解

dumpbin简介 DUMPBIN是在Windows平台下用于显示COFF格式文件信息的一个命令行工具。你可以使用DUMPBIN去显示COFF格式的文件信息&#xff0c;比如像vc编译器生成的目标文件&#xff08;obj&#xff09;&#xff0c;可执行文件&#xff08;exe&#xff09;和动态链接库&#xf…

感悟Windows7

Win7已经逐渐在中国电脑用户中普遍起来&#xff0c;绝大多数人对其新增的功能很升级的功能都很是好评&#xff0c;接下来就将简略总结一下我对此系统使用的一些感想。 l 界面更加体现以人为本的思想。更加赏心悦目并且选择更加多元化。比如桌面小工具就有了更多的选择并且还可…

【Qt】Qt5在ubuntu16.04无法输入中文解决方式

参考博客 https://blog.csdn.net/linux_2016/article/details/52356576 博客中没有修改库的执行权限 解决方法 安装&#xff1a;fcitx-frontend-qt5 sudo apt-get install fcitx-frontend-qt5 拷贝动态库到Qt安装目录下的两个目录中 cp /usr/lib/x86_64-linux-gnu/qt5/p…

拿下中科大的计算机课程全靠它了!

整理 | 琥珀 出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 人工智能的现状及今后发展趋势如何&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 中国科学技术大学&#xff0c;简称“中科大”&#xff0c;是国内有名的 985、211 重点高校。近年…

【阿里Q3财报:阿里云去年营收破百亿,亚洲市场遥遥领先】

2月1号晚间&#xff0c;阿里巴巴公布2018财年第三季度财报&#xff0c;阿里云保持持续强劲的增长&#xff0c;季度营收同比增长104%到35.99亿元。2017年累计营收突破百亿&#xff0c;达112亿&#xff0c;这是国内首次出现百亿规模的云计算服务商&#xff0c;在亚洲市场遥遥领先…

“神仙”打架,“凡人”遭殃

神仙是啥&#xff1f;古时神话时代举手翻江倒海的人物啊&#xff0c;那神仙打架是啥后果&#xff0c;相信大家心里都有个底吧。那现代社会的“神仙”是啥&#xff1f;那就是有钱有权的大人物或者商家&#xff0c;那真是让咱仰望的对象啊~ 话说最近这360跟QQ的巅峰对决&am…

120种小狗图像傻傻分不清?用fastai训练一个分类器

作者&#xff1a;一杯奶茶的功夫 链接&#xff1a;https://www.jianshu.com/p/ab35ed21df87 程序员转行学什么语言&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 这篇文章会讲解如何制作能够分类120种小狗的图像分类器。 这篇文章中所讲述的内容都是基于…

View_01_LayoutInflater的原理、使用方法

View_01_LayoutInflater的原理、使用方法 本篇博客是郭神博客Android视图状态及重绘流程分析&#xff0c;带你一步步深入了解View&#xff08;一&#xff09;的读书笔记的笔记。 LayoutInflater简单介绍 setContentView()内部是使用LayoutInflater来完毕载入布局的。setContent…

【ubuntu】在ubuntu下无法输出拼音输入法中的中括号“【” 和 “】”的解决方法

问题 在新装的ubuntu16.04中&#xff0c;打不出中括号【】&#xff0c;而变成 “”和“「” 解决方法 修改文件/usr/share/fcitx/data/punc.mb.zh_CN sudo vi /usr/share/fcitx/data/punc.mb.zh_CN将18、19行改为如下内容 18 [ 【 19 ] 】

配置数据源和分页

1.tomcat的版本&#xff0c;最好不要是安装版的&#xff0c;要解压缩的&#xff0c;不然无法连接数据源。2.conf》context.xml<Resource name"hotel" auth"Container" type"javax.sql.DataSource" driverClassName"oracle.jdbc.…

售价1万7的华为Mate X很贵吗?

整理 | 琥珀 出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 60s测试&#xff1a;你是否适合转型人工智能&#xff1f; https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 继三星之后&#xff0c;网友们期待已久的华为终于忍不住宣布了一系列重磅消息&#xff…

【C】数组数组初始化总结

C数组初始化总结 发现一个新方法&#xff0c;可以分段初始化数组 eg&#xff1a;int arrayC[MAX_LEN] {[1 … 5]9, [6 … 9] 8}; 代码如下 #include <stdio.h> #define MAX_LEN 10int main (int argc, char *argv[]) { //不初始化&#xff0c;参数值随机分配 //[0][0…

Golang的反射reflect深入理解和示例

[TOC] Golang的反射reflect深入理解和示例 【记录于2018年2月】 编程语言中反射的概念 在计算机科学领域&#xff0c;反射是指一类应用&#xff0c;它们能够自描述和自控制。也就是说&#xff0c;这类应用通过采用某种机制来实现对自己行为的描述&#xff08;self-representati…

如何读取多个文件,文件后缀名不一致,不过类似source.1 source.2 source.3等

#include <stdio.h> #include <stdlib.h> //为了使用exit() char *itoa(int num,char *str,int radix); int main() { int ch; FILE* fp; // char fname[50]"scan1.source.2100"; //用于存放文件名 char fname[20]"source."; …

AtCoder Petrozavodsk Contest 001

第一场apc&#xff0c;5H的持久战&#xff0c;我当然水几个题就睡了 A - Two Integers Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement You are given positive integers X and Y. If there exists a positive integer not greater than 1018…

【Qt】使用QCamera获取摄像头,并使用图像视图框架QGraphics*来显示

代码下载 https://download.csdn.net/download/u010168781/10373174 #####头文件 #ifndef CAMERATEST_H#define CAMERATEST_H#include <QMainWindow> #include <QGraphicsView> #include <QKeyEvent> #include <QTimer>namespace Ui { class Camera…

CVPR 2019收录论文ID公开,你上榜了吗?

整理 | 琥珀 出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 计算机视觉和模式识别大会 CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;作为人工智能领域计算机视觉方向的重要学术会议&#xff0c;每年都会吸引全球最顶尖的…

什么是 prelink

2019独角兽企业重金招聘Python工程师标准>>> Most programs require libraries to function. Libraries can be integrated into a program once, by a linker, when it is compiled (static linking) or they can be integrated when the program is run by a load…

PythonR爬取分析赶集网北京二手房数据(附详细代码)

本文转载自数据森麟&#xff08;ID:shujusenlin&#xff09; 作者介绍&#xff1a;徐涛&#xff0c;19年应届毕业生&#xff0c;专注于珊瑚礁研究&#xff0c;喜欢用R各种清洗数据。 知乎&#xff1a;parkson 如何挑战百万年薪的人工智能&#xff01; https://edu.csdn.net/t…

【Qt】QCloseEvent的使用小结

问题描述 在程序中使用QCloseEvent时,有时没有反应,没有关闭程序。 原因 经测试只有在界面起来以后,使用event->accept()才能关闭程序 测试如下 在构造函数中调用close() 在构造函数中调用close()时,会触发QCloseEvent事件,但是程序界面没有关闭。 使用按钮触发…

Java反射 - 私有字段和方法

尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法。 这并不困难。 这在单元测试中可以非常方便。 本文将告诉你如何。 访问私有字段 要访问私有字段&#xff0c;您需要调用Class.getDeclaredField&#xff08;String name&#xff09;或Class.getDeclaredFields…

.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)

过去几年都在忙着找项目&#xff0c;赶项目&#xff0c;没有时间好好整理深究自己在工作中学到的东西。现在好了&#xff0c;趁着找工作的这段空余时间&#xff0c;正好可以总结和再继续夯实自己的.Net, C#基本功。在05年的时候&#xff0c;Scott Hanselman(微软的一个Principa…

一个小小的AI训练营竟然卧虎藏龙

年前&#xff0c;我来到了一个近墨者黑的地方&#xff0c;黑的不能再黑。。。这个神秘的组织叫做 21 天入门机器学习训练营。讲真的&#xff0c;当初报名这个训练营&#xff0c;我是冲着机器学习来的&#xff0c;主要是好奇想转型&#xff0c;而且听说这个课程对小白很友好&…

【Qt】QCamera查询和设置摄像头的分辨率

查询和设置摄像头分辨率的API QCamera::supportedViewfinderResolutions() QCamera::setViewfinderSettings() 设置摄像头帧率、比例、分辨率、格式的类&#xff1a;QCameraViewfinderSettings 使用注意事项 查询和设置摄像头分辨率时&#xff0c;需要在摄像头启动后调用&a…

附录G Netty与NettyUtils

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/77450134 注&#xff1a;本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写&#xff0c;目的是为了节省成本、方便读者查阅。…