Python列表推导式:语法详解与性能优势实战

温以宁
温以宁
发布时间:2026-10-13 | 3人浏览过
原创

本文深入解析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开发中的重要知识点,需要多加练习,熟能生巧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表