
1. Python循环基础回顾循环是编程中最基础也最重要的概念之一它允许我们重复执行某段代码直到满足特定条件为止。Python提供了两种主要的循环结构for循环和while循环。1.1 for循环的基本语法for循环在Python中通常用于遍历序列如列表、元组、字符串或其他可迭代对象。基本语法如下for 变量 in 可迭代对象: # 循环体代码一个简单的例子是打印1到5的数字for i in range(1, 6): print(i)注意range()函数生成的序列不包含结束值所以range(1,6)会生成1,2,3,4,51.2 while循环的基本语法while循环会在条件为真时重复执行代码块。基本语法如下while 条件表达式: # 循环体代码例如用while循环实现同样的1到5打印i 1 while i 5: print(i) i 11.3 循环控制语句Python提供了几个控制循环执行的关键字break立即退出整个循环continue跳过当前迭代进入下一次循环else循环正常结束后执行非break退出时# break示例 for i in range(10): if i 5: break print(i) # 只打印0-4 # continue示例 for i in range(10): if i % 2 0: continue print(i) # 只打印奇数 # else示例 for i in range(5): print(i) else: print(循环正常结束)2. 经典练习题一打印九九乘法表2.1 问题描述与分析九九乘法表是中国传统的数学学习工具也是检验循环掌握程度的经典题目。我们需要打印出如下格式的乘法表1*11 1*22 2*24 1*33 2*36 3*39 ... 1*99 2*918 ... 9*981分析这个结构我们发现有9行每行对应一个被乘数第n行有n个乘法等式每个等式格式为a*bc其中a从1到行号b等于行号2.2 实现代码与解析使用嵌套for循环实现for i in range(1, 10): # 外层循环控制行数 for j in range(1, i1): # 内层循环控制每行的列数 print(f{j}*{i}{i*j}, end\t) # 使用f-string格式化输出 print() # 每行结束后换行代码解析外层循环变量i从1到9表示当前行对应的被乘数内层循环变量j从1到i表示当前行的乘数end\t使每个等式后输出制表符而非换行内层循环结束后调用print()实现换行2.3 输出优化与变体如果想对齐输出结果可以使用字符串的format方法for i in range(1, 10): for j in range(1, i1): print({}*{}{:2}.format(j, i, i*j), end ) # 左对齐固定宽度 print()还可以实现倒三角形式的乘法表for i in range(9, 0, -1): # 从9递减到1 for j in range(1, i1): print(f{j}*{i}{i*j}, end\t) print()提示在实际开发中这种格式化输出技巧常用于生成报表或日志信息3. 经典练习题二寻找素数3.1 问题描述与算法选择素数是指大于1且只能被1和自身整除的自然数。我们需要编写程序找出100以内的所有素数。判断素数的基本思路对于数字n检查它是否能被2到√n之间的任何整数整除如果不能则n是素数3.2 基础实现代码for num in range(2, 100): # 假设当前数字是素数 is_prime True # 检查是否能被2到num的平方根之间的数整除 for i in range(2, int(num**0.5) 1): if num % i 0: is_prime False break if is_prime: print(num, end )3.3 算法优化上述算法可以进一步优化除了2以外所有偶数都不是素数可以跳过使用埃拉托斯特尼筛法筛法更高效筛法实现def sieve_of_eratosthenes(limit): sieve [True] * (limit 1) sieve[0:2] [False, False] # 0和1不是素数 for num in range(2, int(limit**0.5) 1): if sieve[num]: sieve[num*num::num] [False] * len(sieve[num*num::num]) return [i for i, is_prime in enumerate(sieve) if is_prime] primes sieve_of_eratosthenes(100) print(primes)3.4 性能比较对于小范围如100以内两种方法差异不大。但当范围增大时基础方法时间复杂度O(n√n)筛法时间复杂度O(n log log n)实际测试当n1,000,000时筛法比基础方法快约100倍4. 经典练习题三斐波那契数列4.1 问题描述与数学定义斐波那契数列是指这样一个数列0, 1, 1, 2, 3, 5, 8, 13, 21... 数学定义F(0) 0F(1) 1F(n) F(n-1) F(n-2) (n≥2)4.2 迭代法实现使用循环的迭代方法def fibonacci(n): a, b 0, 1 for _ in range(n): print(a, end ) a, b b, a b fibonacci(10) # 输出前10项4.3 递归法实现虽然题目要求用循环但作为对比我们看看递归实现def fib_recursive(n): if n 1: return n return fib_recursive(n-1) fib_recursive(n-2) for i in range(10): print(fib_recursive(i), end )警告纯递归实现效率极低时间复杂度O(2^n)仅适合教学演示4.4 性能优化与缓存可以使用缓存来优化递归实现from functools import lru_cache lru_cache(maxsizeNone) def fib_cached(n): if n 1: return n return fib_cached(n-1) fib_cached(n-2)或者使用迭代法的生成器版本def fib_generator(): a, b 0, 1 while True: yield a a, b b, a b fib fib_generator() for _ in range(10): print(next(fib), end )5. 循环编程技巧与最佳实践5.1 避免常见陷阱无限循环while循环中忘记更新条件变量# 错误示例 i 0 while i 10: print(i) # 忘记 i 1修改迭代中的列表在遍历列表时修改它# 错误示例 lst [1, 2, 3, 4] for item in lst: if item % 2 0: lst.remove(item) # 会导致意外行为正确做法是创建副本或使用列表推导式lst [item for item in lst if item % 2 ! 0]5.2 Python特有的循环技巧enumerate函数同时获取索引和值fruits [apple, banana, cherry] for idx, fruit in enumerate(fruits, start1): print(f{idx}. {fruit})zip函数并行迭代多个序列names [Alice, Bob, Charlie] scores [85, 92, 78] for name, score in zip(names, scores): print(f{name}: {score})else子句循环正常结束时的处理for i in range(5): if i 10: break else: print(循环完整执行未遇到break)5.3 性能优化建议尽量减少循环内部的函数调用对于大数据集考虑使用生成器而非列表使用内置函数如map、filter代替显式循环在NumPy等科学计算库中使用向量化操作替代循环# 传统循环 result [] for x in range(10): result.append(x**2) # 更Pythonic的方式 result [x**2 for x in range(10)] # 使用map适用于简单函数 result list(map(lambda x: x**2, range(10)))6. 实际应用案例扩展6.1 文件处理中的循环应用读取文件并处理每行内容with open(data.txt, r, encodingutf-8) as file: for line in file: # 处理每一行 processed_line line.strip().upper() print(processed_line)6.2 网络请求中的循环应用分页获取API数据import requests base_url https://api.example.com/data page 1 all_data [] while True: response requests.get(f{base_url}?page{page}) data response.json() if not data: break all_data.extend(data) page 16.3 数据分析中的循环模式使用pandas时的循环替代方案import pandas as pd # 不推荐的循环方式 df pd.DataFrame({A: range(10), B: range(10, 20)}) for index, row in df.iterrows(): df.at[index, C] row[A] row[B] # 推荐的向量化操作 df[C] df[A] df[B]7. 调试与问题排查7.1 常见循环错误Off-by-one错误循环次数多一次或少一次# 错误循环10次(0-9)而非9次 for i in range(10): print(i) # 实际需要0-8 # 正确 for i in range(9): print(i)修改迭代器在循环中修改正在迭代的对象d {a:1, b:2, c:3} for k in d: d[kx] d.pop(k) # 运行时错误7.2 调试技巧使用print语句检查循环变量for i in range(5): print(f循环开始i{i}) # 调试输出 # ...其他代码 print(f循环结束i{i}) # 调试输出使用IDE的调试工具设置断点对于复杂循环可以先在小数据集上测试7.3 性能分析使用timeit模块测量循环性能import timeit # 测试两种实现方式的性能 def test_for_loop(): result [] for i in range(1000): result.append(i**2) return result def test_list_comp(): return [i**2 for i in range(1000)] print(for循环:, timeit.timeit(test_for_loop, number1000)) print(列表推导:, timeit.timeit(test_list_comp, number1000))