【李刚-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('')

输出结果:
输出结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值