Python流程控制


一、Python if else条件语句详解

在Python 中的 if else 语句可以细分为三种形式,分别是 if 语句、if else 语句和 if elif else 语句,为了更清楚的了解这三个语句,给出三种语句的流程图:
if 语句流程图
if else语句流程图
if elif else流程图
下面给出例子:

age = int( input("请输入你的年龄:") )
if age <=18 :
    print("你还未成年,不可以结婚")
    print("如果你已经得到了家长的同意,请忽略以上提示。")
#该语句不属于if的代码块
print("前往明政局!")
请输入你的年龄:19
前往明政局!
import sys
age = int( input("请输入你的年龄:") )
if age <=18 :
    print("警告:你还未成年,不能玩改游戏!")
    print("等长大一点再来吧")
    sys.exit()
else:
    print("你已经成年,可以玩该游戏。")
    print("时间宝贵,请不要在该游戏上浪费太多时间。")
print("该游戏服务器已满...")

sys 模块的 exit() 函数用于退出程序。

请输入你的年龄:19
你已经成年,可以玩该游戏。
时间宝贵,请不要在该游戏上浪费太多时间。
该游戏服务器已满...
height = float(input("输入身高(米):"))
weight = float(input("输入体重(千克):"))
bmi = weight / (height * height)  #计算BMI指数
if bmi<18.5:
    print("BMI指数为:"+str(bmi))
    print("体重过轻")
elif bmi>=18.5 and bmi<24.9:
    print("BMI指数为:"+str(bmi))
    print("正常范围,注意保持")
elif bmi>=24.9 and bmi<29.9:
    print("BMI指数为:"+str(bmi))
    print("体重过重")
else:
    print("BMI指数为:"+str(bmi))
    print("肥胖")
输入身高(米):1.8
输入体重(千克):70
BMI指数为:21.604938271604937
正常范围,注意保持

if else 如何判断表达式是否成立

上面说过,if 和 elif 后面的“表达式”的形式是很自由的,只要表达式有一个结果,不管这个结果是什么类型,Python 都能判断它是“真”还是“假”。

  • 布尔类型(bool)只有两个值,分别是 True 和 False,Python 会把 True 当做“真”,把 False 当做“假”。

  • 对于数字,Python 会把 0 和 0.0 当做“假”,把其它值当做“真”。

  • 对于其它类型,当对象为空或者为 None 时,Python 会把它们当做“假”,其它情况当做真。比如,下面的表达式都是不成立的:

“” #空字符串
[ ] #空列表
( ) #空元组
{ } #空字典
None #空值

二、Python if语句嵌套

前面已经说明了三个条件语句,在开发过程中,往往会有使用嵌套语句的情况:

if 表达式 1if 表示式 2:
        代码块 1
    else:
        代码块 2
if 表示式 1if 表达式 2:
        代码块 1
    else:
        代码块 2
elseif 表达式 3:
        代码块 3
    else:
        代码块 4

下面举个例子:

【实例】判断成绩等级
学生成绩如果低于60分为差,超过六十分为及格;70-89分为良好,90分-100分为优秀;判断一个学生的成绩等级。
通过梳理思路,低于60分为差,60-69分为及格,70-89分为良好,90-100为优秀。

proof = int(input("输入学生的成绩(满分100):"))
if proof < 60:
    print("学生成绩等级为差")
else:
    if 90<=proof<=100:
        print("学生等级为优秀")
    elif 70<=proof<=89:
        print("学生等级为良好")
    else:
        print("学生等级为及格")
输入学生的成绩(满分100):88
学生等级为良好

三、Python Pass

Pass 语句十分的特殊,在开发过程中,有时候我们会先搭建起程序的整体逻辑结构,但是暂时不去实现某些细节,而是在这些地方加一些注释,方便以后再添加代码:

age = int( input("请输入你的年龄:") )

if age < 12 :
    print("婴幼儿")
elif age >= 12 and age < 18:
    print("青少年")
elif age >= 18 and age < 30:
    print("成年人")
elif age >= 30 and age < 50:
    #TODO: 成年人
else:
    print("老年人")

当年龄大于等于 30 并且小于 50 时,我们没有使用 print() 语句,而是使用了一个注释,希望以后再处理成年人的情况。当 Python 执行到该 elif 分支时,会跳过注释,什么都不执行。

