Closed liujuanjuan1984 closed 4 years ago
流程控制语句、布尔值、布尔值操作符都属于 python 的基础功。大好周末我写这篇笔记,不是为了整理这些基础知识点,而是记录几个令我突然迷惑的代码段。——代码本身很简单,但即便已经掌握了基础功,陡然看到其中某个代码段,编程初学者还是容易困惑!
python
你,要不要随我一起读完全文,检查下自己是否牢牢掌握了 python 的流程控制语句?现在开始吧。
运行下面代码段,将打印什么呢?
代码段 A
if 1 + 2 == 3 : print('1') else: print('2')
代码段 B
if 1 + 3 == 3 : print('1') else: print('2')
上述 python 代码简单,且写法都很常见。A 的结果是 1,B 的结果是 2。你答对了吧?
A
1
B
2
接下来见证奇迹的时刻……再抽象一下,把上述语句中的布尔值的算式改成布尔值。下面两段运行代码后,将打印什么呢?
代码段 C
if True: print('1') else: print('2')
代码段 D
if False: print('1') else: print('2')
你是毫不犹豫、脱口而出的说出正确答案的吗?C 的结果是 1,D 的结果是2。这次你依然都答对了吗?
C
D
我的真实情况是,前两天做xue.cn的答题挑战时,看到代码段 D这种代码,突然思维打结。你会不会也遇到过明明早就掌握,但突然对某个知识点又理解无能的返祖情况?
我知道这是常见现象,所以没有焦虑感。我苦思冥想,尝试用理解而非死记硬背来彻底掌握这个知识点。
我是这样理解的。代码段 D 首个分支是 False ,其它分支被放到 else ,其它分支相当于首个分支的补集,即 not False 也就是 True,于是代码段 D 等同于:
False
else
not False
True
代码段 E
if False: print('1') elif True: print('2')
如法炮制,代码段 C 等同于:
代码段 F
if True: print('1') elif False: print('2')
从中可发现: if 分支控制语句,只会触发 条件为 True 的那个分支,条件为 False 的语句不会触发。
if
本来,这篇笔记整理到这里似乎也能收尾。但我立即联想到:流程控制语句,除了 if 这个分支控制,还有 while 和 for 两个循环控制,在循环控制语句中,会有怎样的规律呢?
while
for
打铁要趁热,不能停,我们继续检查自己的基础功是否牢靠,然后梳理一下吧!——认知心理学有个结论是,知识点之间的联想对照,具备非常好的学习效果。
代码段 G:
while False: print('1') break # 测试代码,加这句是为了用于跳出循环,避免无限循环 else: print('2')
代码段 H:
while True: print('1') break # 测试代码,加这句是为了用于跳出循环,避免无限循环 else: print('2')
代码段 I:
a = 1 while a < 4: print(a) a = a + 1 else: print('haha')
代码段 G 的结果为 2,代码段 H 的结果为 1。代码段 I 的结果为 1 2 3 haha。
G
H
I
1 2 3 haha
现在再看看 for 循环。
代码段 J:
for True: print(‘1’) else: print('2')
代码段 K:
for i in range(4): print(i) else: print('aha')
代码段 J 将报错,提示语法错误。代码段 K 结果为 0 1 2 3 aha
J
K
0 1 2 3 aha
结合之前用《自学是门手艺》学 python 基础功的印象,——如果印象很淡,说明自己的复习间隔太久,最好能调整下使之符合记忆曲线;整理时,最好立即翻到书中对应章节复习;再结合前面自测代码,有多种代码实现,现在我可以试着总结:
break
对我个人而言,for 和 while 循环控制语句,自测与复习都很轻松,暂时没有发现什么疑虑。最初令我迷惑的分支控制语句: if False 的条件为False,不为真,故该分支将不被执行。——如果流程控制语句中包含布尔运算,那么仅在条件为真时才触发对应语句块。
if False
你和我一起读到这里,是否检测到自己哪些地方存有困惑?如有,不妨参考我的做法,试试代码的不同写法,立即运行它,发现和总结规律吧!最后刘阿姨再叮嘱两句:多理解,少死记硬背,遵循记忆曲线,及时复习,用归纳整理的方式巩固加深影响哟~
布尔运算本来是基础功,但在xue.cn答题挑战时,被一道题难住。拆解后,终于发现自己的盲区。
0、突然降临的困惑
流程控制语句、布尔值、布尔值操作符都属于
python
的基础功。大好周末我写这篇笔记,不是为了整理这些基础知识点,而是记录几个令我突然迷惑的代码段。——代码本身很简单,但即便已经掌握了基础功,陡然看到其中某个代码段,编程初学者还是容易困惑!你,要不要随我一起读完全文,检查下自己是否牢牢掌握了
python
的流程控制语句?现在开始吧。1、流程控制语句之 if 分支控制
1.1 开胃小菜:几段简单的代码
运行下面代码段,将打印什么呢?
代码段 A
代码段 B
上述
python
代码简单,且写法都很常见。A
的结果是1
,B
的结果是2
。你答对了吧?1.2 见证奇迹:抽象一下
接下来见证奇迹的时刻……再抽象一下,把上述语句中的布尔值的算式改成布尔值。下面两段运行代码后,将打印什么呢?
代码段 C
代码段 D
你是毫不犹豫、脱口而出的说出正确答案的吗?
C
的结果是1
,D
的结果是2
。这次你依然都答对了吗?1.3 原则:多理解,少死记硬背
我的真实情况是,前两天做xue.cn的答题挑战时,看到代码段
D
这种代码,突然思维打结。你会不会也遇到过明明早就掌握,但突然对某个知识点又理解无能的返祖情况?我知道这是常见现象,所以没有焦虑感。我苦思冥想,尝试用理解而非死记硬背来彻底掌握这个知识点。
我是这样理解的。代码段
D
首个分支是False
,其它分支被放到else
,其它分支相当于首个分支的补集,即not False
也就是True
,于是代码段D
等同于:代码段 E
如法炮制,代码段
C
等同于:代码段 F
从中可发现:
if
分支控制语句,只会触发 条件为True
的那个分支,条件为False
的语句不会触发。本来,这篇笔记整理到这里似乎也能收尾。但我立即联想到:流程控制语句,除了
if
这个分支控制,还有while
和for
两个循环控制,在循环控制语句中,会有怎样的规律呢?打铁要趁热,不能停,我们继续检查自己的基础功是否牢靠,然后梳理一下吧!——认知心理学有个结论是,知识点之间的联想对照,具备非常好的学习效果。
2、流程控制语句之 while 与 for 循环控制
2.1 上菜:读代码,自测基础功
代码段 G:
代码段 H:
代码段 I:
代码段
G
的结果为2
,代码段H
的结果为1
。代码段I
的结果为1 2 3 haha
。现在再看看
for
循环。代码段 J:
代码段 K:
代码段
J
将报错,提示语法错误。代码段K
结果为0 1 2 3 aha
2.2 整理总结:基于理解,整理加深印象
结合之前用《自学是门手艺》学 python 基础功的印象,——如果印象很淡,说明自己的复习间隔太久,最好能调整下使之符合记忆曲线;整理时,最好立即翻到书中对应章节复习;再结合前面自测代码,有多种代码实现,现在我可以试着总结:
for
和while
循环控制语句中,else
并非必备部分。while
的循环体,仅在条件为True
时触发,条件一直为True
就一直执行;条件为False
或条件变成False
时该部分才执行完毕。for
的循环体,条件部分通常用于控制循环的次数或范围,并不能使用布尔值。else
部分,该else
属于while
整个循环控制的一部分。通常,else
是当循环部分执行完毕后才触发。例外情况是,如果循环部分包含break
语句并被触发,将跳出整个循环控制,即不执行else
部分的代码。3. 简短总结
对我个人而言,
for
和while
循环控制语句,自测与复习都很轻松,暂时没有发现什么疑虑。最初令我迷惑的分支控制语句:if False
的条件为False
,不为真,故该分支将不被执行。——如果流程控制语句中包含布尔运算,那么仅在条件为真时才触发对应语句块。你和我一起读到这里,是否检测到自己哪些地方存有困惑?如有,不妨参考我的做法,试试代码的不同写法,立即运行它,发现和总结规律吧!最后刘阿姨再叮嘱两句:多理解,少死记硬背,遵循记忆曲线,及时复习,用归纳整理的方式巩固加深影响哟~