鱼C论坛

 找回密码
 立即注册
查看: 2744|回复: 8

[学习笔记] python复盘:007-009了不起的分支和循环

[复制链接]
发表于 2020-1-31 15:32:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 慕良 于 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( [start,] 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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 [x] or [y])[0] 实现什么样的功能?
三元操作符


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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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')
elif  grade < 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.设计一个验证用户密码程序,用户只有三次机会输入错误,不过如果用户输入的内容中包含‘*’则不计算在内。
程序演示如图:

                               
登录/注册后可看大图
print('==========RESTART==========')
password = 'FishC.com'
i = 3
while i:
    write = input('请输入密码:')
    if write == password:
        print('密码正确,进入程序……')
        break
    elif '*' in  write:
        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

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你方便把原题以及你的做法发一下吗?不太理解你说的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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 ,得不出结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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?m ... 572&pid=4364369
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-16 13:17:37 | 显示全部楼层
隋戈子 发表于 2020-2-16 12:40
他(@折折叠叠像弹簧)的意思是  

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

哦哦,原来是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 06:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表