@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使用的是缩进来表示范围,处于同一列起始的内容,属于同一个范围。中间只能有更长的缩进,不能有更短的缩进。例如statems11statments12属于同一个范围,但是它们都和statements2不属于一个范围。

  1. if condition1:
  2. statements11
  3. statements12
  4. elif condition2:
  5. statments2
  6. else:
  7. statments3

这里我们给出了比较全的格式。其实有很多种使用方式。我们一个个讲。但是不能单独使用else或者elif

1.1.1 单独使用if

basil回家路上,如果遇到了ZYH就打招呼。

  1. meet_zyh = False # 通过控制它的真假,就可以决定是否打招呼
  2. if meet_zyh:
  3. print('hello')
  4. print('basil is going home.')

1.1.2 if else

basil要去找ZYH,如果ZYH在家他就进去,否则就不进。

  1. zyh_at_home = True
  2. if zyh_at_home:
  3. print('ZYH is at home.')
  4. else:
  5. print("ZYH is not at home.")

1.1.3 综合实例

现在我们根据学生分数score,判断学生类别。总分100,score大于90为A类学生;否则大于80为B类学生;否则大于70为C类;否则大于60为D类;否则为E类。怎么写呢?注意否则条件,代表之前的不满足。

  1. score = eval(input('Enter a student\'s score: '))
  2. if 100 < score:
  3. print('Error: score cannot larger than 100')
  4. elif 90 <= score:
  5. print("A")
  6. elif 80 <= score:
  7. print("B")
  8. elif 70 <= score:
  9. print("C")
  10. elif 60 <= score:
  11. print("D")
  12. else:
  13. print("E")

这里只能有一个if以及一个else,剩下的都是elif,而且条件肯定没有交叉,否则有交叉的,先符合的条件就会先执行,后符合的条件会被跳过。

1.2 条件语句嵌套

条件语句也能嵌套。所谓嵌套,就是一个条件分支下面的语句体(statements)中,还可以有条件语句。

我们这里把上面的例子改一下,使用嵌套的条件语句完成相同的功能。这里你看到代码11行,我们是怎么使用逻辑运算符的了,那是一个并列条件,但是在Python中其实不用这样子麻烦,因为它支持数学上的表示方式:60 <= score < 70

  1. score = eval(input('Enter a student\'s score: '))
  2. if 100 < score: # 不可能大于100
  3. print('Error: score cannot larger than 100')
  4. elif 60 <= score: # 大于60分
  5. if 80 <= score: # 大于80分
  6. if 90 <= score: # 大于90分小于100分属于A类学生
  7. print("A")
  8. else: # 大于80分小于90分属于B类学生
  9. print("B")
  10. else: # 小于80分
  11. if 60 <= score and score < 70: # 大于70分小于80分属于D类学生
  12. print("D")
  13. elif 70 <= score: # 大于60分小于80分属于C类学生
  14. print("C")
  15. else: # 小于60分属于E类
  16. print("E")

2. 循环语句

2.1 while循环

它的基本格式如下所示。条件还是和条件语句中的一样,不过既然叫做循环,就是只要满足条件就会一直执行,直到条件不满足,才会退出。所以这里一定要注意,要有一个循环退出的条件,不然就成了死循环。死循环,就是会一直执行,这样的程序不是没有,但是分情况。尽量不要写这样的死循环吧。

  1. while conditions:
  2. statements

现在basil学习了gauss的事迹之后,想用程序算一下1+2+...+100,该怎么做呢?

  1. sum = 0 # 结果和
  2. start = 1 # 初始值
  3. end = 100 # 结束值
  4. while start <= end: # 只要start <= end,就进入循环体,也即执行下面3行
  5. sum = sum + start # 把sum + start 再赋值给sum
  6. start += 1 # 注意+=符号,其实就是start = start + 1的简写
  7. # print("start = {}, sum = {}".format(start, sum))
  8. print("1+2+……+100 =", sum)

如果你想看到每一步执行的结果,请打开第8行的注释,相信聪明的你已经知道如何打开注释了,就是删除#即可,然后就能看到每一步的输出了。如果你已经自己学会了debug,那就更好不过了。我们知道这个最后输出的sum是5050,而start的值是从1到101,但是当start是101时,就不符合条件了,会跳出循环。一定要注意这个边界条件哦。

2.2 for循环

for循环的格式是

  1. for <item> in <iterable>:
  2. statements

也许你现在还不知道什么是<iterable>,但是没关系,可以暂时记忆一下,有listtuplesetdictstrrange,这些吧,不过这里面只学习过字符串。所以下面我们就只讲字符串的版本,其它的都一样。

