Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0154
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在:
- 个人网站: `https://oeasy.org`
- 蓝桥云课: `https://www.lanqiao.cn/courses/3584`
- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
- Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 上次研究了 三目运算符
- 根据条件 是否满足
- 可以得到 不同的结果值
- 三目运算符
- 一定 可以转化成 if语句
- 如果if有三个分支
- 怎么办??🤔
- 先判断
- score 是否大于 60
score = 70
if score >= 60:
if score >= 80:
print("perfect!")
else:
print("normal")
- 如果大于 60
- 再判断他 是否大于 80
- 如果大于 80
- 输出 perfect
- 否则的话
- 输出 normal
- 怎么知道这个 else 跟着哪个 if 呢?
- 看缩进
- 缩进相同的 几行
- 其实就是一个 block
score = 70
if score >= 60:
if score >= 80:
print("perfect!")
else:
print("normal")
- 现在的缩进显示
- else 跟着的是 第 3 行的 if
- 进去调试一下
- 如果我就想让他
- 跟第 2 行的 if 配对呢?
score = 40
if score >= 60:
if score >= 80:
print("perfect!")
else:
print("not pass")
- 重新调试
- 调整缩进
- 其实就是
- 调整 逻辑
- 其实就是
- 为什么缩进可以控制逻辑呢?
- 先看看 python 的前辈 c 语言
- 经常 出错误的一个点
- 在以上的 c 语言伪代码中
- else 并不会 和想象中的 外层if 配对
- 而是 和他离得最近的 if配对
- 除非 用大括号强行控制
- python 又如何 呢?
- python 不会出现 上面的问题
- 因为 python 从缩进上
- 就把逻辑关系 整得明明白白
- 一看就明白
- 缩进
- 不但 控制 代码的逻辑
- 而且 控制 代码的视觉效果
- 使用缩进
明确代码 从属关系- 清晰 看到 逻辑
- python 是如何翻译 缩进 的呢?
- 词法分析器
- 使用 一个堆栈
- 来存储语句的 缩进等级
- 初始情况 0
- 就是没有缩进
- 如果 下一行 有缩进的话
- 就把一个 token 令牌压入堆栈
- 文本流中 把空格或 tab 替换为
<INDENT>
- 如果 下一行 同样缩进
- 就不添加
<INDENT>
- 就不添加
- 如果下一行 添加缩进
- 就在流中 添加
<INDENT> - 一行最多一个
<INDENT>
- 就在流中 添加
- 如果下一行 减少缩进
- 就根据 减少缩进的数量
- 在流中 添加相应的
<DEDENT> - 一行可能有多个
<DEDENT>
- 上图中
- 左边是 流中插入的 文本
- 右边是 堆栈中的 状态
- 这一步 发生了之后
<INDENT>、<DEDENT>已经成为了文本流中的一部分- 然后 再去 语法分析
- 控制 语法树中逻辑
- 缩进方面
- python 的 缩进
- 领先于 大括号
- 能把上面三种可能性
- 都处理了么?
- 按照这个流程图的逻辑
- 落实到代码
score = 50
if score >= 60:
if score >= 80:
print("Perfect!")
else:
print("Normal!")
else:
print("Not Pass")
- 在if语句里面
- 嵌套了if语句
- 这次 在条件 里面添加了 条件
- 缩进结构
- 既是样式
- 也是逻辑关系
- 缩进结构
- 嵌套可以有很多很多层
先判断谁后判断谁- 有什么
说法吗?🤔
- 下次再说 👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。












