慕良 发表于 2020-1-31 15:32:48

python复盘:007-009了不起的分支和循环

本帖最后由 慕良 于 2020-1-31 18:41 编辑

007 了不起的分支和循环I

要点:判断、持续

例1:打飞机
简易版代码:

加载背景音乐
播放背景音乐(设置单曲循环)
我方飞机诞生
interval = 0

while True:
    if 用户是否点击了关闭按钮:
      退出程序
   
    interval += 1
    if interval = 50:
      interval = 0
      小飞机诞生
      
    小飞机移动一个位置
    屏幕刷新

    if 用户鼠标产生移动:
      我方飞机中心位置 = 用户鼠标位置
      屏幕刷新

    if 我方飞机与小飞机发生肢体冲突:
      我方挂,播放撞机音乐
      修改我方飞机图案
      打印"Game over"
      停止背景音乐,最好淡出


008 了不起的分支II

例2 分数ABCD
0-60为D,60-80为C,80-90为B,90-100为A。
方法一:if
方法二:if....else.....
方法三:if....elif....else....
score = int(input('请输入一个分数:'))
if 90<=score <=100:
    print('A')
elif 80<=score <=90:
    print('B')
elif 60<=score <=80:
    print('C')
elif 0<=score <=60:
    print('D')
else:
    print('输入错误!')


一、python可以有效避免“悬挂else”
缩进匹配

二、条件表达式(三元操作符)
语法:x if 条件 else y

x,y = 4,5
if x<y:
small = x
else:
small = y
可改为:
small = x if x<y else y

三、断言assert
当assert后边的条件为假时,系统自动崩溃并显示‘Assertion Error’
如:assert 3>4


009 了不起的循环III

一、while循环
语法:
while 条件:
    循环体

二、for循环
语法:
for 目标 in 表达式:
   循环体

例3:
favourite = 'fishC'
for i in favourite:
   print(i,end =' ')
输出:
f i s h C

例4:
member = ['小甲鱼','小布丁','黑夜','张良','颜路']
for zhang in member:
   print(zhang,len(zhang))
输出:
小甲鱼 3
小布丁 3
黑夜 2
张良 2
颜路 2

三、range( )
语法:
range( stop[ , step=1] )
作用:
生成一个从start参数值到stop参数值的数字序列

例5:
range(7)
输出:range(0,7)

例6:
for i in range(2,9):
   print(i)
输出:
2
3
4
5
6
7
8

例7:
for i in range(1,10,2)
   print(i)
输出:
1
3
5
7
9


四、两个关键的语句
break:终止循环
continue:终止本轮循环,开始下一轮循环

例8:
for i in range(10):
if i % 2 !=0:
      print(i)
      continue
i += 2
print(i)
输出:
2
1
4
3
6
5
8
7
10
9

慕良 发表于 2020-2-2 10:37:47

本帖最后由 慕良 于 2020-2-10 12:09 编辑

思考题

0. if not (money < 100): 上边这行代码相当于?
if money >= 100:

1. assert 的作用是什么?
assert 这个关键字我们称之为“断言”,当这个关键字后边的条件为假的时候,程序自动崩溃并抛出 AssertionError 的异常。什么情况下我们会需要这样的代码呢?当我们在测试程序的时候就很好用, 因为与其让错误的条件导致程序今后莫名其妙地崩溃, 不如在错误条件出现的那一瞬间我们实现“自爆”。一般来说我们可以用 Ta 再程序中置入检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作的话, assert 关键字就非常有用了。

2. 假设有 x = 1 ,y = 2 ,z = 3 ,请问如何快速将三个变量的值互相交换?
x, y, z = y, z, x

3. 猜猜 (x < y and or ) 实现什么样的功能?
三元操作符

4. 你听说过成员资格运算符吗?
Python有一个成员资格运算符:in,用于检查一个值是否在序列中,如果在序列中返回True,否则返回False。

5.下面的循环会打印多少次“I Love FishC”?
for i in range(0,10,2):
   print('I Love FishC')
5次

6.下面的循环会打印多少次“I Love FishC”?
for i in 5:
   print('I Love FishC')
会报错,因为in是“成员资格运算符”,而不是像C语言那样去使用for语法。python的for更像脚本语言的foreach。

7.回顾一下break和continue在循环中起到的作用?
break:终止循环,跳出循环体
continue:结果为True则中断后进入下一循环,结果为False则直接中断

8.谈谈对列表的理解?

9.range(10)生成哪些数?
会生成range(0,10)
转成列表:list(range(0,10))=【0,1,2,3,4,5,6,7,8,9】

10.目测以下程序会打印什么?
while True:
    while True:
      break
      print(1)
    print(2)
    break
print(3)

2
3
ps:break只能跳出一层循环

11.什么情况下我们要使循环永远为真?
用于游戏实现、操作系统、许多通讯服务器的客户端/服务器系统

12.用while 提高代码效率
i = 0
string = 'ILoveFishC.com'
while i< len(string):
    print(i)
    i += 1
