枪战英雄
99.99M · 2026-03-28
在Python中,for循环被称为“遍历循环”。与C/Java中经典的for(int i=0; i<n; i++)不同,Python的for更加抽象,它不依赖索引,而是依赖迭代器协议。
1. 从range()看内存优化
range()在Python 3中返回的是一个可迭代对象,而不是列表。这意味着range(1000000)不会在内存中生成一个包含100万个数字的列表,它只在循环时按需生成数字,极大地节省了内存。
# 掘金风格代码示例
# 计算水仙花数 - 使用生成器思维
def find_narcissistic_numbers():
for i in range(100, 1000):
# 位运算比取模更快,但取模可读性更好
digits = [int(d) for d in str(i)]
if sum(d ** 3 for d in digits) == i:
yield i # 使用生成器,按需产生结果
# 打印结果
for num in find_narcissistic_numbers():
print(num)
while循环在Python中通常用于模拟“状态机”或处理未知循环次数的逻辑。它的核心在于四个步骤,很多初学者的死循环往往是因为漏掉了“改变变量”这一步。
1. 避免“魔术数字”和“死循环”
在编写while循环时,最忌讳的是没有明确的退出条件。参考书中**【示例4-13】**的登录逻辑,我们可以看到使用计数器i来限制尝试次数的重要性。
# 重构【示例4-13】,提高可读性
MAX_ATTEMPTS = 3
attempts = 0
while attempts < MAX_ATTEMPTS:
username = input("Username: ")
password = input("Password: ")
if username == 'ysj' and password == '888888':
print("Login Success")
break # 成功即退出
attempts += 1
remaining = MAX_ATTEMPTS - attempts
if remaining > 0:
print(f"Error. {remaining} attempts left.")
else:
# else分支只在循环正常结束(即break未触发)时执行
print("Account locked.")
嵌套循环是算法复杂度的重灾区。书中**【示例4-15/16】**的图形打印是理解嵌套逻辑的绝佳案例,但要注意其时间复杂度。
center()方法来简化逻辑,或者将图形拆分为上下两个三角形分别处理。# 简化版:利用字符串操作打印等腰三角形(比双重循环更Pythonic)
row = 5
for i in range(1, row*2, 2):
print(('*' * i).center(row*2-1))
for:除非必须使用条件判断,否则优先使用for循环,因为它更不易出错。else:不要忽略for...else和while...else,它们可以帮你省去不必要的flag变量。itertools库或者重构函数来减少嵌套。
希望这些分析能让你对Python的循环结构有更深的理解!