零基础入门Python小甲鱼-笔记5

第4章 了不起的分支和循环

4.1 分支和循环

机器码生汇编,汇编生C,C生万物

世界上根本没有最优秀的编程语言,只有最适合的语言,面对不通的环境和需求,就会有不通的编程工具去迎合。

为什么说了不起的分支和循环,假如没有这两个的话,程序就是一条路走到黑(从上到下依次执行),不会因为某些条件而停下,或者是不能程序员重复利用代码。

幸亏,所有能称得上编程语言的,都应该拥有分支和循环这两种的实现。

  • 打飞机来解释一般游戏的组成和架构(基本上每一个游戏的套路都是一样的):
    进入游戏,其实就是进入一个大循环,只要每一触发死亡机制,敌机都会不断地生成,这就说明整个游戏就在一个循环中执行的。
  • 分支的概念,分支(if条件判断),在条件持续保持成立或不成立情况下,我们都执行固定的程序。条件满足,则不继续走下,不满足继续走下去。
  • 小飞机都是一个样子的?说明它们都是来自同一个对象的复制品,Python是面向对象的编程,对象这个概念无时无刻不融入到Python的血液里。
  • 飞机大战的这个游戏就只用几个循环和if判断就写出来啦,想想就激动,可以做出打飞机的游戏,程序如此简单。

飞机大战的逻辑尝试,参考框架如下:

加载背景音乐
播放背景音乐
我方飞机诞生
interval = 0
while True:
    if 用户是否单击了关闭按钮:
        退出程序
    interval += 1
    if interval == 50:
    小飞机诞生
    小飞机移动一个位置
    屏幕刷新
    interval = 0
    if 用户鼠标产生移动:
        我方飞机中心位置 = 用户鼠标位置
        屏幕刷新
    if 我方飞机与小飞机发生肢体接触(撞击)
        我方挂,播放撞机音乐
        修改我方飞机图案
        打印"GAME OVER"
        停止背景音乐

4.2 课堂小练习

判断和循环

判断就是应不应该做某事,循环就是持续做某事

判断习惯使用的是if-else的搭配,而循环就用我们已经掌握的while语句。

按照100分制,90分以上成绩为A,80~90为B,,60~80为C,60以下为D,现在要求你写一个程序,当用户输入分数,自动转换为A,B,C,D的形式打印出来,你能做出来吗?

我个人喜欢从小到大,所以就这样写啦!

#p4_1.py
score = int(input('请输入一个分数: '))
if 90 <= score <= 100:
    print('A')
if 80 <= score < 90:
    print('B')
if 60 <= score < 80:
    print('C')
if 0 <= score < 60:
    print('D')
if score < 0 and score >100:
    print('输入错误!')

当然你也可以写成:

这样写,我觉得超级不爽,条件多了,很麻烦

#p4_2.py
score = int(input('请输入一个分数: '))
if 90 <= score <= 100:
    print('A')
else:
    if 80 <= score < 90:
        print('B')
    else:
        if 60 <= score < 80:
            print('C')
        else:
            if 0 <= score < 60:
                print('D')
            else:
                print('输入错误!')

没错,我要偷懒啦!使用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('输入错误!')

4.3 结果分析

假如刚才输入的分数是98

方法一:第一次判断成立,然后打印字母A,但还是会进行第二、三、四、五次判断,然后条件都不符合,退出程序,那几次判断根本没有必要,既然条件满足啦,就不用往下面走啦

方法二、三,在第一次判断成立并打印出字母A之后,接着不需要进行任何判断就可以直接退出程序

性能方面:计入每一次判断会消耗一个CPU的时间,那么方法一比方法二、三多消耗了400%的时间。

我还是比较喜欢使用方法三,不知道大家喜欢哪一种?

4.4 Python可以有效避免”悬挂else”

什么叫”悬挂else”?一脸懵逼的表情看着你,举个栗子,初学C语言的朋友可能很容易被以下代码欺骗。

C语言:

if (hi >2)
    if( hi > 7):
        print("好棒!好棒!")
else:
    print("切~")

上面这个例子,虽然else是想和外层的if匹配,但事实上按照C语言的就近原则这个else是属于内层if的。由于初学者的一不小心,就容易导致BUG的出现。这就是”悬挂else”,嗯嗯,又学到啦!

Python的缩进使用强制规定使得代码必须正确对齐,然程序员来决定else是属于哪一个if,简单来说,你可以自己去找女朋友,而不是规定死就要那个作为你的女朋友吧。

强制使用正确的缩进,Python的代码变得很整洁易读,但是对于初学者来说,也很容易犯缩进的错误。

4.5 条件表达式(三元操作符)

“多少元”操作符的意思是这个操作符有多少个操作数

例如赋值操作”=”是二元操作符,因为它有左边和右边两个操作数。”-“是一元操作符,它表示负号,因为只有一个操作数。三元操作符就应该有三个操作数,bingo!

三元操作符是Python社区的小伙伴,千呼万唤始出来,Python的作者为Python加入这个三元操作符。

三元操作符的语法,表示当条件为True(真)的时候,a的值赋值为x,否则赋值为y:

