0、突然降临的困惑

流程控制语句、布尔值、布尔值操作符都属于 python 的基础功。大好周末我写这篇笔记,不是为了整理这些基础知识点,而是记录几个令我突然迷惑的代码段。——代码本身很简单,但即便已经掌握了基础功,陡然看到其中某个代码段,编程初学者还是容易困惑!

你,要不要随我一起读完全文,检查下自己是否牢牢掌握了 python 的流程控制语句?现在开始吧。

1、流程控制语句之 if 分支控制

1.1 开胃小菜:几段简单的代码

运行下面代码段,将打印什么呢?

代码段 A

if 1 + 2 == 3 :
print('1')
else:
print('2')

代码段 B

if 1 + 3 == 3 :
print('1')
else:
print('2')

上述 python 代码简单,且写法都很常见。A 的结果是 1B 的结果是 2。你答对了吧?

1.2 见证奇迹:抽象一下

接下来见证奇迹的时刻……再抽象一下,把上述语句中的布尔值的算式改成布尔值。下面两段运行代码后,将打印什么呢?

代码段 C

if True:
print('1')
else:
print('2')

代码段 D

if False:
print('1')
else:
print('2')

你是毫不犹豫、脱口而出的说出正确答案的吗?C 的结果是 1D 的结果是 2。这次你依然都答对了吗?

1.3 原则:多理解,少死记硬背

我的真实情况是,前两天做xue.cn的答题挑战时,看到代码段 D这种代码,突然思维打结。你会不会也遇到过明明早就掌握,但突然对某个知识点又理解无能的返祖情况?

我知道这是常见现象,所以没有焦虑感。我苦思冥想,尝试用理解而非死记硬背来彻底掌握这个知识点。

我是这样理解的。代码段 D 首个分支是 False ,其它分支被放到 else ,其它分支相当于首个分支的补集,即 not False 也就是 True,于是代码段 D 等同于:

代码段 E

if False:
print('1')
elif True:
print('2')

如法炮制,代码段 C 等同于:

代码段 F

if True:
print('1')
elif False:
print('2')

从中可发现: if 分支控制语句,只会触发 条件为 True 的那个分支,条件为 False 的语句不会触发。

本来,这篇笔记整理到这里似乎也能收尾。但我立即联想到:流程控制语句,除了 if 这个分支控制,还有 whilefor 两个循环控制,在循环控制语句中,会有怎样的规律呢?

打铁要趁热,不能停,我们继续检查自己的基础功是否牢靠,然后梳理一下吧!——认知心理学有个结论是,知识点之间的联想对照,具备非常好的学习效果。

2、流程控制语句之 while 与 for 循环控制

2.1 上菜:读代码,自测基础功

代码段 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

现在再看看 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

2.2 整理总结:基于理解,整理加深印象

结合之前用《自学是门手艺》学 python 基础功的印象,——如果印象很淡,说明自己的复习间隔太久,最好能调整下使之符合记忆曲线;整理时,最好立即翻到书中对应章节复习;再结合前面自测代码,有多种代码实现,现在我可以试着总结:

  • forwhile 循环控制语句中,else 并非必备部分。
  • while 的循环体,仅在条件为 True 时触发,条件一直为 True 就一直执行;条件为 False 或条件变成 False 时该部分才执行完毕。
  • for 的循环体,条件部分通常用于控制循环的次数或范围,并不能使用布尔值。
  • 循环控制语句有时包含else 部分,该 else 属于 while 整个循环控制的一部分。通常,else是当循环部分执行完毕后才触发。例外情况是,如果循环部分包含 break 语句并被触发,将跳出整个循环控制,即不执行 else 部分的代码。

3. 简短总结

对我个人而言,forwhile 循环控制语句,自测与复习都很轻松,暂时没有发现什么疑虑。最初令我迷惑的分支控制语句: if False 的条件为False,不为真,故该分支将不被执行。——如果流程控制语句中包含布尔运算,那么仅在条件为真时才触发对应语句块。

你和我一起读到这里,是否检测到自己哪些地方存有困惑?如有,不妨参考我的做法,试试代码的不同写法,立即运行它,发现和总结规律吧!最后刘阿姨再叮嘱两句:多理解,少死记硬背,遵循记忆曲线,及时复习,用归纳整理的方式巩固加深影响哟~

