Python `for` 循环完全指南(含用例)

Python for 循环完全指南

for 循环是 Python 中最核心的迭代结构,它能够遍历任何可迭代对象(如列表、元组、字符串、字典、集合、文件对象等),并对每个元素执行指定的操作。与其他语言(如 C 的 for (i=0; i<n; i++))不同,Python 的 for 更接近“foreach”风格,专注于遍历序列或集合中的元素,语法简洁且功能强大。

本文将系统讲解 for 循环的基本语法、常用场景,并通过杨辉三角打印数独求解器两个综合案例,展示 for 循环在实际编程中的灵活应用。


1. 基本语法与常用场景

1.1 语法结构

for 变量 in 可迭代对象: 循环体 else:# 可选,当循环正常结束(没有被 break 中断)时执行 语句块 
  • 变量:每次迭代从可迭代对象中取出一个元素赋值给该变量。
  • 可迭代对象:包括列表、元组、字符串、字典、集合、range 对象、文件对象、生成器等。
  • 循环体:需要重复执行的代码块,注意缩进。
  • else 子句:可选,当循环未被 break 终止时执行。

1.2 常用遍历场景

遍历列表
fruits =["苹果","香蕉","橙子"]for fruit in fruits:print(f"我喜欢吃 {fruit}")# 输出:# 我喜欢吃 苹果# 我喜欢吃 香蕉# 我喜欢吃 橙子
遍历元组
coordinates =(10,20,30)for coord in coordinates:print(f"坐标值: {coord}")
遍历字符串(字符序列)
message ="Python"for char in message:print(char, end="-")# 输出:P-y-t-h-o-n-
遍历字典
person ={"name":"张三","age":30,"city":"北京"}# 遍历键(默认)for key in person:print(key)# 输出:name age city# 遍历值for value in person.values():print(value)# 输出:张三 30 北京# 同时遍历键和值for key, value in person.items():print(f"{key}: {value}")
使用 range() 生成数字序列
# 生成 0 到 4for i inrange(5):print(i, end=" ")# 输出:0 1 2 3 4# 生成 2 到 8,步长为 2for i inrange(2,9,2):print(i, end=" ")# 输出:2 4 6 8# 使用索引遍历列表 fruits =["苹果","香蕉","橙子"]for i inrange(len(fruits)):print(f"索引 {i}: {fruits[i]}")
使用 enumerate() 同时获取索引和元素
fruits =["苹果","香蕉","橙子"]for index, fruit inenumerate(fruits):print(f"索引 {index}: {fruit}")
使用 zip() 并行遍历多个可迭代对象
names =["张三","李四","王五"] scores =[85,92,78]for name, score inzip(names, scores):print(f"{name} 的分数是 {score}")
循环控制:breakcontinue
# 查找第一个偶数 numbers =[1,3,5,8,9,10]for num in numbers:if num %2==0:print(f"找到偶数: {num}")break# 立即退出循环# 跳过偶数,打印奇数for num in numbers:if num %2==0:continue# 跳过本次循环剩余部分print(num)
for...else 结构
# 检查列表中是否有偶数 numbers =[1,3,5,7,9]for num in numbers:if num %2==0:print("发现偶数!")breakelse:print("没有偶数。")# 因为循环未被 break,所以执行
列表推导式(简洁的 for 循环)
# 生成 0~9 的平方列表 squares =[x**2for x inrange(10)]print(squares)# 输出:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# 带条件的推导式(只保留偶数) even_squares =[x**2for x inrange(10)if x %2==0]print(even_squares)# 输出:[0, 4, 16, 36, 64]
遍历文件对象
withopen("example.txt","r", encoding="utf-8")as f:for line in f:print(line, end="")# 逐行打印

2. 案例一:打印杨辉三角(数字金字塔)

杨辉三角(Pascal’s Triangle)是一个经典的数学图形,每一行由组合数构成,满足:

  • 第 n 行有 n+1 个数字(行号从 0 开始)。
  • 首尾数字为 1。
  • 内部数字等于上一行相邻两数之和:triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]