a = x if 条件 else y

通过栗子来熟悉一下吧

x = 5
y = 6
if x < y:
    small = x
else:
    small = y
print("最小的数:",small)

下面使用三元操作符简化那个代码:

x = 5
y = 6
small = x if x < y else y
print("最小的数:",small)

4.6 断言

断言(assert)的语法其实有点像是if条件分支语句的”近亲”,所以就放在一块来讲了。

当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常。

什么情况需要这样的代码呢?当我们在测试程序的时候就很好用

与其让错误的程序导致今后莫名其妙地崩溃,不如在错误的日熬煎出现的那一瞬间实现”自我毁灭”

>>> assert 3 >4
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    assert 3 >4
AssertionError

当需要确保程序中的某个条件一定为真的才能让程序正常工作时,assert关键字就非常有用。

4.7 while循环语句

当条件为真的情况下,执行一段代码,只要条件为真,while循环会一直重复执行那段代码,把这段代码称为循环体

while 条件:
    循环体

4.8 for循环语句

for循环:Python的计数器循环

Python的for循环跟C语言的for循环不太一样,Python的for循环表现更为智能强大!这主要表现在它会自动调用迭代器的next()方法,会自动捕获StopIteration异常并结束循环。

>>> favourite = "FishC"
>>> for each in favourite:
    print(each,end='')

FishC

上面的打印加了一个东西,所以使得print()不自动换行

4.9 range()

for循环其实还有一个小伙伴:range()内建函数

语法:

range([start,]stop,step=1)

这个BIF有三个参数,其中用中括号括起来的两个表示这两个参数可选,之后出现这个的话,基本上都是这样的,step=1默认表示第三个参数的默认值是1。参数可以先理解为是函数的装备,函数有了装备攻击力什么的都会增加。

range的作用:
生成一个从start参数的值开始,到stop参数的值结束的数字序列。简单来说,就是可以规定开始的位置和结束的位置。常与for循环混迹于各种循环之间,也就是兄弟来的,我感觉挺好用的。

根据传递参数的个数划分为几种方式:

1.只传递一个参数的range(),例如range(5),先用代码展示结果,再说细节的东西

>>> for i in range(5):
    print(i)

0
1
2
3
4

相信不少的小伙伴,已经看出细节啦!!!

range(5)会把第一个参数的默认设置为0,生成0~5的所有数字(PS.包含0但是不包含5),也就是说它是左闭右开的区间,感觉我又再炫耀自己的数学知识啦,捂脸.jpg!

2.传递两个参数的range():

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

传递三个参数的range():

for i in range(1,10,2):
   print(i)

结果是:打印出1,3,5,,7,9,各自占一行

PS.如果是多次提示SyntaxError: expected an indented block,我建议不要使用Python自带的idle编辑器,我就有出现过这样的问题,而且是明明缩进没有问题偏偏报错,我vscode打开之后发现里面根本没有缩进,我也不知道是问题出现在哪里。

range()可以说是跟for循环最适合做搭档的小伙伴,for循环魅力很大,吸引了很多小伙伴,跟它一起玩,之后再介绍吧!

4.10 break 语句

break语句作用:

终止当前循环,跳出循环体。简单来说,也就是老师上课按顺序抽人回答问题,可你没有任何准备,当老师叫你的前面的那个童鞋之后,就不继续叫人回答问题,你就不用回答问题啦,哈哈哈哈

#p4_4.py
bingo = '小甲鱼是帅哥'
answer = input('请输入小甲鱼最想听的一句话:')
while True:
    if answer == bingo:
        break
    answer = input('抱歉,错了,请重新输入(答案正确才能退出游戏):')
print('哎呦,帅哦')
print('你真是小甲鱼肚里面的蛔虫啊笑脸.jpg')

只有当用户输入”小甲鱼是帅哥”的时候才会执行break语句,也就是跳出while循环体:

请输入小甲鱼最想听的一句话:我是帅哥
抱歉,错了,请重新输入(答案正确才能退出游戏):小甲鱼是大帅哥
抱歉,错了,请重新输入(答案正确才能退出游戏):小甲鱼是帅哥
哎呦,帅哦
你真是小甲鱼肚里面的蛔虫啊笑脸.jpg

用户输入”小甲鱼是大帅哥”,程序也不肯通过,一定要输入”小甲鱼是帅哥”

4.11 continue语句

continue语句的作用:

终止本轮循环并开始下一轮循环(PS.在开始下一轮循环之前,会先测试循环的条件),简单来说,也就是老师上课按顺序抽人回答问题,可你没有任何准备,当老师叫你的前面的那个童鞋之后,停止问问题,然后老师有提出了一个问题,然后是从你开始回答问题,不想出现的事情偏偏发生(捂脸.jpg)

#p4_5.py
for i in range(1,10,2):
    if i % 2 != 0:
        print(i)
        continue
    i += 2
    print(i)

大家来试一下不运行程序的情况下目测出答案?

我这就不把答案给出,自己去得出结果吧

参考资料是:零基础入门学习Python小甲鱼的书和视频教程

猜你喜欢

转载自blog.csdn.net/xyyojl/article/details/80550149