但是 Python 提供了一种更加专业的做法,就是空语句 pass。pass 是 Python 中的关键字,用来让解释器跳过此处,什么都不做。

age = int( input("请输入你的年龄:") )

if age < 12 :
    print("婴幼儿")
elif age >= 12 and age < 18:
    print("青少年")
elif age >= 18 and age < 30:
    print("成年人")
elif age >= 30 and age < 50:
    pass
else:
    print("老年人")

这样的好处就是在开发过程中可以方便既可以增加美观也可以更方便的为以后添加代码。

四、Python assert断言

Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行;反之,Python 解释器会报 AssertionError 错误。

assert 表达式

使用assert断言的原因是:与其让程序在晚些时候崩溃,不如在错误条件出现时,就直接让程序崩溃,这有利于我们对程序排错,提高程序的健壮性。

因此,assert 语句通常用于检查用户的输入是否符合规定,还经常用作程序初期测试和调试过程中的辅助工具。

scores = int(input("请输入学生的成绩"))
#断言数学考试分数是否位于正常范围内
assert 0<= scores <=150
#只有当 mathmark 位于 [0,100]范围内,程序才会继续执行
print("数学考试分数为:",scores)

当满足条件时不会报错:

请输入学生的成绩120
数学考试分数为: 120

不满足条件时,断言语句会结束程序:

请输入学生的成绩180
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-15-03d6e1ceb5c0> in <module>

五、Python While循环语句

while 循环和 if 条件分支语句类似。不同之处在于,只要条件为真,while语句就会一直重复执行那段代码块。

while 语句的语法格式如下:

while 条件表达式:
     循环体

while 语句执行的具体流程为:首先判断条件表达式的值,其值为真(True)时,则执行代码块中的语句,当执行完毕后,再回过头来重新判断条件表达式的值是否为真,若仍为真,则继续重新执行代码块…如此循环,直到条件表达式的值为假(False),才终止循环。
While循环流程图

# 循环的初始化条件
num = 1
# 当 num 小于5时,会一直执行循环体
while num <5 :
    print("num=", num)
    # 迭代语句
    num += 1
print("循环结束!")

运行结果为:

num= 1
num= 2
num= 3
num= 4
循环结束!

除此之外,while 循环还常用来遍历列表、元组和字符串,因为它们都支持通过下标索引获取指定位置的元素。例如,下面程序演示了如何使用 while 循环遍历一个字符串变量:

words="你今天在真好看"
i = 0;
while i<len(words):
    print(words[i],end="")
    i = i + 1

运行结果为:你今天在真好看

六、Python for循环

Python 中的循环语句有 2 种,分别是 while 循环和 for 循环,for循环常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素。

for 迭代变量 in 字符串|列表|元组|字典|集合:
    执行语句

格式中,迭代变量用于存放从序列类型变量中读取出来的元素,所以一般不会在循环中对迭代变量手动赋值;执行语句指的是具有相同缩进格式的多行代码(和 while 一样),由于和循环结构联用,因此代码块又称为循环体。

str = "www.taobao.com"
#for循环,遍历 str字符串
for i in str:
    print(i,end="")
www.taobao.com

由于for循环再开发过程中是十分常用的语句,下面介绍for循环的一些具体应用:
1、for 循环进行数值循环

print("计算1*2*3*4....*10的结果为:")
#保存累加结果的变量
result = 1
#逐个获取从 1 到 100 这些值,并做累加操作
for i in range(1,11):
    result *= i
print(result)

运行结果为:计算1*2*3*4....*10的结果为: 3628800
2、for循环遍历列表与元组

list1=[1,2,3,4,5,6,7]
for i in list1:
    print(i)

运行结果为:1 2 3 4 5 6 7

3、for循环遍历字典

在使用 for 循环遍历字典时,经常会用到和字典相关的 3 个方法,即 items()、keys() 以及 values(),当然,如果使用 for 循环直接遍历字典,则迭代变量会被先后赋值为每个键值对中的键。

web = {'淘宝网':"www.taobao.com",'百度网':"www.baidu.com",'京东网':"www.jingdong.com"}
for ele in web:
    print('ele =', ele)
ele = 淘宝网
ele = 百度网
ele = 京东网

tip:直接遍历字典,和遍历字典 keys() 方法的返回值是相同的。

我们还可以利用item()、values()方法遍历字典:

