【Python】小甲鱼2022最新版课程p13-p19——分支与循环笔记

0.分支结构

0.由if语句操刀,一共有五种:

  1. 判断一个条件,如果这个条件成立,就执行其包含的某条语句或某个代码块。
    代码结构如下:
if condition:
	statement(s)
  1. 判断一个条件:如果条件成立,就执行其包含的某条语句或某个代码块;如果不成立,就执行另外的某条语句或者某个代码块。
    代码结构如下:
if condition:
	statement(s)
else:
	statement(s)
  1. 判断多个条件,如果第1个条件不成立,则继续判断第2个条件,如果第2个条件还不成立,则接着判断第3个条件…
    代码结构如下:
if condition1:
	statement(s)
elif condition2:
	statement(s)
elif condition3:
	statement(s)
...
  1. 在第4种情况下添加一个else,表示上面所有条件均不成立的情况下,执行某条语句或某个代码块。
    代码结构如下:
if condition1:
	statement(s)
elif condition2:
	statement(s)
elif condition3:
	statement(s)
...
else:
	statement(s)
  1. 将if-else语句变成表达式:条件成立时执行的语句 if condition else 条件不成立时执行的语句。
    具体例子:在这里插入图片描述
    且使用表达式方式可以方便将其嵌入语句中,比如如下题目:
    比较两个数的大小,并将较小的数赋值给一个叫做small的变量。
    传统方式:
    在这里插入图片描述
    表达式方式:
    在这里插入图片描述
    但是需要注意的是,表达式结构的if语句并不适用于较为复杂的情况,比如如下结构:
    在这里插入图片描述
    将其修改为表达式结构的话,为如下:
    在这里插入图片描述
    看起来似乎简单了许多,但是可读性并不好。

1.分支结构的嵌套

根据业务需求,需要嵌套多层if-else,如下:在判断是否满18岁后,还需要判断是否是男生。
在这里插入图片描述
可以嵌套无数层,但是嵌套过多层会影响代码颜值,代码的可读性会急速下降,后期维护难度也大大提高,所以并不建议。

1.循环结构

Python有两种循环语句:while循环和for循环

0.while循环

代码结构如下:

while condition:
	statement(s)

举几个例子:

0.每日致命一问:今天你还爱我吗?

在这里插入图片描述

1.计算1+2+3+…+1000000的值

在这里插入图片描述

2.死循环

在这里插入图片描述

1.插曲——break语句

break语句:跳出最近的一层循环体,执行该循环后面的语句。
举例:
在这里插入图片描述
在这里插入图片描述

2.插曲——continue语句

continue语句:跳出最近的一层的本轮循环,但不退出循环,而是回到循环体的条件判断位置,继续下一轮循环。
举例:
在这里插入图片描述

3.插曲——else语句

举例:
在这里插入图片描述
运行结果:
在这里插入图片描述
但是这里和不加else,而是直接在循环后加print语句有啥区别?
在这里插入图片描述
答案是在此处没有区别!那有啥用呢?
①中的else与while是并列的,相当于是不满足while的循环条件才会执行else内的语句。
如果在while循环中加一个break,那么其实就是break语句强制跳出循环,此时while循环的条件依旧满足,此时else内的print语句便不会执行。如下:
在这里插入图片描述
运行结果:在这里插入图片描述

而对②也进行一样的修改,最后的print语句还是会执行。
在这里插入图片描述
运行结果:
在这里插入图片描述
所以,while-else这样的设计有什么实质上的作用吗?
答案:可以非常容易地检测到循环的退出状况。
举例:

day = 1
while day <= 7:
    answer = input("今天有进行学习打卡吗?")
    if answer != '有':
        break
    day += 1
else:
    print("你真棒,你已经连续打卡7天啦!")

运行结果:
在这里插入图片描述

3.循环的嵌套

题目:打印一个九九乘法表

i = 1
while i < 10:
    j = 1
    while j < 10:
        if j != i + 1:   
            print(i, "*", j, "=", i*j, end=' ')
            j += 1
        else:
            break
    print()
    i += 1
    

运行结果:
在这里插入图片描述
改进:

