【李刚-21天通关Python】第三章:流程控制
章节分篇链接:
【李刚-21天通关Python-11】之 if 分支
【李刚-21天通关Python-12】之 循环
【李刚-21天通关Python-13】之 实操:控制台打印菱形和圆
【李刚-21天通关Python-14】之 实操:绕圈圈面试题
第三章:流程控制
if 分支
一、三种程序结构
1、顺序结构
- 顺序结构就是程序从上到下一行行执行,中间没有任何判断和跳转
- 如果不使用流程控制,Python程序的语句是一个顺序执行流
2、分支结构
- if 分支使用布尔表达式或布尔变量作为分支条件来进行分支控制
- Python的 if 分支既可作为语句使用,也可作为表达式使用
3、循环结构
二、if 分支的三种语法格式
# 1
'''
if 条件:
执行体
'''
# 2
'''
if 条件:
执行体1
else:
执行体2
'''
# 3
'''
if 条件:
执行体1
elif 条件:
执行体2
elif 条件:
执行体2
……
else:
执行体3
'''
score = int(input("请输入成绩:"))
if score > 90:
print("优秀")
elif score > 80:
print("良好")
elif score > 70:
print("中等")
elif score > 60:
print("及格")
else:
print("不及格")
三、注意点
1、缩进
- Python的语句块是通过缩进来标记的,相同缩进的多行代码属于同一个语句块
- 同一个代码块可以缩进1个空格、2个空格……或一个Tab位,这都是符合语法要求的。但同一个代码块的缩进要统一。
2、冒号
- Python的冒号精确表示代码块的开始点
- 条件执行体、循环体、方法体、类体都是从冒号开始,后面统一缩进的部分算一个整体的代码块
四、if 条件的类型
- if 条件可以是任意类型,除了False本身之外,各种代表“空”的None、空字符串、空元组、空列表、空字典,都会被当成False处理,以下各值都会被当作False:
- False、None、0、""、()、[]、{}
- 若 if 条件不为空,则被当作True
五、if 条件的逻辑问题
- else 的隐藏条件是 if 条件的取反
- 要先处理范围小的条件再处理范围大的条件
score = int(input("请输入成绩:"))
if score > 60:
print("及格")
# else的隐藏条件为score<=60,加上elif现有的条件score>70,所以不可能成立
# 即 print("中等") 这条语句不可能执行
else score > 70:
print("中等")
六、if 表达式
age = int(input("请输入您的年龄: ")) # input 25
print("年龄大于25岁") if age > 25 else print("年龄等于25岁") if age == 25 else print("年龄小于25岁")
# 年龄等于25岁
七、pass 语句
- pass 语句就是空语句
- 有时候程序需要占一个位、放一条语句,但又不希望这条语句做任何事,此时就可以通过 pass 语句来实现
- 通过 pass 语句可以让程序更完整
score = int(input("请输入成绩:"))
if score > 90:
pass
循环
一、循环的意义
- 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体
- 当反复执行这个循环体时,需要在合适的时候把循环条件改为假,从而结束循环,否则循环将一直执行下去,形成无限循环
二、while 循环
1、while 循环的语法格式:
'''
[init_statements]
while test_expression:
body_statements
[iteration_statements]
'''
2、由于列表和元组的元素都是有索引的,因此程序可通过 while 循环、列表或元组的索引来遍历列表或元组中所有的元素
my_data = ['java', 'swift', 'python', 'kotlin']
i = 0
while i < len.(my_data):
print(my_data[i])
i += 1
# java
# swift
# python
# kotlin
三、for-in 循环
- for-in 循环专门用于遍历范围、列表、元素和字典等可迭代对象包含的元素
- 语法格式如下:
'''
for 变量 in 字符串/范围/集合等
statements
'''
s = 'python'
for c in s:
print(c)
# p
# y
# t
# h
# o
# n
说明:
- for-in 循环中的变量的值受 for-in 循环控制,该常量将会在每次循环开始时被自动赋值,程序对 for-in 循环的循环计数器赋值在语法上是允许的,但没有什么意义,而且非常容易导致错误
- for-in 循环可用于遍历任何可迭代对象。所谓可迭代对象就是该对象包含一个__iter__方法,且该方法的返回值对象具有 next() 方法即可
四、循环中使用else
- Python的循环都可以定义 else 语句块,当循环条件为False时程序会执行 else 语句块
- 循环的else块,是Python的一个很特殊的语法,else 语句块的主要作用是以便生成更优雅的Python代码
for c in 'abc':
print(c)
else:
print("循环结束")
五、嵌套循环
把一个循环放在另一个循环体内,就可形成嵌套循环
- 对于外层循环而言,内层循环就是一条语句
- 当内层循环执行M次,外层循环执行N次,内层循环的循环体一共会执行M×N次
for i in range(10):
j = 0
while j < 20:
print("i: %d, j: %d" % (i, j))
j += 1
六、列表推导式(for表达式)
- for 表达式用于利用其他区间、元组、列表等可迭代对象创建新的列表,语法格式如下:
- [ 表达式 for 循环计数器 in 可迭代对象 ]
r = [i * 2 for i in range(10)]
print(r)
# 计算1~100的和
print(sum([i for i in range(1,101)])) # 5050
七、for表达式与普通for循环的区别
- for 关键字之前定义一个表达式,该表达式通常会包含循环计数器
- for 表达式没有循环体,因此不需要冒号
- for 表达式同样有循环,它会将每次循环执行的值收集起来成为新的列表元素,for 表达式最终返回的是列表
八、使用 break 跳出循环
- 使用 break 可以提前跳出循环,而不是等到循环条件是False时才结束循环
- 带 else 块的 for 循环,如果使用 break 强行中止循环,程序将不会执行 else 块
for i in range(100):
print(i)
if i < 5:
break
else:
print("循环结束")
# 0
# 1
# 2
# 3
# 4
# 5
# 6
九、使用 continue 忽略本次循环
- continue 只会忽略本次循环剩下的语句,接着开始下一次循环,并不会中止循环
- 把 continue 语句放在循环的最后一句,那么这条 continue 语句是没有意义的
for i in range(6):
print(i)
if i > 3:
continue
print("循环第%d次" % i)
# 0
# 循环第0次
# 1
# 循环第1次
# 2
# 循环第2次
# 3
# 循环第3次
# 4
# 5
十、使用 return 结束函数
- return 的作用是结束函数
- 无论 return 处于多深的嵌套循环中,return 总可以结束函数
实操:控制台打印菱形和圆
一、打印菱形
# 在控制台用“*”打印菱形
'''
*
* *
* *
* *
* *
* *
*
'''
N = 5
# 上半部分:
# 菱形内每行的空格为:0,1,3,5,……
# 菱形前的空格为:层数-1,层数-2,……
for i in range(N):
# 第一行
if i == 0:
print(' ' * (N - 1 - i) + '*')
else:
s = ' ' * (N - 1 - i) + '*' + (i * 2 - 1) * ' ' + '*'
print(s)
# 下半部分:
# 菱形前的空格为:1,2,3,4,……
# 菱形内每行的空格为:层数*2-5,层数*2-7,……
for i in range(N - 1):
# 最后一行
if i == N - 2:
print(' ' * (N - 1) + '*')
else:
s = ' ' * (i + 1) + '*' + (N * 2 - 5 - i * 2) * ' ' + '*'
print(s)
输出结果:
二、打印圆
# 在控制台用“*”打印圆
R = 5
for i in range(R * 2 + 1):
half = (R ** 2 - (R - i) ** 2) ** 0.5
start = round(R - half)
midnum - round(2 * half)
print(' ' * start + '*' + ' ' *midnum + '*')
输出结果:
实操:绕圈圈面试题
一、结果呈现
绕圈圈(4):
- 01 12 11 10
- 02 13 16 09
- 03 14 15 08
- 04 05 06 07
绕圈圈(5):
- 01 16 15 14 13
- 02 17 24 23 12
- 03 18 25 22 11
- 04 19 20 21 10
- 05 06 07 08 09
二、规则
- 位于①号转弯线的行索引与列索引总和为 n-1(n为给定整数值)
- 位于②号转弯线的行索引与列索引相等
- 位于③号转弯线的行索引等于列索引减一
三、程序设计
- 用二维列表来保存程序数据
- 用一个变量来控制方向
SIZE = 6
# 得到一个SIZE*SIZE的二位列表
array = [[0] * SIZE]
for i in range(SIZE - 1):
array += [[0] * SIZE]
# orient控制方向
# 0代表向下,1代表向右,2代表向左,3代表向上
orient = 0
# j控制行,k控制列
j, k = 0, 0
# 将1~SIZE*SIZE的数填入二维数组
for i in range(1, SIZE * SIZE + 1):
array[j][k] = i
# ①号转弯线
if j + k == SIZE - 1:
# 行大于列,下半部分,方向转为向右
if j > k:
orient = 1
# 列大于行,下半部分,方向转为向左
else:
orient = 2
# ②号转弯线,方向转为向上
elif j == k and j >= SIZE / 2:
orient = 3
# ③号转弯线,方向转为向下
elif j + 1 == k and k <= SIZE / 2:
orient = 0
# 根据方向,控制行与列
if orient == 0:
j += 1
elif orient == 1:
k += 1
elif orient == 2:
k -= 1
elif orient == 3:
j -= 1
# 打印二位列表
# array是一个二维列表,array的元素也是列表
for ele in array:
for e in ele:
# '%02d'中,0:多余的位置用0代替,2:数字站2位
print('%02d' % e, end=' ')
print('')
输出结果: