第007讲~第009讲:了不起的分支和循环
一 条件判断
1 if条件判断语句
语法格式:if 条件:
执行语句
else:
执行语句
扩展:if 条件:
执行语句
elif 条件:
执行语句
else:
执行语句
2 python可以有效避免悬挂else
eg:
C语言:else与最近的if(hi > 7)相对应,如果后面不再加else语句的话,程序应该会报错
python语言:else与if (hi > 2)配对,Python中的缩进很重要
3 条件表达式(三元操作符) x if 条件 else y
eg:
x,y=1,5 if x<y: small = x else: small = y
上述代码可以改进为: small = x if x<y else y
4 断言assert
- 定义:我们把assert关键字称之为断言,当关键字后面的条件都为假的时候,程序自动崩溃并抛出AssertionError异常
- 应用情景:当需要确保程序中的某个条件一定为真时,才能让程序正常工作的话,就可以使用assert断言了。我们可以用它在程序中置入检查点
二 循环
1 while循环
- 语法:while 条件:
- 循环体
2 for循环
- 定义:可以遍历任何序列的项目,例如列表、元组、字符串
- 语法:for 目标 in 表达式:
- 循环体
- 特点:python的for循环可以自动调用迭代器的next() 方法,会自动的去捕获StopIteration* 异常并结束循环,具体可见:https://blog.csdn.net/sinat_38682860/article/details/89408311
3 range()
- 语法:range ( [start] , stop [,step = 1] )
- 这个BIF有三个参数,其中用中括号扩起来的两个表示这两个参数是可选的
- step = 1 表示第三个参数的默认值是1,它是步进的意思,表示两个数据之间的间隔
- 作用:生成一个从start参数的值开始到stop参数的值结束的数字序列
4 两个关键语句
break:终止整个循环并跳出循环体
continue:终止本次循环,并检测循环条件,如果循环条件满足进行下一次循环,否则退出循环
三 课后作业
(一)测试题答案
第007、008讲:
0. if not (money < 100): 这行代码相当于?
if money >= 100:
1. assert 的作用是什么?
assert这个关键字我们称之为“断言”,当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常。
什么情况下我们会需要这样的代码呢?当我们在测试程序的时候就很好用,因为与其让错误的条件导致程序今后莫名其妙地崩溃,不如在错误条件出现的那一瞬间我们实现“自爆”。
一般来说我们可以用Ta再程序中置入检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert关键字就非常有用了。
2. 假设有 x = 1,y = 2,z = 3,请问如何快速将三个变量的值互相交换?
x, y, z = z, y, x
3. 猜猜 (x < y and [x] or [y])[0] 实现什么样的功能?
这其实是 Python 的作者还没有为 Python 加入三元操作符之前,Python 社区的小伙伴们灵活的使用 and 和 or 搭配来实现三元操作符的功能,这里边有涉及到列表和切片的知识,这部分知识很快就会讲解,迫不及待的朋友可以先稍微预习下。
4. 你听说过成员资格运算符吗?
Python 有一个成员资格运算符:in,用于检查一个值是否在序列中,如果在序列中返回 True,否则返回 False。
例如:
>>> name = '小甲鱼' >>> '鱼' in name True >>> '肥鱼' in name False
第009讲:
0. 下面的循环会打印多少次"I Love FishC"?
for i in range(0, 10, 2): print('I Love FishC')
5 次,因为从 0 开始,到 10 结束,步进为 2。
1. 下面的循环会打印多少次"I Love FishC"?
for i in 5: print('I Love FishC') 会报错,上节课的课后习题我们提到了 in 是“成员资格运算符”,而不是像 C 语言那样去使用 for 语法。Python 的 for 更像脚本语言的 foreach。
2. 回顾一下 break 和 continue 在循环中起到的作用
break语句的作用是终止当前循环,跳出循环体。
continue语句的作用是终止本轮循环并开始下一轮循环(这里要注意的是:在开始下一轮循环之前,会先测试循环条件)。
3. 请谈下你对列表的理解
嗯,有些知识点需要自己总结才能加固,下节课小甲鱼将跟大家畅谈一个打了激素的数组:列表,不容错过哦^_^
4. 请问 range(10) 生成哪些数?
会生成 range(0, 10),list(range(0, 10)) 转换成列表是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],注意不包含 10 哦
5. 目测以下程序会打印什么?
while True: while True: break print(1) print(2) break print(3)
会打印:
2
3
因为 break 只能跳出一层循环,记住咯!
6. 什么情况下我们要使循环永远为真?
while Ture:
循环体
同样用于游戏实现,因为游戏只要运行着,就需要时刻接收用户输入,因此使用永远为真确保游戏“在线”。操作系统也是同样的道理,时刻待命,操作系统永远为真的这个循环叫做消息循环。另外,许多通讯服务器的客户端/服务器系统也是通过这样的原理来工作的。
所以永远为“真”虽然是“死循环”,但不一定是坏事,再说了,我们可以随时用 break 来跳出循环!
7. 【学会提高代码的效率】你的觉得以下代码效率方面怎样?有没有办法可以大幅度改进(仍然使用while)?
i = 0 string = 'ILoveFishC.com' while i < len(string)): print(i) i += 1
这段代码之所以“效率比较低”是因为每次循环都需要调用一次 len() 函数(我们还没有学到函数的概念,小甲鱼这里为零基础的朋友形象的解释下:就像你打游戏打得正HIGH的时候,老妈让你去买盐......你有两种选择,一次买一包,一天去买五次,或者一次性买五包回来,老妈要就直接给她。)
i = 0 string = 'ILoveFishC.com' length = len(string) while i < length: print(i) i += 1
(二) 动动手答案
1. Python 的作者在很长一段时间不肯加入三元操作符就是怕跟 C 语言一样搞出国际乱码大赛,蛋疼的复杂度让初学者望而生畏,不过,如果你一旦搞清楚了三元操作符的使用技巧,或许一些比较复杂的问题反而迎刃而解。
x, y, z = 6, 5, 4 if x < y: small = x if z < small: small = z elif y < z: small = y else: small = z
我的更改结果:
if x<y: small = z if z<x else x else: small = y if y<z else z
小甲鱼更改结果:
small = x if (x < y and x < z) else (y if y < z else z)
2 设计一个验证用户密码程序,用户只有三次机会输入错误,不过如果用户输入的内容中包含"*"则不计算在内。
程序演示如图:
小甲鱼的代码:
count = 3 password = 'FishC.com' while count: passwd = input('请输入密码:') if passwd == password: print('密码正确,进入程序......') break elif '*' in passwd: print('密码中不能含有"*"号!您还有', count, '次机会!', end=' ') continue else: print('密码输入错误!您还有', count-1, '次机会!', end=' ') count -= 1
我自己没写出来代码,一个是对成员运算符in的理解不够,想着通过for循环在循环内部判断输入字符串里面有没有“*”号,结果弄了半天没弄出来。因为我在自己的思路里面把判断字符串(输入密码)里面有没有“*”号跟判断输入字符串在没有“*”的条件下是否与正确的密码一致当作了两个独立的循环(两个while循环实现),所以写出来的代码总是只能完成一部分的要求,即要么可以判断有没有*号,要么只能判断是不是一致,代码逻辑非常混乱,结果最终还是没有实现题目要求。就很难受,下面是我的代码,感觉真的是漏洞百出,唯一的体会就是自己去思考代码内部逻辑真的才是实现一个具体问题的难关,并且自己写和直接看别人写代码真的不一样。。。
错误的代码:
count = 3 answer = "FishC.com" password = input("请输入密码:") while True: for i in password: if i == '*': print(f"密码中不能含有'*'号,您还有{count}次机会!请重新输入密码",end = '') password = input() continue break while count > 0: if password == answer: print("密码正确,进入程序......") break else: print(f"密码输入错误,您还有{count-1}次机会!请输入密码:",end = '') password = input() count -= 1 continue
执行结果:
PS E:\3_work\4_python\2_code\03_LittleTurtleStudio> python ex9.py 请输入密码:123* 密码中不能含有'*'号,您还有3次机会!请重新输入密码21`* 密码输入错误,您还有2次机会!请输入密码:12`3 密码输入错误,您还有1次机会!请输入密码:23 密码输入错误,您还有0次机会!请输入密码:2
PS E:\3_work\4_python\2_code\03_LittleTurtleStudio> python ex9.py 请输入密码:1242* 密码中不能含有'*'号,您还有3次机会!请重新输入密码1232 密码输入错误,您还有2次机会!请输入密码:FishC.com 密码正确,进入程序......
由执行结果可以看到:我的代码只实现了后面一部分的内容,“*”号判断部分的内容基本算是没有实现的,所以就很难受。。。
3. 编写一个程序,求 100~999 之间的所有水仙花数。
如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数
我的代码:
"""功能:判断一个三位数是不是水仙花数 如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。 例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数 """ num = input("请输入一个三位数:") temp = int(num) num2 = 0 # 利用for循环输出三位数里面各个数字的三次方之和 for i in num: j = int(i) num2 += j**3 print(num2) # 将原来的三位数与其各位数字的三次方之和作比较 if(temp == num2): print("三位数"+ num + "是一个水仙花数") else: print("三位数"+ num + "不是一个水仙花数")
写完之后我突然发现,我审错题目了。。。。。算了,程序就放这儿吧。。。。。
小甲鱼代码:
for i in range(100, 1000): sum = 0 temp = i while temp: sum = sum + (temp%10) ** 3 temp //= 10 # 注意这里要使用地板除哦~ if sum == i: print(i)
语法:range(100,1000):用来产生100~1000的所有三位数
while循环:用来求三位数的各位数字三次方之和
if条件判断:用来判断三位数是不是水仙花数
4. 三色球问题
有红、黄、蓝三种颜色的球,其中红球 3 个,黄球 3 个,绿球 6 个。先将这 12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种颜色搭配。
小甲鱼代码:
print('red\tyellow\tgreen') for red in range(0, 4): for yellow in range(0, 4): for green in range(2, 7): if red + yellow + green == 8: # 注意,下边不是字符串拼接,因此不用“+”哦~ print(red, '\t', yellow, '\t', green)
注释:range(2, 7) 是产生 [2, 3, 4, 5, 6] 这 5 个数,绿球不能是 1 个,因为如果绿球是 1 个的话,红球 + 黄球需要有 7 个才能符合题意,而红球和黄球每种只有 3 个,因此是 range(2, 7)
这题我直接做不出来,我脑袋有点混,都快想到组合排列了,而且不知道怎么转换成编程语句,题目只需要计算出8个球的各种颜色搭配,不需要排列顺序,即题目的意思是计算8个球里面不同颜色的球有几个,有多少种情况就行了。