ps:效率低是因为每次循环都需要调用一次len()函数
改进如下:
i = 0
string = 'ILoveFishC.com'
length = len(string)
while i < length:
    print(i)
    i += 1

慕良 发表于 2020-2-2 21:42:45

本帖最后由 慕良 于 2020-2-2 21:45 编辑

操作题

0. 视频中小甲鱼使用 if elif else 在大多数情况下效率要比全部使用 if 要高,但根据一般的统计规律, 一个班的成绩一般服从正态分布, 也就是说平均成绩一般集中在 70~80 分之间,因此根据统计规律,我们还可以改进下程序以提高效率。
题目备忘: 按照 100 分制,90 分以上成绩为 A,80 到 90 为 B,60 到 80 为 C,60 以下为 D,写一个程序,当用户输入分数,自动转换为 ABCD 的形式打印。
grade = int(input('请输入分数:'))
if 60 <= grade < 80:
    print('C')
elif 80 < grade <= 90:
    print('B')
elif 90 < grade:
    print('A')
elifgrade < 60:
    print('D')
else:
    print('输入错误!')

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
修改如下:
x,y,z = 6,5,4
min = x if x < y else y
small = min if min < z else z

2.设计一个验证用户密码程序,用户只有三次机会输入错误,不过如果用户输入的内容中包含‘*’则不计算在内。
程序演示如图:
https://xxx.ilovefishc.com/forum/201309/27/053244g5qmc891goc9mm1x.png
print('==========RESTART==========')
password = 'FishC.com'
i = 3
while i:
    write = input('请输入密码:')
    if write == password:
      print('密码正确,进入程序……')
      break
    elif '*' inwrite:
      print('密码中不能含有“*”号!您还有',i,'次机会!',end = "")
      continue
    else:
      print('密码输入错误!您还有', i, '次机会!',end = "")
      i -= 1

3.编写一个程序,求100-999之间的所有水仙花数。
如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153=1^3+5^3+3^3,因此153就是一个水仙花数。
i = 100
while i <= 999:
    number = (i//100)**3 + (((i-(i//100)*100))//10)**3 + (i-(i//10)*10)**3
    if i == number:
      print(i)
      i += 1
    else:
      i += 1

4.三色球问题
有红、黄、蓝三种颜色的球,其中红球3个,黄球3个,绿球6个。先将这12个球混合放在一个盒子中,从中任意摸出8个球,编程计算摸出球的各种颜色搭配。
print('red\yellow\green')
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)

ps:\t
https://img.php.cn/upload/image/443/582/434/1561000487848529.png

折折叠叠像弹簧 发表于 2020-2-15 10:57:36

想问一下为什么要把 i 的值赋给 temp 变量, 直接用 i 进行运算 , 得不出结果
for i in range(100,1000):
    sum = 0
    while i:
      sum = sum + (i%10)**3
      i //= 10
    if sum == i:
      print(i)

慕良 发表于 2020-2-16 10:17:27

折折叠叠像弹簧 发表于 2020-2-15 10:57
想问一下为什么要把 i 的值赋给 temp 变量, 直接用 i 进行运算 , 得不出结果
for i in range(100,1000): ...

你方便把原题以及你的做法发一下吗?不太理解你说的

隋戈子 发表于 2020-2-16 12:40:32

慕良 发表于 2020-2-16 10:17
你方便把原题以及你的做法发一下吗?不太理解你说的

他(@折折叠叠像弹簧)的意思是

水仙花数的那个题,给出的答案是这个

for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
      sum = sum + (temp%10) ** 3
      temp //= 10         # 注意这里要使用地板除哦~
    if sum == i:
      print(i)

在给出的答案中为什么要把 i 赋值给temp,而不直接用 i ,他尝试直接用 i ,得不出结果。

隋戈子 发表于 2020-2-16 12:45:12

折折叠叠像弹簧 发表于 2020-2-15 10:57
想问一下为什么要把 i 的值赋给 temp 变量, 直接用 i 进行运算 , 得不出结果
for i in range(100,1000): ...

我认为是因为 i 在为一个数的时候,while 就循环了三次,才表达出需要满足的式子(像153=1^3+5^3+3^3)

我昨天对这个问题的疑惑
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=156572&pid=4364369

慕良 发表于 2020-2-16 13:17:37

隋戈子 发表于 2020-2-16 12:40
他(@折折叠叠像弹簧)的意思是

水仙花数的那个题,给出的答案是这个


哦哦,原来是这样

慕良 发表于 2020-2-16 13:20:02

本帖最后由 慕良 于 2020-2-16 13:21 编辑

折折叠叠像弹簧 发表于 2020-2-15 10:57
想问一下为什么要把 i 的值赋给 temp 变量, 直接用 i 进行运算 , 得不出结果
for i in range(100,1000): ...

for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
      sum = sum + (temp%10) ** 3
      temp //= 10         # 注意这里要使用地板除哦~
    if sum == i:
      print(i)
因为如果不赋值到temp的话,第06行代码‘i //= 10’会把原来的i值改变
从而此时的 i 为个位数,不等于sum
页: [1]
查看完整版本: python复盘:007-009了不起的分支和循环