i = 1
while i < 10:
    j = 1
    while j <= i:  #注意循环条件
    	print(i, "*", j, "=", i*j, end=' ')
        j += 1
    print()
    i += 1

强调:无论是break语句还是continue语句,它们只能作用于最近的一层循环体!

4.for循环

代码结构如下:

for 变量 in 可迭代对象:
	statement(s)

可迭代对象:元素可以被单独提取出来的对象。比如字符串等。而迭代就是遍历的过程。
举例:
在这里插入图片描述
while循环:
在这里插入图片描述

插曲——range函数

for循环经常搭配range()函数使用
range()函数可以创建一个整数列表,并返回一个可迭代对象(注意:类型是对象,不是直接返回列表类型!!!)
其有以下三种形式:(以下start、stop、step都只能是整数!)
1)range(stop):生成一个从0~stop(不包含stop)的整数序列,举例如下:
在这里插入图片描述
2)range(stop):生成一个从start~stop(不包含stop)的整数序列,举例如下:
在这里插入图片描述
3)range(start, stop, step):生成一个从start~stop(不包含stop),且步径的跨度为step的整数序列,举例如下:
步径的跨度为2:在这里插入图片描述

步径的跨度为-2(注意:因为是递减,所以start>stop才可以!):
在这里插入图片描述

此外,for循环和while循环一样,可以支持嵌套,可以搭配break语句、continue语句和else语句。
题目:找出10以内的所有素数。
代码:
在这里插入图片描述

2.课后作业

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搭配来实现三元操作符的功能。这里就是取x、y中更小的值。
三元操作符就是之前if-else关键字的最后一种,格式如下: exp1 if contion else exp2 condition 是判断条件,exp1 和 exp2 是两个表达式。如果 condition 成立(结果为真),就执行 exp1,并把 exp1 的结果作为整个表达式的结果;如果 condition 不成立(结果为假),就执行 exp2,并把 exp2 的结果作为整个表达式的结果。
使用三元操作符取三个数中的最小值:
small = x if (x < y and x < z) else (y if y < z else z)

4.成员资格运算符。

答:Python 有一个成员资格运算符:in,用于检查一个值是否在序列中,如果在序列中返回 True,否则返回 False。举例如下:
在这里插入图片描述

5.改进如下程序:

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

