《Python学习手册 第五版》 -第20章 推导和生成
本章将继续讲解高级函数的主题,推导和生成,其中很多概念之前的章节都有涉及,只是在这章会讲解的更全面和深入
本章重点内容:
1、列表推导
2、生成器函数
3、生成器表达式
接下来针对以上内容进行详细说明
1、列表推导
标准推导语法:[ expression for target in iterable ]
以上语法看起来比较抽象,其实通过代码示例更好理解,如下:
通过以上代码可以联想到数学讲解中的函数,通过函数表达式来表示一组数字,这里的推导就是有类似的效果
这是基本的推导语法,在这个基础上还可以增加if语句进行筛选,还可以增加多个for语句和多个if语句
通过if语句进行筛选,还是以上面代码为例,筛选出偶数,如下:
可以增加多个for语句,代码示例如下:
可以增加多个if语句,代码示例如下:
以上是列表推导的方式,其实集合、字典都可以通过推导来构建
在此提醒,使用推导是为了方便快捷,如果通过多个for和if处理,影响阅读和理解时,建议选择其他方式,要铭记KISS原则(keep it simple and stupid)
2、生成器函数
定义:使用常规的def语句进行编写,但是使用yield语句一次返回一个结果,在每次结果产生之间挂起和恢复他们的状态
从定义中可以理解几点
1)使用def语句的函数
2)不同于其他def函数,里面有yield语句,这个也是表明生成器函数的重要标志
3)一次返回一个结果,而不是所有结果
通过定义大概有三个方面的理解,通过代码示例,可以更具体的理解,代码示例如下:
先定义一个生成器函数,如下:
这个函数的功能是给定一个数据,然后返回一系列平方数
我们知道一般的函数,直接调用即可,例如G(5)这样,因为函数本身没有打印,所以我们可以试着通过print(G(5))来打印出来看看,代码如下:
你会发现系统并没有像我们想象的那样,为什么?这里就是生成器函数的不同,通过系统提示可以发现,生成器函数产生的是一个生成器对象(generator object)
那如何使用这个对象呢?可以通过next函数,next函数每次只会返回一个结果,这个和生成器函数中提到的一样,具体代码示例如下:
我们之间使用的时候,结果都是0,为什么?感觉怪怪的,通过以下方式再试下:
两者有什么不同吗?这个可以留给读者来思考
通过使用你会发现,生成器函数,产生了一系列数字,但是是一次一次产生的,也就是说你用一次产生一个,用一次产生一个,也就是按需产生,我们什么时候需要【按需产生】呢?也就是说我们既然有了函数,为什么还需要生成器函数?一次产出结果不就可以了吗?
通过实践或者实际的作业,你会发现,有些时候我们需要产生大量的数据,但是在使用中,只是使用很少一部分,而且如果数据量级很大,计算机在操作中也会有困难,例如内存不足死机,所以为了避免大量占用内容,产生不必要的数据,就可以通过生成器函数来实现
3、生成器表达式
从形式看,生成器表达式就像一般的列表推导一样,而且也支持所有列表推导的语法,但是他们是包括在圆括号中而不是方括号中
从结果看,它是生成器功能与推导语法的结合
结合代码理解会更容易,第一部分讲到的列表推导是这样的[ x for x in range(5) ],只要把方括号变成圆括号就可以了
既然是生成器,就可以通过next函数来调用其中的数据,但是在这有一个相对快速的方式,如果数据量不大,也不会影响内容,可以通过list转化为列表,如下:
上面我们说过,生成器函数是对内存的优化,而生成器表达式是对内存进一步的优化
针对生成器需要提醒的一点就是,它是单遍迭代的,也就是你通过next只能从开始到结束遍历一次,通过以下代码你会更容易理解:
将一个生成器赋值给两个不同的变量,两个不同的变量分别调用next函数,如下:
也就是说,你使用一次就没有了,如果想再使用,就需要重新创建生成器对象
以上,就是本章重点内容的全部讲解,下章再见!
《Python学习手册 第五版》 每章时间规划及完成进度:
2019.11.25-2019.12.01 第01章,已完成:《Python学习手册 第五版》 -第1章 问答环节
2019.12.02-2019.12.08 第02章,已完成:《Python学习手册 第五版》 -第2章 Python如何运行程序
2019.12.09-2019.12.15 第03章,已完成:《Python学习手册 第五版》 -第3章 你应如何运行Python程序
2019.12.16-2019.12.22 第04章,已完成:《Python学习手册 第五版》 -第4章 介绍Python对象类型
2019.12.23-2019.12.29 第05章,已完成:《Python学习手册 第五版》 -第5章 数值类型
2019.12.30-2020.01.05 第06章,已完成:《Python学习手册 第五版》 -第6章 动态类型
2020.01.06-2020.01.12 第07章,已完成:《Python学习手册 第五版》 -第7章 字符串基础
2020.01.12-2020.01.19 第08章,已完成:《Python学习手册 第五版》 -第8章 列表与字典
2020.01.20-2020.01.26 第09章,已完成:《Python学习手册 第五版》 -第9章 元组、文件与其他核心类型
2020.01.27-2020.02.02 第10章,已完成:《Python学习手册 第五版》 -第10章 Python语句简介
2020.02.03-2020.02.09 第11章,已完成:《Python学习手册 第五版》 -第11章 赋值、表达式和打印
2020.02.10-2020.02.16 第12章,已完成:《Python学习手册 第五版》 -第12章 if测试和语法规则
2020.02.17-2020.02.23 第13章,已完成:《Python学习手册 第五版》 -第13章 while循环和for循环
2020.02.24-2020.03.01 第14章,已完成:《Python学习手册 第五版》 -第14章 迭代和推导
2020.03.02-2020.03.08 第15章,已完成:《Python学习手册 第五版》 -第15章 文档
2020.03.09-2020.03.15 第16章,已完成:《Python学习手册 第五版》 -第16章 函数基础
2020.03.16-2020.03.22 第17章,已完成:《Python学习手册 第五版》 -第17章 作用域
2020.03.23-2020.03.29 第18章,已完成:《Python学习手册 第五版》 -第18章 参数
2020.03.30-2020.04.05 第19章,已完成:《Python学习手册 第五版》 -第19章 函数的高级话题
2020.04.06-2020.04.12 第20章,已完成
2020.04.13-2020.04.19 第21章,未完成
2020.04.20-2020.04.26 第22章,未完成
2020.04.27-2020.05.03 第23章,未完成
以下链接,可以供你了解这个学习笔记的所有章节最新进度