Python列表推导式:语法详解与性能优势实战
本文深入解析Python列表推导式的核心语法与实战应用。通过对比新手与老司机的代码差异,展示推导式如何简化逻辑。文章详细讲解两种列表推导式语法,并结合获取偶数、奇偶混合计算等案例,直观呈现其代码简洁性。最后通过一亿次循环的性能测试,证明列表推导式相比普通for循环具有显著的效率优势,是提升Python开发效率的关键技巧。
本文详细解析Python列表推导式的入门知识,通过具体示例代码进行演示,内容详实,对读者的学习或工作具有实际的参考价值,建议相关读者仔细阅读并参考。
推导式的基本概念
一、推导式的基本概念
推导式是一种从迭代器快速且简洁地创建数据类型的机制。它将循环逻辑与条件判断相结合,有效避免了冗长的语法结构,从而提升了代码的运行效率。能够熟练运用推导式,通常被视为开发者已超越Python初级水平的标志。
报错
条件推导式实战
二、条件推导式
1. 语法结构
'''
value1:如果条件表达式condition成立,返回value1 ; 如果条件表达式不成立,返回value2 ;
condition:条件表达式
Value2:如果条件表达式condition成立,返回value1 ; 如果条件表达式不成立,返回value2 ;
'''
value1 if condition else Value2
2. 实战练习
假设有一个需求:判断一个数字是奇数还是偶数?
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧
@Blog(个人博客地址): shuopython.com
@WeChat Official Account(微信公众号):猿说python
@Github:www.github.com
@File:python_list.py
@Time:2019/9/30 20:45
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
"""
# 新手代码
x = 10
if x%2 == 0:
print("新手说:x是偶数")
else:
print("新手说:x是奇数")
# 老司机
x = 15
print("老司机说:x是偶数") if x%2 == 0 else print("老司机说:x是奇数")
输出结果:
新手说:x是偶数
老司机说:x是奇数
观察上述代码可以发现,新手方案(选手一)使用了5行代码,而老司机方案(选手二)仅用两行代码就实现了相同功能。这种高性价比的代码写法,往往是职场中衡量工作能力甚至决定升职加薪的关键细节。
列表推导式语法与案例
三、列表推导式
列表推导式是条件推导式与循环结构的结合,其最终返回值是一个列表。因此,整个表达式必须包裹在方括号[]中,以明确返回值的类型为列表。
1. 语法结构
'''
语法一:
exp1:在for循环中,如果x的值满足条件表达式condition(即条件表达式成立),返回exp1;条件表达式不成立则不返回
x:for循环中变量
data:一个序列(比如:列表/元组/字符串等)
condition:条件表达式
'''
[exp1 for x in data if condition]
'''
语法二:
exp1:在for循环中,如果x的值满足条件表达式condition(即条件表达式成立),返回exp1;条件表达式不成立则返回exp2
condition:条件表达式
exp2:在for循环中,如果x的值满足条件表达式condition(即条件表达式成立),返回exp1;条件表达式不成立则返回exp2
x:for循环中变量
data:个序列(比如:列表/元组/字符串等)
'''
[exp1 if condition else exp2 for x in data]
2. 实战练习
需求一:获取0到20之间的所有偶数,并将每个偶数乘以10,最后返回所有计算结果。示例代码如下(使用列表推导式语法一实现):
'''
1.因为是获取0~20,包括20,所以使用range(0,21)
2.x*10 等价 语法一中的exp1
3.x%2 == 0 等价 语法一中的条件表达式condition
4.range(0,21) 等价 语法一中的data(序列)
'''
list1 = [x*10 for x in range(0,21) if x%2 == 0]
print(list1)
print(type(list1))
输出结果:
[0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200]
<class 'list'>
需求二:将0到20之间的偶数乘以10,奇数乘以100,并返回所有计算结果。示例代码如下(使用列表推导式语法二实现):
'''
1.因为是获取0~20,包括20,所以使用range(0,21)
2.x*10 等价 语法二中的exp1
3.x*100 等价 语法二中的exp2
4.x%2 == 0 等价 语法二中的条件表达式condition
5.range(0,21) 等价 语法一中的data(序列)
'''
list2 = [x*10 if x%2 == 0 else x*100 for x in range(0,21) ]
print(list2)
print(type(list2))
输出结果:
[0, 100, 20, 300, 40, 500, 60, 700, 80, 900, 100, 1100, 120, 1300, 140, 1500, 160, 1700, 180, 1900, 200]
<class 'list'>
列表推导式与普通循环的效率对比
3. 效率对比
可能有些读者会疑惑:既然普通的for循环也能实现功能,为什么还要使用列表推导式?
使用列表推导式的效率远高于普通的for循环。虽然执行一句print("helloworld")对CPU而言仅需0.0002秒,这种差距可能难以察觉,但如果需要输出一亿次"helloworld"呢?细节往往决定成败。
假设有一个需求:将0到10000000(一亿)以内的所有整数存入列表中,我们来对比列表推导式与普通for循环的耗时情况:
import time # 添加time模块,用于统计代码运行时间
#一共添加10000000次数据到列表中
total_num = 10000000
#使用列表推导式
start_time = time.time()
list1 = [x for x in range(0,total_num)] # 列表推导式
end_time = time.time()
print("使用列表推导式耗时:{}秒".format(end_time-start_time))
#使用普通for循环
start_time = time.time()
list2 = list()
for x in range(0,total_num): # for循环
list2.append(x)
end_time = time.time()
print("使用普通for循环耗时:{}秒".format(end_time-start_time))
输出结果:
使用列表推导式耗时:0.5455152988433838秒
使用普通for循环耗时:1.2068836688995361秒
输出结果非常清晰:在实现通用功能时,列表推导式的效率比普通for循环高出整整一倍。
最后温馨提醒:进行测试时,请适当减少循环次数。因为刚开始练习时,如果不小心多加了几层循环,可能会导致电脑死机。
重点总结
四、重点总结
1. 书写列表推导式时,所有表达式必须位于[]内部,因为返回值类型为列表list。
2. 列表推导式是Python开发中的重要知识点,需要多加练习,熟能生巧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













