前言
版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_72543266/article/details/132656665
本章是对自己学完基础语法后,学习python进阶语法推导式过程中,自己的一些理解和看法,因为自己从刚开始第一次看看不懂,到学习一段时间后,通过积累再次看这里的知识点发现自己有了新的理解,这次将这部分知识学完了,剩下就是通过练习来达到熟练了.本章的推导式,包含列表推导式,字典推导式,集合与元组推导式这四种.
思维导图
1.普通写法
1.1代码解读
列表推导式最常见的场景就是优化简单循环。
如果我们需要一个将列表中元素变为原来二倍的程序,那么我们通常会使用下面的普通写法.
这里我们创建了一个列表,列表中含有三个元素,然后创建一个新的列表用于存储变为2倍的元素,接下来我们只需要使用for循环将旧列表中的元素每一项取出变为2倍,最后放入列表中,最后打印出来即可.
# for 循环式写法 my_list = [1, 2, 3] new_list = [] for i in my_list: new_list.append(i*2) print(new_list)
1.2,结果展示
2.列表推导式
2.1,重要
重要: !!!列表推导式为从左向右运行 !!! (后面的式子会一直用到),第一个元素是向列表赋值的元素
2.2,列表推导式初步写法
2.2.1,代码解读
对上述代码进行化简,就变成了下面的式子.
我们主要解释列表中的表达式,还是上面说的从左往右看,不用管第一个,第一个是迭代对象,是后面的for循环每一次进行取值后,前面的元素就进行一次计算,然后将值存储在列表中.
my_list = [1, 2, 3] my_list = [i*2 for i in my_list] print(my_list)
2.2.2,结果展示
这里我们看到得到的结果和上面的化简前的一致,证明我们的想法没有错误.
2.3,列表表达式之条件判断式
2.3.1,代码解读
这里我们增加一个进行条件判断的表达式,我们看到多了一个if条件判断,记得程序是从左向右运行的,那么其中的i就是迭代元素,所以从for从列表中取出元素后,进行一次判断,然后再把符合的元素进行计算然后赋值
# 增加一个判断条件的列表推导式 my_list = [1, 2, 3] new_list = [i*2 for i in my_list if i>1] print(new_list)
2.3.2,结果展示
2.4,进行两层for循环
2.4.1,代码解读
这里我们进行两层for循环,如果觉得代码看着复杂,这里我们可以将for循环看成嵌套for-for循环,先进行x的0然后进行y的0,1,2,后面的依次进行.
也就是进行全排列,输出的元素为元组
# 优化两层 for 循环 list = [(x,y) for x in range(3) for y in range(3)] print(list)
2.4.2,结果展示
2.5,普通写法与列表推导式的运行时间比较
2.5.1,代码解读
这里我们先是导入了time模块,然后我们定义了两个函数分别使用普通方法和列表推导式的写法进行相同的操作,然后调用函数和方法分别判断不同函数运行所用的时间,
import time def demo1(): new_list = [] for i in range(10000000): new_list.append(i*2) def demo2(): new_list = [i*2 for i in range(10000000)] s_time1 = time.perf_counter() demo1() e_time1 = time.perf_counter() s_time2 = time.perf_counter() demo2() e_time2 = time.perf_counter() print("demo1() 代码运行时间:", e_time1-s_time1) print("demo2() 代码运行时间:", e_time2-s_time2)
2.5.2,结果展示
通过结果很直观的看出列表推导式运行的速度要快很多
2.6,列表内部变量与外部互不干扰
2.6.1,代码解读
定义了x,但是列表表达式中也有x结果会不会受到影响呢
x = 6 # 互不干扰,相互不影响 my_var = [x*2 for x in range(3)] print(my_var) print(x)
2.6.2,结果展示
2.7, 列表推导式还支持嵌套
2.7.1,代码解读
这里我们主要解释这个代码的运行顺序,还是从左往右进行,但是因为第一个for需要内部列表中的元素,所以先进行内部元素的运算,运算完内部列表后,再将内部列表运算得到的结果,进行进一步运行,最后得到最外面列表的结果.
my_var = [y*4 for y in [x*2 for x in range(3)]] # 内部生成0,2,4 print(my_var) # 0 ,8 ,16
2.7.2,结果展示
3.字典推导式
3.1,生成字典列表
3.1.1,代码解读
这里按照正常的想法,为forfor循环为6个值,但是在字典中不能有相同的值key-value不能一致,当第一次运行时key为0,,后面出现value=0就会被覆盖,所以只能为value=1
my_dict = {key: value for key in range(3) for value in range(2)} print(my_dict)
3.1.1,结果展示
3.2,遍历具有键值关系的列表生成字典
3.2.1,代码解读
这里我们的字典推导式,会将列表中的每一项元组中的元组,分为键和值,组成字典
my_tuple_list = [('name', '橡皮擦'), ('age', 18),('class', 'no1'), ('like', 'python')] my_dict = {key: value for key, value in my_tuple_list} print(my_dict)
3.2.1,结果展示
4.集合推导式
4.1.1,代码解读
因为集合是无序且不重复的,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样,使用的时候很容易晕掉。
my_set = {value for value in 'HelloWorld'} print(my_set)
4.2,结果展示
5.元组推导式
5.1,代码解释
使用元组推导式生成的结果并不是一个元组,而是一个生成器对象
my_tuple = (i for i in range(10)) print(my_tuple)
5.2,结果展示
6.总结
本章主要是对python进阶语法推导式,的练习与理解,同时也提高了自己对代码的简化和运行的能力的提高,也是在这次学习中,我发现学习代码更多需要的是对基础和知识的积累,当眼界与思维突破瓶颈,看之前难以理解的事物发现变的容易去使用和理解了.
每日一言
冬天之所以那么冷是为了告诉大家身边人的温暖有多重要。