@Author: Basil Guo
@Date: Jun. 10, 2021
@Description: Python中流程控制语句
1. 条件语句
条件语句,就是符合条件做什么,或者不符合条件作什么。一般会分为条件为真和条件为假,也就是符合和不符合。比如basil有一台电脑为真,ZYH是女孩子为真,basil为女孩子为假。
在Python中,我们之前接触过了布尔bool类型,它就是要么为真True,要么为假False。我们也学习了逻辑运算符(AND OR NOT)、测试运算符(in is)、条件运算符(== != > >= < <=)。这三种都可以用在条件语句中。
1.1 基本格式
条件语句的基本格式是,注意Python使用的是缩进来表示范围,处于同一列起始的内容,属于同一个范围。中间只能有更长的缩进,不能有更短的缩进。例如statems11和statments12属于同一个范围,但是它们都和statements2不属于一个范围。
if condition1:statements11statements12elif condition2:statments2else:statments3
这里我们给出了比较全的格式。其实有很多种使用方式。我们一个个讲。但是不能单独使用else或者elif。
1.1.1 单独使用if
basil回家路上,如果遇到了ZYH就打招呼。
meet_zyh = False # 通过控制它的真假,就可以决定是否打招呼if meet_zyh:print('hello')print('basil is going home.')
1.1.2 if else
basil要去找ZYH,如果ZYH在家他就进去,否则就不进。
zyh_at_home = Trueif zyh_at_home:print('ZYH is at home.')else:print("ZYH is not at home.")
1.1.3 综合实例
现在我们根据学生分数score,判断学生类别。总分100,score大于90为A类学生;否则大于80为B类学生;否则大于70为C类;否则大于60为D类;否则为E类。怎么写呢?注意否则条件,代表之前的不满足。
score = eval(input('Enter a student\'s score: '))if 100 < score:print('Error: score cannot larger than 100')elif 90 <= score:print("A")elif 80 <= score:print("B")elif 70 <= score:print("C")elif 60 <= score:print("D")else:print("E")
这里只能有一个if以及一个else,剩下的都是elif,而且条件肯定没有交叉,否则有交叉的,先符合的条件就会先执行,后符合的条件会被跳过。
1.2 条件语句嵌套
条件语句也能嵌套。所谓嵌套,就是一个条件分支下面的语句体(statements)中,还可以有条件语句。
我们这里把上面的例子改一下,使用嵌套的条件语句完成相同的功能。这里你看到代码11行,我们是怎么使用逻辑运算符的了,那是一个并列条件,但是在Python中其实不用这样子麻烦,因为它支持数学上的表示方式:60 <= score < 70。
score = eval(input('Enter a student\'s score: '))if 100 < score: # 不可能大于100print('Error: score cannot larger than 100')elif 60 <= score: # 大于60分if 80 <= score: # 大于80分if 90 <= score: # 大于90分小于100分属于A类学生print("A")else: # 大于80分小于90分属于B类学生print("B")else: # 小于80分if 60 <= score and score < 70: # 大于70分小于80分属于D类学生print("D")elif 70 <= score: # 大于60分小于80分属于C类学生print("C")else: # 小于60分属于E类print("E")
2. 循环语句
2.1 while循环
它的基本格式如下所示。条件还是和条件语句中的一样,不过既然叫做循环,就是只要满足条件就会一直执行,直到条件不满足,才会退出。所以这里一定要注意,要有一个循环退出的条件,不然就成了死循环。死循环,就是会一直执行,这样的程序不是没有,但是分情况。尽量不要写这样的死循环吧。
while conditions:statements
现在basil学习了gauss的事迹之后,想用程序算一下1+2+...+100,该怎么做呢?
sum = 0 # 结果和start = 1 # 初始值end = 100 # 结束值while start <= end: # 只要start <= end,就进入循环体,也即执行下面3行sum = sum + start # 把sum + start 再赋值给sumstart += 1 # 注意+=符号,其实就是start = start + 1的简写# print("start = {}, sum = {}".format(start, sum))print("1+2+……+100 =", sum)
如果你想看到每一步执行的结果,请打开第8行的注释,相信聪明的你已经知道如何打开注释了,就是删除#即可,然后就能看到每一步的输出了。如果你已经自己学会了debug,那就更好不过了。我们知道这个最后输出的sum是5050,而start的值是从1到101,但是当start是101时,就不符合条件了,会跳出循环。一定要注意这个边界条件哦。
2.2 for循环
for循环的格式是
for <item> in <iterable>:statements
也许你现在还不知道什么是<iterable>,但是没关系,可以暂时记忆一下,有list、tuple、set、dict、str、range,这些吧,不过这里面只学习过字符串。所以下面我们就只讲字符串的版本,其它的都一样。
我们现在遍历一个字符串,打印出basil名字,一行一个字符。
for letter in 'basil':print(letter)
是不是使用for也很简单~下面我们学习下range迭代器,以后会常常用到的。
range函数有两种形式,我们之所以称它为迭代器是因为,它可以一个一个的整出来很多整数。
# 1. 从0到stop,后面->代表的是返回值的格式,就是一个range对象,暂时不用管,# stop必须是正整数,默认的迭代为1,也就是每次加1,生成序列是[0, stop)# 0, 1, 2, ..., stop-1range(stop) -> range object# 2. 从start 到stop,没有第三个参数step,默认的step(步进)为1,生成序列是[start, stop)# start, start+1, start+2, ..., stop-1# 如果加上了step,就是指定了每次步进为多少,可以为负整数,[start, stop)# start, start+step, start+2*step, ... stop# 一定要记得只能省略step,其它两个参数start和stop不能省略。range(start, stop[, step]) -> range object
好了基本上range也说完了,我们看些例子吧。一般range就是搭配for来使用的。
>>> for i in range(20):... print(i, end=', ')...0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,>>> for i in range(1, 20):... print(i, end=', ')...1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,>>> for i in range(1, 50, 3):... print(i, end=', ')...1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49,>>> for i in range(20, 0, -2):... print(i, end=', ')...20, 18, 16, 14, 12, 10, 8, 6, 4, 2,
下面使用for range来重写上面的1+2+...+100问题。
# 用for range 来重写1+2+...+100sum = 0start = 1end = 101 # 注意这里是101, 因为包前不包后,左闭右开for i in range(start, end):sum += i # 还记得+=吧,等价于sum = sum + iprint("1+2+3+...+100 = {}".format(sum))
2.3 break和continue
其实现在我们讲这两个关键字有点不合时宜,因为还没有到需要跳出和继续的时候,不过我们来模拟一个吧。
现在我们来写一个猜数字的小游戏。然后我们要怎么处理输入、输出呢?
- 首先我们需要选择一个数字,这个应该是随机生成的,我们需要使用到随机
random包,它有一个随机生成整数的randint(a, b)函数,它可以生成一个位于[a, b]区间内的整数。 - 然后从命令行接受用户输入。需要使用到
eval(input())函数,input()函数从命令行接受输入,但是它是字符串,它有一个参数,就是提示字符串;eval()函数把接收到的字符串转换为它所属于的数据类型,不能转换就是字符串咯。有关这些函数你都可以在命令行使用help(<funcName>)查看帮助。 - 然后我们比对用户输入和我们使用随机函数生成的整数对比,如果相等,我们就退出程序;如果不相等,则继续提示用户输入。
这样子,我们的这个小游戏,就需要一直运行。我们就需要写一个死循环,让它只要不符合就一直运行下去。但是当用户猜测正确的时候,我们就需要退出了呀,不能一直处于循环中呢,该怎么办呢?这时我们可以使用break来跳出当前层循环,注意是当前层,如果是循环嵌套循环,不能这样子做呢。
import randomnum = random.randint(0, 100) # 生成一个随机数,每次运行程序都不一定一样guess_times = 0 # 记录猜测的次数while True:guess = eval(input('Enter an integer: ')) # 提示用户输入guess_times += 1 # 猜测次数增加1if guess == num: # 猜对了print("Congratulations!")break # 退出循环,这样子就不会是一直运行了elif guess < num: # 猜测小了print("Sorry, too small. Guess again")else: # 猜测大了print("Sorry, too big. Guess again.")
那continue是做什么的呢?它不同于break,它是跳出本次循环,进行下次循环的意思。
假设我们要在1~100之间找到并打印所有是5的倍数的数字,那么怎么做呢?
for num in range(1, 101): # 注意是101哦if num % 5 != 0: # 这是num对5取余数,注意是不等于,不等于就不是5的倍数continueprint(num, end=' ')
所以所谓的“结束本次循环,进入下次循环”,简单直白地讲就是,continue直接返回到循环头了。我们说循环头都是for或者while所在行,循环头下面的缩进至少一格的都是它的循环体。
