Python基础(4)——流程控制

python中的程序控制结构主要有顺序结构、分支结构和循环结构。

1. 顺序结构

顺序结构就是程序从上到下一行行的执行,中间没有任何判断和跳转。

2. 分支结构

if语句,使用布尔表达式或者布尔值作为分支条件来进行分支控制。

if expression:
    statements...
elif expression1:
    statements...
...# 可以有多个elif语句
else:
    statements...

其中elifelse均可以不出现;

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中whilefor循环都有有一个可选的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 

注:上述功能还可以通过短路原则来进行实现

短路原则:

  1. 括号内逻辑先执行
  2. and优先级大于or
  3. and一假为假
  4. 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("")

在这里插入图片描述

欢迎关注微信公众号,一起学习交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值