# 【Python进阶】详解循环与列表推导式:让你的代码更Pythonic!
## 写在前面
循环是编程中最重要的控制结构之一,而Python的**列表推导式**更是将简洁优雅发挥到极致。本文将带你全面掌握:
- 三大循环结构(for/while/range)
- 列表推导式的5种高阶用法
- 如何避免常见陷阱
- 写出更Pythonic的代码
文末附【思维导图】+【练习题】,建议收藏⭐
---
## 一、For循环:遍历的艺术
### 1.1 基础语法
```python
planets = ['Mercury', 'Venus', 'Earth', 'Mars']
for planet in planets:
print(planet, end=' ')
# 输出:Mercury Venus Earth Mars
1.2 三大特性
| 特性 | 说明 | 示例 |
|---|---|---|
| 自动迭代 | 无需手动管理索引 | for item in list: |
| 多类型支持 | 列表/元组/字符串/字典均可 | for char in "Hello": |
| 嵌套解包 | 直接解包嵌套结构 | for x,y in [(1,2),(3,4)] |
1.3 实战案例
▍案例1:计算阶乘
def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result
print(factorial(5)) # 120
▍案例2:矩阵转置
matrix = [[1, 2], [3, 4], [5, 6]]
transposed = [[row[i] for row in matrix] for i in range(2)]
# [[1, 3, 5], [2, 4, 6]]
二、Range函数:循环控制利器
2.1 三大使用场景
# 场景1:指定次数循环
for _ in range(3):
print("重要操作!")
# 场景2:生成索引序列
for i in range(len(planets)):
print(f"Index:{i}, Planet:{planets[i]}")
# 场景3:生成等差数列
even_nums = list(range(0, 10, 2)) # [0, 2, 4, 6, 8]
2.2 性能陷阱❗
# 错误示范:每次循环都计算range
for i in range(1, 1000000):
# 大数据量时产生性能问题
# 正确做法:先存储range对象
nums = range(1, 1000000)
for i in nums:
...
三、While循环:条件驱动
3.1 基础模板
count = 0
while count < 5:
print(f"当前计数:{count}")
count += 1
3.2 经典应用
▍案例1:用户输入验证
while True:
user_input = input("请输入Y/N:")
if user_input.upper() in ('Y', 'N'):
break
print("输入无效!")
▍案例2:处理不确定长度数据
data = [1, 2, 3, 0, 4, 5]
while data and data[0] != 0:
print(data.pop(0)) # 输出1 2 3
四、列表推导式:优雅的力量
4.1 语法进化论
# 传统写法
squares = []
for n in range(10):
squares.append(n**2)
# 推导式写法
squares = [n**2 for n in range(10)]
4.2 高阶用法大全
| 类型 | 语法示例 | 说明 |
|---|---|---|
| 条件过滤 | [x for x in list if x>0] | 筛选元素 |
| 多重循环 | [x+y for x in a for y in b] | 笛卡尔积 |
| 嵌套推导 | [[0 for _ in range(3)] for _ in range(3)] | 生成二维数组 |
| 字典推导 | {k:v for k,v in zip(keys, values)} | 字典生成 |
| 生成器表达式 | (x**2 for x in range(5)) | 惰性求值 |
4.3 性能对比🔥
import timeit
# 测试10万次操作
print(timeit.timeit('[x for x in range(100000)]', number=100)) # 0.98s
print(timeit.timeit('list(map(lambda x:x, range(100000)))', number=100))# 1.21s
五、Python之禅:平衡的艺术
5.1 代码对比
# 版本1:传统写法(8行)
def find_primes(n):
primes = []
for num in range(2, n+1):
for i in range(2, int(num**0.5)+1):
if num%i == 0:
break
else:
primes.append(num)
return primes
# 版本2:推导式写法(3行)
def find_primes(n):
return [num for num in range(2, n+1)
if all(num % i != 0 for i in range(2, int(num**0.5)+1))]
5.2 最佳实践
- 可读性 > 简洁性:复杂的推导式拆分为多行
- 避免过度嵌套:超过3层的嵌套建议改用循环
- 善用生成器:大数据量时使用
()代替[] - 类型一致性:推导式结果类型需明确(列表/字典/集合)
六、课后练习(答案见评论区)
- 将二维列表
[[1,2], [3,4], [5,6]]转换为一维列表 - 使用推导式生成九九乘法表
- 找出100以内的所有完美数(等于其真因子之和的数)
知识图谱
创作不易,如果觉得有帮助,请点赞❤️收藏⭐!关于循环和推导式,你还有哪些想深入探讨的?欢迎在评论区留言!

1314

被折叠的 条评论
为什么被折叠?



