洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

时间:2023-03-09 18:30:30
洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

是的,我是想到什么知识点就说什么,没有固定的主题,我的标题都是在写完博客再给的。本篇博文说说列表进阶话题。其实列表应该是比较熟悉的了,而毫不夸张的说,在实际的开发中,列表也是使用的最多的,以后你会体会到我说的这句话的。

列表解析

1.什么是列表解析:

根据已有列表,高效生成新列表的方式,还有另一个叫法是叫列表推导式

2.作用:

列表解析是python迭代机制的一种应用,它常用于实现创建新的列表,因此要放置在列表中

3.格式:

[expr for iter in iterable]

4.实际运用:

例题:返回1到10的所有数的平方:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

注意:我使用的的是python2,如果你是用的是python3,需要加括号的,还有,列表解析是用的使用中括号,不是小括号

是不是很简单的就生成了我们想要的结果?

这里用到一个内置函数range(),前面提到没有我也忘了(是的,我也有任性的时候/滑稽),在这里详细讲解一下:

range([start,]  stop[,step=1]):中括号表示这两参数可选,Step=1表示第三个参数的值默认值是1

range这bif(内置函数)的作用是生成一个从start参数的值开始到stop参数的值结束的数字序列

例:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

由这个例子得到一个知识点,注意:range函数,第二个参数不包括其中,默认从0开始(是不是有点像索引)

也可以和切片一样添加步长来返回:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

好,我想你已经对列表解析有个大概了解了,再看一个列子:

返回1到10的所有偶数:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

注意:列表解析,整个过程中,每一小段代码不用冒号或者逗号隔开,直接是空格隔开

再看几个综合练习题:

1).用列表解析生成100内的大于20的偶数(请用两种写法)

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

2).用列表解析生成100内的大于20的偶数的平方

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

3).用列表解析输出结果:[1 love python,2 love python,3 love python,.... 10 love python]

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

4).用列表解析的方法返回某一磁盘路径下相同后缀名文件组成的列表

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

这里使用了os模块和字符串的endswith方法,os模块后面会解析

好,列表解析完了,其实很简单对不对?

列表生成器

1.什么是列表生成器:

概念和列表解析差不多,根据已有列表,以生成器的方式生成一个列表。生成器是迭代器的一种实现

2.作用:

返回一个生成器对象,并不真正创建列表

3.格式:

(expr for iter in iterable)

4.实际运用:

例题:返回1到10的所有数的平方:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

是的,我想你应该看出列表生成器和列表解析的不同了

注意:

1.列表生成器使用的是小括号,列表解析是用的是中括号哦

2.列表生成器不能直接输出,换句话生成器对象不能直接输出

3.如果要输出,则必须使用生成器对象的next()方法一一返回

4.当生成器对象返回完则会报错

说到列表生成器,那不得不提到生成器关键词—yield

yield:是为在函数内使用的生成器语法,一旦程序里有yield,则被定义为生成器

例:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

这里使用了自定义函数的语法,姑且不管,后面会详解。因为知识都是相连的,所以避免不了穿插后面的知识。

发现没?使用yield关键词就会把函数变为一个生成器对象

其实说道生成器和列表解析,就和range()函数与xrange()函数一样

range()函数前面说了,不再解释。xrange每次返回一个数值,和range不同

例:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

综合实例:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

有没有发现,哎,这啥情况对吧?怎么next方法不顶用了,老师返回1啊,其实不是,是因为:

列表生成器一次知返回一个值,由于不能多次调用生成器,一位内每调用一次,内存ID就会变化一次,所以,一般赋值给另一变量来进行一一返回

列表解析和列表生成器综合使用

1.列表解析功能强大,但很占用资源,列表生成器只返回一个值,但占用小,所以酌情选择

2.例:用生成器和解析结合实现1到10的平方数除以2的结果:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

注意:在这里外层和内层的i的引用,其实并不冲突的,但尽量少用,有些地方是有冲突的

3.生成器也可以转换为列表:

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

4.例

洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

好,列表进阶话题完结,留下几个课后练习自己练习

课后作业:

1.使用列表解析输出结果:[(0,0),(0,2),(2,0),(2,2)]

2.使用列表生成器打印斐波那契数列

3.使用列表解析生成列表[1x2,3x4,5x6,7x8,…,99x100]

4.利用3层for循环的列表生成式,找出对称的3位数,例如:121等从左到右从又到左还是原来的对称数

5.编写一个函数,它接受一个list,然后把list中的所有字符串变成大写后返回,非字符串元素将被忽略