和35岁刘阿姨一起自测 Python 流程控制基本功的更多相关文章

  1. 35岁老半路程序员的Python从0开始之路

    9年的ERP程式开发与维护,继而转向一年的售前,再到三年半的跨行业务,近4的兜兜转转又转回来做程式了,不过与之前不同的,是这次是新的程序语言Python, 同时此次是为了教学生而学习! 从今天开始,正 ...

  2. 转一篇100offer的采访~35岁程序员是一种什么状态

    随着互联网的高速发展变革,大龄恐惧症越来越多地在技术圈被人讨论.很多程序员在工作5-10年以后,都会开始思考5年.10年甚至更久以后的自己,会是怎样一种生活工作状态,以及是否会被时代抛弃. 特别是全民 ...

  3. IT技术开发人员35岁之前应该做的十件事

    第一,学会本行业所需要的一切知识并有所发展.已故零件大王布鲁丹在他35岁时,已经成为零件行业的领袖,并且组建了年收入达千万美元的海湾与西部工业公司.每个人在年轻时都可能有过彻夜不眠.刻苦攻读,这在20 ...

  4. SAP成都研究院35岁以上的开发人员都去哪儿了?

    2006年成立的SAP成都研究院,位于天府软件园B区.如今,因为研究院发展的不断壮大, 已经搬迁到天府软件园E区了,因此,发生在图片building各种充满悲欢离合的故事,已经成为一部分小伙伴脑海中难 ...

  5. 程序人生 | 35岁以上的 iOS 程序员都到哪里去了?

    1.网上流传华为公司正在清理 34 岁以上的员工. " 中国区开始集中清理 34 + 的交付员工,...... 去向是跟海外服务部门交换今年新毕业的校招员工,也就是进新人,出旧人. 这些旧人 ...

  6. [No000011B]为什么有些程序员悄无声息渡过35岁中年危机?

    今天分享是一些已经渡过中年危机的前辈们,看看从他们身上,是如何优雅的过渡的.如果想一直在程序这条路上走下去,建议读完.文章略长. 人物一:陈睿,前百度研发经理,携程定制旅游CTO 从程序员到架构师到管 ...

  7. 2016/3/30 ①投票checkbox ②进度条两个div套起百分比控制内div(width) <div><div></div></div> ③数据库test2 表 diaoyan... 35岁发展方向投票

    分两个页面,要点:提交form 相连action method  两个页面可以合成一个页面action传到自身页面   但分开较清晰 第一个页面vote.php <!DOCTYPE html P ...

  8. 35岁,成就寥寥,为时已晚?(I am 35 and I haven't achieved much in life. Is it too late?)

    今天无意中看到Quora上的一个问题: I am 35 and I haven't achieved much in life. Is it too late? 下面的一个排第二的回复我蛮喜欢的,直接 ...

  9. 献给即将35岁的初学者,焦虑 or 出路?

    导言:“对抗职场“35 岁焦虑”,也许唯一的方法是比这个瞬息万变的商业社会跑得更快!” 一直以来,都有许多人说“程序员或测试员是个吃青春饭的职业”,甚至还有说“35 岁混不到管理就等于失业”的言论. ...

随机推荐

  1. Kafka 学习笔记之 Producer/Consumer (Scala)

    既然Kafka使用Scala写的,最近也在慢慢学习Scala的语法,虽然还比较生疏,但是还是想尝试下用Scala实现Producer和Consumer,并且用HashPartitioner实现消息根据 ...

  2. MongoDB 学习笔记之 匹配完整数组

    匹配完整数组: 创建一个集合(包含数组) db.ArrayTest.insert({name: "Sky" , address: [{"street" : &q ...

  3. JVM(四)类加载机制

    1.静态绑定和动态绑定 静态绑定:即前期绑定,在程序执行前方法已经被绑定,此时由编译器或者其他连接程序实现,针对Java,可以理解为编译期的绑定,java中只有final.static.private ...

  4. linux无法安装应用

    需安装flex 和bison 一般需要更新软件源 root权限 下 apt-get update apt-get upgrade 如果出现以下问题,先查看网络是否畅通: ping 192.168.0. ...

  5. 服务网关Spring Cloud Zuul

    Spring Cloud Zuul 开发环境 idea 2019.1.2 jdk1.8.0_201 Spring Boot 2.1.9.RELEASE Spring Cloud Greenwich S ...

  6. Kylin构建Cube过程详解

    1 前言 在使用Kylin的时候,最重要的一步就是创建cube的模型定义,即指定度量和维度以及一些附加信息,然后对cube进行build,当然我们也可以根据原始表中的某一个string字段(这个字段的 ...

  7. RF作用与目的

    robotframework自动化原理:通过ride工具编写脚本,加载指定的UI测试库,再通过pybot程序去运行指定脚本,调用浏览器驱动,打开浏览器,操作浏览器页面元素,达到模拟用户操作的行为 为什 ...

  8. 清理 Sketch缓存 Storyist 3.5.1中文破解版 for Mac

    Sketch这款软件可以用来做原型和UI设计,很多设计师和产品经理都在用,时间长了以后,Sketch会占据不少缓存空间,这时候可以试试 Sketch Cache Cleaner 这款软件清理历史文件和 ...

  9. Windows常用操作

    目录 查询IP地址 常用快捷键 显示文件后缀名 查询IP地址 1.进入到dos界面 2.输入命令: ipconfig 常用快捷键 快捷键 作用 win+E 打开计算机 win+R 打开运行 win+R ...

  10. 《Java并发编程实战》读书笔记-第2章 线程安全性

    要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问. 修复多线程问题的方式: 不在线程之间共享该状态变量 将状态变量修改为不可变的变量 在访问状态变量时使用同步 ...