《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章,未完成

 

以下链接,可以供你了解这个学习笔记的所有章节最新进度

自学笔记系列:《Python学习手册 第五版》 -写在开始之前

posted @ 2020-04-14 06:03  诡刺-ThornSoul  阅读(324)  评论(0编辑  收藏  举报