我们现在遍历一个字符串,打印出basil名字,一行一个字符。

  1. for letter in 'basil':
  2. print(letter)

是不是使用for也很简单~下面我们学习下range迭代器,以后会常常用到的。

range函数有两种形式,我们之所以称它为迭代器是因为,它可以一个一个的整出来很多整数。

  1. # 1. 从0到stop,后面->代表的是返回值的格式,就是一个range对象,暂时不用管,
  2. # stop必须是正整数,默认的迭代为1,也就是每次加1,生成序列是[0, stop)
  3. # 0, 1, 2, ..., stop-1
  4. range(stop) -> range object
  5. # 2. 从start 到stop,没有第三个参数step,默认的step(步进)为1,生成序列是[start, stop)
  6. # start, start+1, start+2, ..., stop-1
  7. # 如果加上了step,就是指定了每次步进为多少,可以为负整数,[start, stop)
  8. # start, start+step, start+2*step, ... stop
  9. # 一定要记得只能省略step,其它两个参数start和stop不能省略。
  10. range(start, stop[, step]) -> range object

好了基本上range也说完了,我们看些例子吧。一般range就是搭配for来使用的。

  1. >>> for i in range(20):
  2. ... print(i, end=', ')
  3. ...
  4. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  5. >>> for i in range(1, 20):
  6. ... print(i, end=', ')
  7. ...
  8. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  9. >>> for i in range(1, 50, 3):
  10. ... print(i, end=', ')
  11. ...
  12. 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49,
  13. >>> for i in range(20, 0, -2):
  14. ... print(i, end=', ')
  15. ...
  16. 20, 18, 16, 14, 12, 10, 8, 6, 4, 2,

下面使用for range来重写上面的1+2+...+100问题。

  1. # 用for range 来重写1+2+...+100
  2. sum = 0
  3. start = 1
  4. end = 101 # 注意这里是101, 因为包前不包后,左闭右开
  5. for i in range(start, end):
  6. sum += i # 还记得+=吧,等价于sum = sum + i
  7. print("1+2+3+...+100 = {}".format(sum))

2.3 breakcontinue

其实现在我们讲这两个关键字有点不合时宜,因为还没有到需要跳出和继续的时候,不过我们来模拟一个吧。
现在我们来写一个猜数字的小游戏。然后我们要怎么处理输入、输出呢?

  1. 首先我们需要选择一个数字,这个应该是随机生成的,我们需要使用到随机random包,它有一个随机生成整数的randint(a, b)函数,它可以生成一个位于[a, b]区间内的整数。
  2. 然后从命令行接受用户输入。需要使用到eval(input())函数,input()函数从命令行接受输入,但是它是字符串,它有一个参数,就是提示字符串;eval()函数把接收到的字符串转换为它所属于的数据类型,不能转换就是字符串咯。有关这些函数你都可以在命令行使用help(<funcName>)查看帮助。
  3. 然后我们比对用户输入和我们使用随机函数生成的整数对比,如果相等,我们就退出程序;如果不相等,则继续提示用户输入。

这样子,我们的这个小游戏,就需要一直运行。我们就需要写一个死循环,让它只要不符合就一直运行下去。但是当用户猜测正确的时候,我们就需要退出了呀,不能一直处于循环中呢,该怎么办呢?这时我们可以使用break来跳出当前层循环,注意是当前层,如果是循环嵌套循环,不能这样子做呢。

  1. import random
  2. num = random.randint(0, 100) # 生成一个随机数,每次运行程序都不一定一样
  3. guess_times = 0 # 记录猜测的次数
  4. while True:
  5. guess = eval(input('Enter an integer: ')) # 提示用户输入
  6. guess_times += 1 # 猜测次数增加1
  7. if guess == num: # 猜对了
  8. print("Congratulations!")
  9. break # 退出循环,这样子就不会是一直运行了
  10. elif guess < num: # 猜测小了
  11. print("Sorry, too small. Guess again")
  12. else: # 猜测大了
  13. print("Sorry, too big. Guess again.")

continue是做什么的呢?它不同于break,它是跳出本次循环,进行下次循环的意思。

假设我们要在1~100之间找到并打印所有是5的倍数的数字,那么怎么做呢?

  1. for num in range(1, 101): # 注意是101哦
  2. if num % 5 != 0: # 这是num对5取余数,注意是不等于,不等于就不是5的倍数
  3. continue
  4. print(num, end=' ')

所以所谓的“结束本次循环,进入下次循环”,简单直白地讲就是,continue直接返回到循环头了。我们说循环头都是for或者while所在行,循环头下面的缩进至少一格的都是它的循环体。