2.1 使用组合数公式(math.comb

import math defprint_pascal_comb(n):"""打印 n 行的杨辉三角,使用组合数公式"""for row inrange(n):# 打印前导空格,使三角形居中print(" "*(n - row -1)*3, end="")# 每个数字占3位,乘3对齐for col inrange(row +1): num = math.comb(row, col)print(f"{num:3}", end=" ")print() print_pascal_comb(6)

输出:

 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 

for 循环点睛:

  • 外层 for row 控制行数。
  • 内层 for col 遍历每一行的元素,用组合数计算值。
  • 前导空格数量随行数递减,实现居中效果。

2.2 使用迭代生成(递推关系)

defprint_pascal_iter(rows):"""打印 rows 行的杨辉三角,使用迭代生成""" triangle =[]# 存储整个三角形for i inrange(rows): row =[1]*(i +1)# 初始化为全1,首尾已正确for j inrange(1, i):# 从第2个到倒数第2个 row[j]= triangle[i-1][j-1]+ triangle[i-1][j] triangle.append(row)# 打印三角形 max_width =len(str(max(triangle[-1])))# 最大数字宽度for i, row inenumerate(triangle):print(" "*(rows - i -1)*(max_width +1), end="")for num in row:print(f"{num:{max_width}d}", end=" ")print() print_pascal_iter(8)

输出:

 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 

for 循环点睛:

  • 外层 for i 逐行构建。
  • 内层 for j 根据上一行计算当前行中间值。
  • 打印部分再次使用嵌套 for 控制对齐。

3. 案例二:数独求解器(回溯算法)

数独是 9×9 的网格,每行、每列和每个 3×3 宫(共 9 个)必须包含 1-9 各一次。我们将用 for 循环实现回溯法求解。

3.1 数独的表示

空白格用 0 表示,示例数独:

5 3 . | . 7 . | . . . 6 . . | 1 9 5 | . . . . 9 8 | . . . | . 6 . ------+-------+------ 8 . . | . 6 . | . . 3 4 . . | 8 . 3 | . . 1 7 . . | . 2 . | . . 6 ------+-------+------ . 6 . | . . . | 2 8 . . . . | 4 1 9 | . . 5 . . . | . 8 . | . 7 9 

3.2 合法性检查函数

defis_valid(board, row, col, num):"""检查在 (row, col) 处填入 num 是否合法"""# 检查行for j inrange(9):if board[row][j]== num:returnFalse# 检查列for i inrange(9):if board[i][col]== num:returnFalse# 检查所在 3x3 宫 start_row, start_col =3*(row //3),3*(col //3)for i inrange(start_row, start_row +3):for j inrange(start_col, start_col +3):if board[i][j]== num:returnFalsereturnTrue

for 循环点睛:

  • 三个独立的 for 循环分别扫描行、列、宫。
  • 宫内使用双重 for 遍历 3×3 区域。

3.3 回溯求解函数

defsolve_sudoku(board):"""使用回溯法求解数独(修改原 board),返回是否找到解"""for i inrange(9):for j inrange(9):if board[i][j]==0:# 找到空白格for num inrange(1,10):# 尝试 1-9if is_valid(board, i, j, num): board[i][j]= num if solve_sudoku(board):# 递归求解剩余部分returnTrue board[i][j]=0# 回溯returnFalse# 无解,回溯returnTrue# 无空白格,求解完成

for 循环点睛:

  • 双重 for 遍历整个棋盘,定位空白格。
  • 内层 for num 枚举所有候选数字,依次尝试。
  • 递归调用自身继续求解,利用 for 循环实现深度优先搜索。

3.4 打印函数

defprint_sudoku(board):"""美观打印数独棋盘"""for i inrange(9):if i %3==0and i !=0:print("-"*21)# 每三行打印横线for j inrange(9):if j %3==0and j !=0:print("|", end=" ")# 每三列打印竖线print(board[i][j]if board[i][j]!=0else".", end=" ")print()

for 循环点睛:

  • 外层 for i 控制行,内层 for j 控制列。
  • 利用 % 运算符在适当位置添加分隔符,使棋盘清晰。

3.5 完整测试

# 定义数独(同上) sudoku =[[5,3,0,0,7,0,0,0,0],[6,0,0,1,9,5,0,0,0],[0,9,8,0,0,0,0,6,0],[8,0,0,0,6,0,0,0,3],[4,0,0,8,0,3,0,0,1],[7,0,0,0,2,0,0,0,6],[0,6,0,0,0,0,2,8,0],[0,0,0,4,1,9,0,0,5],[0,0,0,0,8,0,0,7,9]]print("原始数独:") print_sudoku(sudoku)if solve_sudoku(sudoku):print("\n解出的数独:") print_sudoku(sudoku)else:print("无解")

输出(节选):

原始数独: 5 3 . | . 7 . | . . . 6 . . | 1 9 5 | . . . . 9 8 | . . . | . 6 . ------+-------+------ 8 . . | . 6 . | . . 3 4 . . | 8 . 3 | . . 1 7 . . | . 2 . | . . 6 ------+-------+------ . 6 . | . . . | 2 8 . . . . | 4 1 9 | . . 5 . . . | . 8 . | . 7 9 解出的数独: 5 3 4 | 6 7 8 | 9 1 2 6 7 2 | 1 9 5 | 3 4 8 1 9 8 | 3 4 2 | 5 6 7 ------+-------+------ 8 5 9 | 7 6 1 | 4 2 3 4 2 6 | 8 5 3 | 7 9 1 7 1 3 | 9 2 4 | 8 5 6 ------+-------+------ 9 6 1 | 5 3 7 | 2 8 4 2 8 7 | 4 1 9 | 6 3 5 3 4 5 | 2 8 6 | 1 7 9 

4. 总结

通过上述案例,我们可以看到 for 循环在 Python 编程中的核心地位:

  • 遍历数据:无论是简单的列表、字典,还是复杂的二维网格,for 循环都能轻松遍历。
  • 枚举尝试:在数独求解中,for num in range(1,10) 枚举所有可能数字,是回溯算法的基石。
  • 模式生成:杨辉三角的每一行都通过 for 循环递推构建,体现了循环与数学规律的结合。
  • 格式化输出:利用 for 循环控制打印格式,可以输出美观的图形(如数独棋盘、杨辉三角)。

掌握 for 循环,是通往 Python 编程高手的重要一步。希望本文的讲解和案例能帮助你更深入地理解并灵活运用这一强大的工具。

Read more

Java 部署:滚动更新(K8s RollingUpdate 策略)

Java 部署:滚动更新(K8s RollingUpdate 策略)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java部署这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 部署:滚动更新(K8s RollingUpdate 策略) * 什么是滚动更新(Rolling Update)? * 为什么 Java 应用特别需要滚动更新? * Kubernetes 滚动更新的核心机制 * 默认值 * 参数详解 * 构建一个支持滚动更新的 Java 应用 * 1. 创建 Spring Boot 项目 * 2. 编写主类 * 3. 添加控制器 * 4. 配置 Actuator 健康端点 * 5. 构建 Docker 镜像 * 编写 Kubernetes

By Ne0inhk
Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手

Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手

Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手 Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手,该教程详细讲解如何用 Python 爬取网易新闻每日热文,先介绍爬虫 “请求 - 解析 - 提取 - 保存” 原理及 requests、BeautifulSoup4 等必备库的安装,再逐段解析完整代码:从设置请求头模拟浏览器、发送 HTTP 请求获取网页数据,到通过关键词匹配和类名匹配双方案提取 “今日推荐” 热文,还包含数据去重、Excel 保存(按日期命名)及异常处理与调试模块。同时给出实操步骤,解答爬取不到数据、Excel 保存失败等常见问题,强调爬虫伦理与法律规范,最后提供定时爬取、多频道爬取等功能扩展建议,帮助小白轻松上手打造自动新闻采集工具。 前言     Python作为一门简洁、易读、功能强大的编程语言,

By Ne0inhk
Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型 * 什么是"一切皆对象"? * Python对象的类型层次 * 1. 内置类型对象 * 2. 函数对象 * 3. 类对象和实例对象 * 4. 模块对象 * 对象行为的统一性 * 特殊方法:对象行为的背后 * 对象模型的实际应用 * 性能考虑 * 总结 Python以其"一切皆对象"的设计哲学而闻名,这种设计为语言带来了极大的灵活性和一致性。本文将深入探讨Python的对象模型,解释为什么说"Python中一切皆对象",并通过实例展示这一特性如何影响我们的编程方式。 什么是"一切皆对象"? 在Python中,从简单的数字、字符串到复杂的函数、类甚至模块,所有这些都是对象。这意味着它们都有: 1. 身份(identity):对象在内存中的唯一地址,可通过id()函数获取 2.

By Ne0inhk
Python从0到100(九十四):深度可分离卷积的深入解析及在OPPORTUNITY数据集上的实战

Python从0到100(九十四):深度可分离卷积的深入解析及在OPPORTUNITY数据集上的实战

前言:零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者! 【优惠信息】 • 新专栏订阅前500名享9.9元优惠 • 订阅量破500后价格上涨至19.9元 • 订阅本专栏可免费加入粉丝福利群,享受: - 所有问题解答 -专属福利领取 欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程! 本文目录: * 一、深度可分离卷积的基础原理 * 1. 传统卷积的痛点 * 2. 深度可分离卷积的核心思路 * 二、深度可分离卷积的架构 * 1. 输入层 * 2. 深度可分离卷积模块 * 2.1 深度卷积(Depthwise Convolution) * 2.2 点卷积(Pointwise Convolution)

By Ne0inhk