Python列表推导式实战:1-100偶数生成全解析

简介: 列表推导式是Python中简洁高效的语法糖,可一行代码替代传统循环,用于生成、筛选和转换列表。相比常规写法更优雅且性能更优,适用于逻辑清晰的场景,但复杂嵌套时需注意可读性。

​免费python编程教程:https://pan.quark.cn/s/2c17aed36b72

一、为什么需要列表推导式?
2025年的Python开发者依然在重复这样的操作:先创建一个空列表,再写个for循环,把符合条件的元素逐个添加进去。比如生成1-100的偶数:
探秘代理IP并发连接数限制的那点事 (28).png

传统写法

even_numbers = []
for num in range(1, 101):
if num % 2 == 0:
even_numbers.append(num)
print(even_numbers)

这段代码完全能工作,但就像用螺丝刀拧螺丝时还要先找扳手——总觉着不够优雅。Python设计者早就预见到这种场景,于是创造了列表推导式(List Comprehension),让代码能像数学公式一样简洁。

二、列表推导式基础语法
列表推导式的基本结构是:

[表达式 for 变量 in 可迭代对象 if 条件]

用它生成1-100偶数只需一行:

even_numbers = [num for num in range(1, 101) if num % 2 == 0]

这行代码做了三件事:

遍历range(1,101)生成的数字
用if num % 2 == 0筛选偶数
把符合条件的数字放入新列表
三、拆解列表推导式的执行过程

  1. 理解range对象
    range(1,101)生成的是1到100的整数序列(注意不包含101)。可以这样验证:

print(list(range(1, 101))[:5]) # 输出前5个数字:[1, 2, 3, 4, 5]

  1. 过滤条件的魔法
    num % 2 == 0是判断偶数的经典写法。%是取模运算符,计算除法的余数:

print(4 % 2) # 输出0(偶数)
print(5 % 2) # 输出1(奇数)

  1. 表达式部分可以更复杂
    列表推导式的表达式部分不只是简单返回变量,还能进行计算:

生成1-100偶数的平方

squares = [num**2 for num in range(1, 101) if num % 2 == 0]
print(squares[:5]) # 输出[4, 16, 36, 64, 100]

四、性能对比:传统写法 vs 列表推导式
用timeit模块测试两种写法的执行时间:

import timeit

传统写法

def traditional_way():
result = []
for num in range(1, 101):
if num % 2 == 0:
result.append(num)
return result

列表推导式

def list_comprehension_way():
return [num for num in range(1, 101) if num % 2 == 0]

测试执行时间

print("传统写法耗时:", timeit.timeit(traditional_way, number=10000))
print("列表推导式耗时:", timeit.timeit(list_comprehension_way, number=10000))

在我的测试环境中,列表推导式比传统写法快约20%。这是因为:

列表推导式在底层用C语言优化实现
减少了Python解释器的调用次数
不需要维护额外的变量状态
五、列表推导式的变体玩法

  1. 嵌套循环生成二维数据

    生成乘法口诀表的前3行

    multiplication_table = [
    [i*j for j in range(1, 10)]
    for i in range(1, 4)
    ]
    print(multiplication_table)

    输出: [[1, 2, 3, 4, 5, 6, 7, 8, 9],

    [2, 4, 6, 8, 10, 12, 14, 16, 18],

    [3, 6, 9, 12, 15, 18, 21, 24, 27]]

  2. 结合条件表达式做复杂筛选

    生成1-100中能被3或5整除的数字

    special_numbers = [
    num for num in range(1, 101)
    if num % 3 == 0 or num % 5 == 0
    ]
    print(special_numbers[:10]) # 输出前10个符合条件的数字

  3. 使用生成器表达式处理大数据
    当数据量很大时,可以用生成器表达式节省内存:

生成1-1000000的偶数(不立即计算)

even_generator = (num for num in range(1, 1000001) if num % 2 == 0)

每次迭代时才计算下一个值

print(next(even_generator)) # 输出2
print(next(even_generator)) # 输出4

六、常见错误与调试技巧

  1. 忘记加条件导致全量生成

    错误示例:生成了1-100的所有数字

    wrong_result = [num for num in range(1, 101)] # 缺少if条件

调试技巧:先分步测试条件部分

先测试条件是否正确

test_num = 4
print(test_num % 2 == 0) # 应该输出True

  1. 变量名冲突

    错误示例:内部变量覆盖了外部变量

    num = 100
    result = [num for num in range(1, 101)] # 这里的num会覆盖外部的num
    print(num) # 输出99(被修改了)

解决方案:使用不同的变量名

num_outside = 100
result = [n for n in range(1, 101)]
print(num_outside) # 输出100(保持不变)

  1. 复杂表达式难以阅读

    错误示例:表达式过于复杂

    complex_result = [
    xy + z for x in range(1, 5)
    for y in range(1, 5)
    for z in range(1, 5)
    if x
    y > 5 and z % 2 == 0
    ]