web = {'淘宝网':"www.taobao.com",'百度网':"www.baidu.com",'京东网':"www.jingdong.com"}
for ele in web.items():
    print('ele =', ele)
web = {'淘宝网':"www.taobao.com",'百度网':"www.baidu.com",'京东网':"www.jingdong.com"}
for ele in web.values():
    print('ele =', ele)

运行结果为:

ele = ('淘宝网', 'www.taobao.com')
ele = ('百度网', 'www.baidu.com')
ele = ('京东网', 'www.jingdong.com')
ele = www.taobao.com
ele = www.baidu.com
ele = www.jingdong.com

当然,for循环还有很多其他的用法,这里不再描述。

七、Python(for和while)循环嵌套及用法

Python 不仅支持 if 语句相互嵌套,while 和 for 循环结构也支持嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,甚至 while 中有 for 或者 for 中有 while 也都是允许的。

当 2 个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称为外层循环或外循环,位于内层的循环结构常简称为内层循环或内循环。

循环嵌套结构的代码,Python 解释器执行的流程为:

  • 当外层循环条件为 True 时,则执行外层循环结构中的循环体;
  • 外层循环体中包含了普通程序和内循环,当内层循环的循环条件为 True 时会执行此循环中的循环体,直到内层循环条件为 False,跳出内循环;
  • 如果此时外层循环的条件仍为 True,则返回第 2 步,继续执行外层循环体,直到外层循环的循环条件为 False;
  • 当内层循环的循环条件为 False,且外层循环的循环条件也为 False,则整个嵌套循环才算执行完毕。
i = 0
while i<3:
    for j in range(2):
        print("i=",i," j=",j)       
    i=i+1
i= 0  j= 0
i= 0  j= 1
i= 1  j= 0
i= 1  j= 1
i= 2  j= 0
i= 2  j= 1

八、Python break和continue的区别

在执行 while 循环或者 for 循环时,只要循环条件满足,程序将会一直执行循环体,不停地转圈。但在某些场景,我们可能希望在循环结束前就强制结束循环,Python 提供了 2 种强制离开当前循环体的办法:

  • 使用 continue 语句,可以跳过执行本次循环体中剩余的代码,转而执行下一次的循环。
  • 只用 break 语句,可以完全终止当前循环。

break 语句可以立即终止当前循环的执行,跳出当前所在的循环结构。无论是 while 循环还是 for 循环,只要执行 break 语句,就会直接结束当前正在执行的循环体。

add = "www.taobao.com,www.baidu.com"
# 一个简单的for循环
for i in add:
    if i == ',' :
        #终止循环
        break
    print(i,end="")
print("\n执行循环体外的代码")
www.taobao.com
执行循环体外的代码

break 语句一般会结合 if 语句进行搭配使用,表示在某种条件下跳出循环体。

另外,对于嵌套的循环结构来说,break 语句只会终止所在循环体的执行,而不会作用于所有的循环体。举个例子:

add = "www.taobao.com,www.baidu.com"
for i in range(3):
    for j in add:
        if j == ',':
            break   
        print(j,end="")
    print("\n跳出内循环")
www.taobao.com
跳出内循环
www.taobao.com
跳出内循环
www.taobao.com
跳出内循环

和 break 语句相比,continue 语句的作用则没有那么强大,它只会终止执行本次循环中剩下的代码,直接从下一次循环继续执行。

add = "www.taobao.com,www.baidu.com"
# 一个简单的for循环
for i in add:
    if i == ',' :
        # 忽略本次循环的剩下语句
        print('\n')
        continue
    print(i,end="")
www.taobao.com

www.baidu.com

可以看到,当遍历 add 字符串至逗号( , )时,会进入 if 判断语句执行 print() 语句和 continue 语句。其中,print() 语句起到换行的作用,而 continue 语句会使 Python 解释器忽略执行print(i,end="")代码,直接从下一次循环开始执行。

九、Python zip()函数

它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象。所谓“压缩”,其实就是将这些序列中对应位置的元素重新组合,生成一个个新的元组。

zip(iterable, …)
iterable,… 表示多个列表、元组、字典、集合、字符串,甚至还可以为 range() 区间

list1 = [11,12,13]
tuple1 = (21,22,23)
print([x for x in zip(list1,tuple1)])
dic1 = {31:2,32:4,33:5}
set1 = {41,42,43,44}
print([x for x in zip(dic1)])
my_pychar = "python"
my_shechar = "shell"
print([x for x in zip(my_pychar,my_shechar)])

