Python中的流程控制
- 1. 顺序结构
- 2. 分支结构
- 3. 循环结构
- 4. if三目运算
- 5. for表达式
- 6. 断言
- 7. 流程控制练习
- 7.1. 绕圈圈
- 7.2. N阶幻方
python中的程序控制结构主要有顺序结构、分支结构和循环结构。
1. 顺序结构
顺序结构就是程序从上到下一行行的执行,中间没有任何判断和跳转。
2. 分支结构
if语句,使用布尔表达式或者布尔值作为分支条件来进行分支控制。
if expression:
statements...
elif expression1:
statements...
...# 可以有多个elif语句
else:
statements...
其中
elif
和else
均可以不出现;
False、None、0、""、()、[]、{}
这些值均会被当做False
来进行处理;要注意缩进、同一个代码块缩进相同;
分支语句后的冒号不要忘记;
注意逻辑不能错。
3. 循环结构
python中的循环结构有两种,分别为
while
循环和for
循环。在循环的过程中可以使用
break
(表示跳出循环)、return
(表示结束该函数或方法)和continue
(表示忽略当次循环的剩下的语句)关键字来控制循环
# while循环格式
[init_statement]
while test_expression:
body_statements
[iteration_statements]
# for循环格式,可用于循环遍历任何可迭代对象
for 变量 in 字符串|范围|集合等:
statements
在python中
while
和for
循环都有有一个可选的else
分支,该分支在循环迭代正常完成之后执行。也就是说在循环中没有break
语句、没有return
语句,或者没有异常出现,else
分支将会被执行。
# example
def test():
count = 1
while count < 3:
count +=1
else:
print("执行")
#调用该函数,后面将会输出“执行”
def test():
count = 1
while count < 3:
if count == 2:
break #换成return效果相同
count +=1
else:
print("执行")
#调用该函数,"执行"不会被输出
# for...else...同理
while和for循环示例
# for循环生成列表
l = [i for i in range(10)] # 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l = [[] for _ in range(10)] # 输出:[[], [], [], [], [], [], [], [], [], []]
# for循环遍历列表
for i in l:
print(i)
# for循环按索引遍历列表
for i in range(len(l)):
print(l[i])
# while循环遍历列表
i = 0
while i < len(l):
print(l[i])
4. if三目运算
# 语法格式
<true statement> if <condition expression> else <false statement>
# example
n = 2
is_even = True if n % 2 == 0 else False
注:上述功能还可以通过短路原则来进行实现
短路原则:
- 括号内逻辑先执行
and
优先级大于or
and
一假为假or
一真为真
and
:如果左边为假,返回左边值。如果左边不为假,返回右边值。or
:如果左边为真,返回左边值。如果左边不为真,返回右边值。
# 语法格式
<condition expression> and <true statement> or <false statement>
# example
n = 2
is_even = n % 2 == 0 and True or False
5. for表达式
用于利用区间,元组,列表等可迭代对象来创建新的列表,或创建生成器。
[表达式 for 循环计数器 in 可迭代对象] # 创建列表
(表达式 for 循环计数器 in 可迭代对象) # 创建生成器
#如果表达式中不带有循环计数器,那么可以用"_"来表示循环计数器
# example
l = [i for i in range(10)]
print(l)
print(type(l))
l = (i for i in range(10))
print(l)
print(type(l))
#==========output=========
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<class 'list'>
<generator object <genexpr> at 0x0000019A6A614840>
<class 'generator'>
还可以在表达式中加入if语句来筛选出符合条件的元素
l = [i for i in range(10) if i % 2 == 0]
print(l)
#=======output========
[0, 2, 4, 6, 8]
6. 断言
主要用于对一个布尔表达式进行判断,如果该表达式为
True
,该程序继续向下执行;否则程序会引发AssertionError
错误。
# 语法格式
assert 布尔表达式, "Error提示"
# example
a = 2
b = 10
assert a > b, 'error: b is bigger'
print(a, b)
#=======output=======
Traceback (most recent call last):
File "test.py", line 3, in <module>
assert a>b, 'error: b is bigger'
AssertionError: error: b is bigger
7. 流程控制练习
7.1. 绕圈圈
输入一个正整数,例如输入4
输出一个矩阵,格式如下
01 12 11 10
02 13 16 09
03 14 15 08
04 05 06 07
该题目的关键点就是绕弯,找到拐弯点。找行索引和列索引的关系。
n = input("请输入n的值:")
assert n.isnumeric(), "你输入的不是数字!"
n = int(n)
array = [[0] * n for _ in range(n)]
orient = 0
# 其中0表示向下,1代表向右,2代表向左,3代表向上
j = 0 # 行索引
k = 0 # 列索引
for i in range(1, n * n + 1):
array[j][k] = i
if j + k == n - 1:
if j > k:
orient = 1
else:
orient = 2
elif (k == j) and (k >= n / 2):
orient = 3
elif (j == k - 1) and (k <= n / 2):
orient = 0
if orient == 0:
j += 1
elif orient == 1:
k += 1
elif orient == 2:
k -= 1
elif orient == 3:
j -= 1
for i in range(n):
for j in range(n):
print('%02d ' % array[i][j], end="")
print("")
7.2. N阶幻方
给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。
08 01 06
03 05 08
04 09 02
该题目看似比较难,但是只要找到规律就简单了。
- 数字1放在第一行中间
- 后面数字依次放到上一个数的右上角
- 如果右边超出就放到左边
- 如果上面超出就放到下面
- 如果右上角有数就放到这个数的下面
n = 5
array = [[0] * n for _ in range(n)]
# i表示行索引
# j表示列索引
i = 0
j = n // 2
k = 2
array[i][j] = 1
while k <= n ** 2:
i = i - 1 if i != 0 else n - 1
j = j + 1 if j != n - 1 else 0
if array[i][j] != 0:
i = i + 2 if i != n - 1 else 1
j = j - 1 if j != 0 else n - 1
array[i][j] = k
k += 1
for i in range(n):
for j in range(n):
print('%02d ' % array[i][j], end="")
print("")