优化建议:

分多行书写
添加注释说明逻辑
考虑拆分成多个步骤
七、实际应用案例:数据清洗与转换

  1. 筛选并转换数据

    原始数据:学生成绩列表(包含无效成绩)

    scores = [85, 92, -1, 78, 95, 0, 88, 102]

筛选有效成绩并转换为百分制

valid_scores = [
score if 0 <= score <= 100 else None
for score in scores
]
print(valid_scores) # 输出[85, 92, None, 78, 95, None, 88, None]

  1. 扁平化嵌套列表

    原始数据:嵌套的班级成绩列表

    nested_scores = [
    [85, 92, 78],
    [90, 88, 95],
    [76, 82, 89]
    ]

扁平化为一维列表

flat_scores = [
score for class_scores in nested_scores
for score in class_scores
]
print(flat_scores) # 输出[85, 92, 78, 90, 88, 95, 76, 82, 89]

八、性能优化进阶技巧

  1. 避免在推导式中调用函数

    低效写法:每次循环都调用函数

    def is_even(n):
    return n % 2 == 0

slow_result = [n for n in range(1, 101) if is_even(n)]

高效写法:直接使用表达式

fast_result = [n for n in range(1, 101) if n % 2 == 0]

  1. 使用内置函数替代推导式
    当逻辑简单时,内置函数可能更高效:

使用filter函数生成偶数

even_numbers = list(filter(lambda x: x % 2 == 0, range(1, 101)))

  1. 针对大数据集的分块处理

    处理1-1000000的偶数,分块生成

    def chunked_evens(chunk_size=10000):
    for start in range(1, 1000001, chunk_size):
     yield from (
         num for num in range(start, min(start+chunk_size, 1000001)) 
         if num % 2 == 0
     )
    

使用示例

for i, num in enumerate(chunked_evens(), 1):
if i > 10: # 只取前10个
break
print(num)

九、常见问题Q&A
Q1:列表推导式和生成器表达式有什么区别?
A:列表推导式直接生成完整列表,生成器表达式返回迭代器。生成器更节省内存,适合处理大数据集。例如:

列表推导式(立即计算)

list_result = [x*2 for x in range(1000000)]

生成器表达式(延迟计算)

gen_result = (x*2 for x in range(1000000))

Q2:可以在列表推导式中使用多个条件吗?
A:可以,用and/or连接多个条件:

生成1-100中能被3或5整除但不能被15整除的数字

special_numbers = [
num for num in range(1, 101)
if (num % 3 == 0 or num % 5 == 0) and num % 15 != 0
]

Q3:如何调试复杂的列表推导式?
A:分步拆解:

先写简单的for循环验证逻辑
逐步添加条件和表达式
使用打印语句输出中间结果
考虑拆分成多个推导式
Q4:列表推导式能嵌套多少层?
A:理论上没有限制,但超过3层会严重影响可读性。例如:

三层嵌套示例(生成三维坐标)

coordinates = [
(x, y, z)
for x in range(3)
for y in range(3)
for z in range(3)
]

Q5:如何用列表推导式处理字典或集合?
A:使用字典推导式和集合推导式:

字典推导式:数字到平方的映射

square_dict = {x: x**2 for x in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}

集合推导式:去除重复的偶数

unique_evens = {x for x in [1,2,2,3,4,4,5] if x % 2 == 0} # {2, 4}

十、总结:何时使用列表推导式
列表推导式最适合这些场景:

需要从现有可迭代对象生成新列表
筛选和转换逻辑相对简单
追求代码简洁性和可读性
但这些情况慎用:

逻辑过于复杂(超过3个条件或嵌套)
需要处理异常或复杂分支
代码可读性比简洁性更重要时
记住:代码首先是给人看的,其次才是给机器执行的。在保持简洁的同时,确保其他开发者能轻松理解你的意图。就像生成1-100偶数这个例子,列表推导式用一行代码就完成了传统写法5行的功能,这才是Pythonic的编程哲学。

目录
相关文章
|
22小时前
|
云安全 人工智能 自然语言处理
|
5天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
314 116
|
8天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
562 52
Meta SAM3开源:让图像分割,听懂你的话
|
20天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
5天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
|
4天前
|
弹性计算 人工智能 Cloud Native
阿里云无门槛和有门槛优惠券解析:学生券,满减券,补贴券等优惠券领取与使用介绍
为了回馈用户与助力更多用户节省上云成本,阿里云会经常推出各种优惠券相关的活动,包括无门槛优惠券和有门槛优惠券。本文将详细介绍阿里云无门槛优惠券的领取与使用方式,同时也会概述几种常见的有门槛优惠券,帮助用户更好地利用这些优惠,降低云服务的成本。
264 132
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
398 29
|
14天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
709 224