运行结果为:

[(11, 21), (12, 22), (13, 23)]
[(31,), (32,), (33,)]
[('p', 's'), ('y', 'h'), ('t', 'e'), ('h', 'l'), ('o', 'l')]

通过上述的描述发现在使用 zip() 函数“压缩”多个序列时,它会分别取各序列中第 1 个元素、第 2 个元素、… 第 n 个元素,各自组成新的元组。需要注意的是,当多个序列中元素个数不一致时,会以最短的序列为准进行压缩。

另外,对于 zip() 函数返回的 zip 对象,既可以像上面程序那样,通过遍历提取其存储的元组,也可以向下面程序这样,通过调用 list() 函数将 zip() 对象强制转换成列表:

list1=[1,2,3]
tuple1=(4,5,6)
print(list(zip(list1,tuple1)))

运行结果为:[(1, 4), (2, 5), (3, 6)]

十、Python sort()函数与reversed()函数

  • reserved() 功能是对于给定的序列(包括列表、元组、字符串以及 range(n) 区间),该函数可以返回一个逆序序列的迭代器(用于遍历该逆序序列)。
  • sorted() 作为 Python 内置函数之一,其功能是对序列(列表、元组、字典、集合、还包括字符串)进行排序。

语法格式分别为:

reversed(seq)
seq 可以是列表,元素,字符串以及 range() 生成的区间列表。

#将列表进行逆序
print([x for x in reversed([1,2,3,4,5])])
#将元组进行逆序
print([x for x in reversed((1,2,3,4,5))])
#将字符串进行逆序
print([x for x in reversed("abcdefg")])
#将 range() 生成的区间列表进行逆序
print([x for x in reversed(range(10))])

[5, 4, 3, 2, 1] [5, 4, 3, 2, 1] ['g', 'f', 'e', 'd', 'c', 'b', 'a'] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

除了使用列表推导式的方式,还可以使用 list() 函数,将 reversed() 函数逆序返回的迭代器,直接转换成列表。

#将列表进行逆序
print(list(reversed([1,2,3,4,5])))

运行结果为:[5, 4, 3, 2, 1]

sorted()的语法格式为:

list = sorted(iterable, key=None, reverse=False)
iterable 表示指定的序列,key 参数可以自定义排序规则;reverse 参数指定以升序(False,默认)还是降序(True)进行排序。sorted() 函数会返回一个排好序的列表。
key 参数和 reverse 参数是可选参数,即可以使用,也可以忽略。

#对列表进行排序
a = [5,3,4,2,1]
print(sorted(a))
#对元组进行排序
a = (5,4,3,1,2)
print(sorted(a))
#字典默认按照key进行排序
a = {4:1,5:2,3:3,2:6,1:8}
print(sorted(a.items()))
#对集合进行排序
a = {1,5,3,2,4}
print(sorted(a))
#对字符串进行排序
a = "51423"
print(sorted(a))

运行结果为:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[(1, 8), (2, 6), (3, 3), (4, 1), (5, 2)]
[1, 2, 3, 4, 5]
['1', '2', '3', '4', '5']

除此之外,sorted()函数默认对序列中元素进行升序排序,通过手动将其 reverse 参数值改为 True,可实现降序排序。例如:

#对列表进行排序
a = [5,3,4,2,1]
print(sorted(a,reverse=True))

运行结果为:[5, 4, 3, 2, 1]

另外在调用 sorted() 函数时,还可传入一个 key 参数,它可以接受一个函数,该函数的功能是指定 sorted() 函数按照什么标准进行排序。例如:

chars=['http://taobao.com','http://baidu.net/com/baidu','http://c.biancheng.taobao/shell/','http://c.biancheng.net/java/','http://c.biancheng.net/golang/']
#默认排序
print(sorted(chars))
#自定义按照字符串长度排序
print(sorted(chars,key=lambda x:len(x)))

运行结果为:

['http://baidu.net/com/baidu', 'http://c.biancheng.net/golang/', 'http://c.biancheng.net/java/', 'http://c.biancheng.taobao/shell/', 'http://taobao.com']
['http://taobao.com', 'http://baidu.net/com/baidu', 'http://c.biancheng.net/java/', 'http://c.biancheng.net/golang/', 'http://c.biancheng.taobao/shell/']

总结

Where there is a will,there is a way!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值