'''根据题意,平均分一般集中在70~80之间,那调整一下判断语句的顺序,即可一定程度上减少一些判断次数
score = int(input("请输入一个分数:"))
if 60 <= score < 80:
	print("C")
elif 80 <= score < 90:
	print("B")
elif 0 <= score < 60:
	print("D")
elif 90 <= score < 100:
	print("A")
else:
	print("请输入0-100的分数")

6. 下面的循环会打印多少次"I Love FishC"?

for i in range(0, 10, 2):
	print('I Love FishC')

答:5次。

7.下面的循环会打印多少次"I Love FishC"?

for i in 5:
    print('I Love FishC')

答:会报错,5不是可迭代对象。

8.回顾一下 break 和 continue 在循环中起到的作用?

答:break语句的作用是终止当前循环,跳出循环体。
continue语句的作用是终止本轮循环并开始下一轮循环(这里要注意的是:在开始下一轮循环之前,会先测试循环条件)。

9.请问 range(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

11.什么情况下我们要使循环永远为真?

答:(转自早知晓博主)可以用于游戏实现,因为游戏只要运行着,就需要时刻接收用户输入,因此使用永远为真确保游戏“在线”。操作系统也是同样的道理,时刻待命,操作系统永远为真的这个循环叫做消息循环。另外,许多通讯服务器的客户端/服务器系统也是通过这样的原理来工作的。
所以永远为“真”虽然是“死循环”,但不一定是坏事,再说了,我们可以随时用 break 来跳出循环!

12.你觉得以下代码效率方面怎样?有没有办法可以大幅度改进(仍然使用while)?

i = 0
string = 'ILoveFishC.com'
while i < len(string):
    print(i)
    i += 1

改进:

'''以上代码效率之所以低,是因为每次循环都需要调用一次len()函数,可以将len()函数提前使用'''
i = 0
string = 'ILoveFishC.com'
length = len(string)
while i < length:
    print(i)
    i += 1

13.设计一个验证用户密码程序,用户只有三次机会输入错误,不过如果用户输入的内容中包含"*"则不计算在内。

程序演示如图:
在这里插入图片描述
代码如下:

psw = '3435'
count = 3
answer = ''
while count > 0 and answer != psw:
    answer = input("请输入密码:")
    for i in answer:
        if i == '*':
            print('密码中不能含有"*"号!您还有', count, '次机会!', end='')
            break
    else:
        if answer != psw:
            count -= 1
            print("密码输入错误!您还有", count, "次机会", end='')
        else:
            print("密码正确,进入程序...")

直接使用’*’ in answer 就可以判断是否含有*,可以不用for循环呀!
改进:

psw= '3435'
count = 3
answer = ''
while count > 0 and answer != psw:
    answer = input("请输入密码:")
    if '*' in answer:
        print('密码中不能含有"*"号!您还有', count, '次机会!', end='')
    elif answer != psw:
        count -= 1
        print("密码输入错误!您还有", count, "次机会", end='')
    else:
        print("密码正确,进入程序...")

运行结果:
在这里插入图片描述

14.编写一个程序,求 100~999 之间的所有水仙花数。

如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数。

for n in range(100, 1000):
    #获取到个十百位
    g = n  % 10
    s = n // 10 % 10
    b = n // 100 % 10
    m = b ** 3 + s ** 3 + g ** 3 
    if n == m:
        print(n)

另一种思路:

for i in range(100, 1000):
    sum = 0
    temp = i
    while temp:
        sum += (temp % 10) ** 3 # 依次得到个十百位,进行幂运算后相加
        temp //= 10  # 地板除,以便进行下一次循环获取下一位
    if sum == i:  
        print(i)

运行结果:
在这里插入图片描述

15.三色球问题。

有红、黄、蓝三种颜色的球,其中红球 3 个,黄球 3 个,蓝球 6 个。先将这 12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种颜色搭配。

#蓝色球6个 红色球3个 黄色球3个
#由题意,至少会抽到2个蓝色球,红色球和黄色球则可能抽到0~3个
#以蓝色球和红色球进行嵌套for循环,而后只要保证黄色球是0~3个即可
for blue in range(2, 7):
    for red in range(0, 4):
        yellow = 8 - blue - red 
        if 0 <= yellow <= 3:
            print("蓝:", blue, "红:", red, "黄:", yellow)

运行结果:
在这里插入图片描述
其实,可以选任意两个颜色的球进行嵌套for循环,选择红色和黄色球时代码如下:

#蓝色球6个 红色球3个 黄色球3个
#由题意,至少会抽到2个蓝色球,红色球和黄色球则可能抽到0~3个
#以黄色球和红色球进行嵌套for循环,而后只要保证蓝色球是2~6个即可
for yellow in range(0, 4):
    for red in range(0, 4):
        blue = 8 - yellow - red 
        if 2 <= blue <= 6:
            print("蓝:", blue, "红:", red, "黄:", yellow)

运行结果:
在这里插入图片描述
使用转义字符’\t’制表:

#使用转义字符\t制表
print("蓝\t 红\t 黄")
for yellow in range(0, 4):
    for red in range(0, 4):
        blue = 8 - yellow - red 
        if 2 <= blue <= 6:
            print(blue, "\t", red, "\t", yellow)

运行结果:
在这里插入图片描述

16.判断一个整数是否为回文数。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

while 1:
    number = input("请输入一个整数:")
    if number.isdigit():
        dnumber = ''
        length = len(number)
        for i in range(length-1, -1, -1):
            dnumber += number[i]
        if dnumber == number:
            print("这是一个回文整数!")
        else:
            print("这不是一个回文整数!")
        break
    else:
        print("输入错误!")

使用字符串倒序(其实是切片操作的一种),代码如下:
a = a[::-1]
所以,代码可改进如下:

while 1:
    number = input("请输入一个整数:")
    if number.isdigit():
        dnumber = number[::-1]
        if dnumber == number:
            print("这是一个回文整数!")
        else:
            print("这不是一个回文整数!")
        break
    else:
        print("输入错误!")

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ED_Sunny小王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值