6.Python流程控制

Python if else条件语句

前面的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句,这称为顺序结构

但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示

在 Python 中,可以使用 if else 语句对条件进行判断,然后根据不同的结果执行不同的代码,这称为选择结构或者分支结构

Python 中的 if else 语句可以细分为三种形式,分别是 if 语句、if else 语句和 if elif else 语句

语法格式

执行流程

if 表达式:

    代码块

if 表达式:

    代码块 1

else:

    代码块 2

if 表达式 1:

    代码块 1

elif 表达式 2:

    代码块 2

elif 表达式 3:

    代码块 3

...//其它elif语句

else:

    代码块 n

以上三种形式中,第二种和第三种形式是相通的,如果第三种形式中的 elif 块不出现,就变成了第二种形式。另外,elif 和 else 都不能单独使用,必须和 if 一起出现,并且要正确配对

对语法格式的说明:

  • “表达式”可以是一个单一的值或者变量,也可以是由运算符组成的复杂语句,形式不限,只要它能得到一个值就行。不管“表达式”的结果是什么类型,if else 都能判断它是否成立(真或者假)
  • “代码块”由具有相同缩进量的若干条语句组成
  • if、elif、else 语句的最后都有冒号:,不要忘记

一旦某个表达式成立,Python 就会执行它后面对应的代码块;如果所有表达式都不成立,那就执行 else 后面的代码块;如果没有 else 部分,那就什么也不执行

执行过程最简单的就是第一种形式——只有一个 if 部分。如果表达式成立(真),就执行后面的代码块;如果表达式不成立(假),就什么也不执行

对于第二种形式,如果表达式成立,就执行 if 后面紧跟的代码块1;如果表达式不成立,就执行 else 后面紧跟的代码块2

对于第三种形式,Python 会从上到下逐个判断表达式是否成立,一旦遇到某个成立的表达式,就执行后面紧跟的语句块;此时,剩下的代码就不再执行了,不管后面的表达式是否成立。如果所有的表达式都不成立,就执行 else 后面的代码块

总起来说,不管有多少个分支,都只能执行一个分支,或者一个也不执行,不能同时执行多个分支

age = int( input("请输入你的年龄:") )
if age < 18 :
    print("你还未成年,建议在家人陪同下使用该软件!")
    print("如果你已经得到了家长的同意,请忽略以上提示。")
#该语句不属于if的代码块
print("软件正在使用中...")

 运行结果1:

请输入你的年龄:16↙
你还未成年,建议在家人陪同下使用该软件!
如果你已经得到了家长的同意,请忽略以上提示。
软件正在使用中...

运行结果2:

请输入你的年龄:24↙
软件正在使用中...
import sys
age = int( input("请输入你的年龄:") )
if age < 18 :
    print("警告:你还未成年,不能使用该软件!")
    print("未成年人应该好好学习,读个好大学,报效祖国。")
    sys.exit()
else:
    print("你已经成年,可以使用该软件。")
    print("时间宝贵,请不要在该软件上浪费太多时间。")
print("软件正在使用中...")

运行结果1:

请输入你的年龄:16↙
警告:你还未成年,不能使用该软件!
未成年人应该好好学习,读个好大学,报效祖国。

运行结果2:

请输入你的年龄:20↙
你已经成年,可以使用该软件。
时间宝贵,请不要在该软件上浪费太多时间。
软件正在使用中...

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

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.7↙
输入体重(千克):70↙
BMI指数为:24.221453287197235
正常范围,注意保持

需要强调的是,Python 是一门非常独特的编程语言,它通过缩进来识别代码块,具有相同缩进量的若干行代码属于同一个代码块,所以不能胡乱缩进,这样很容易导致语法错误

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

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

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

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

对于其它类型,当对象为空或者为 None 时,Python 会把它们当做“假”,其它情况当做真

""  #空字符串
[ ]  #空列表
( )  #空元组
{ }  #空字典
None  #空值
b = False
if b:
    print('b是True')
else:
    print('b是False')
n = 0
if n:
    print('n不是零值')
else:
    print('n是零值')
s = ""
if s:
    print('s不是空字符串')
else:
    print('s是空字符串')
l = []
if l:
    print('l不是空列表')
else:
    print('l是空列表')
d = {}
if d:
    print('d不是空字典')
else:
    print('d是空字典')
def func():
    print("函数被调用")
if func():
    print('func()返回值不是空')
else:
    print('func()返回值为空')

运行结果:

b是False
n是零值
s是空字符串
l是空列表
d是空字典
函数被调用
func()返回值为空

说明:对于没有 return 语句的函数,返回值为空,也即 None

Python if else对缩进的要求

Python 是以缩进来标记代码块的,代码块一定要有缩进,没有缩进的不是代码块。另外,同一个代码块的缩进量要相同,缩进量不同的不属于同一个代码块

不要忘记缩进

if、elif 和 else 后面的代码块一定要缩进,而且缩进量要大于 if、elif 和 else 本身

age = int( input("请输入你的年龄:") )
if age < 18 :
print("警告:你还未成年,不能使用该软件!")
else:
print("你已经成年,可以使用该软件。")

本例中的 print() 函数和 if、else 语句是对齐的,在同一条竖线上,都没有缩进,所以 print() 就不是 if、else 的代码块了,这会导致 Python 解释器找不到 if、else 的代码块,从而报出如下错误

SyntaxError: expected an indented block

翻译过来

语法错误:需要一个缩进的代码块

总之,if、else 后面的代码一定要缩进,否则就不能构成 if、else 的执行体

缩进多少合适

Python 要求代码块必须缩进,但是却没有要求缩进量,可以缩进 n 个空格,也可以缩进 n 个 Tab 键的位置

建议缩进 1 个 Tab 键的位置,或者缩进 4 个空格;它们两者其实是等价的,很多编辑器都可以将 Tab 键设置为 4 个空格

所有语句都要缩进

一个代码块的所有语句都要缩进,而且缩进量必须相同。如果某个语句忘记缩进了,Python 解释器并不一定会报错,但是程序的运行逻辑往往会有问题

age = int( input("请输入你的年龄:") )
if age < 18 :
    print("你还未成年,建议在家人陪同下使用该软件!")
print("未成年人如果得到了家长的同意,请忽略以上提示。")  #忘记缩进

运行结果:

请输入你的年龄:24↙
未成年人如果得到了家长的同意,请忽略以上提示。

这段代码并没有语法错误,但是它的运行逻辑是不对的,用户的年龄分明大于 18,但是却出现了“未成年人”的提示,画面非常尴尬,这是因为第二个 print() 语句没有缩进,if 没有把它和第一个 print() 语句当做同一个代码块,所以它不是 if 执行体的一部分。解决这个错误也很容易,让第二个 print() 缩进 4 个空格即可

同一代码块缩进量要相同

Python 虽然不限制代码块的缩进量,可以随意缩进 n 个空格,但是,同一个代码块内的所有语句都必须拥有相同的缩进量,不能一会缩进 2 个空格,一会缩进 4 个空格

age = int( input("请输入你的年龄:") )
if age < 18 :
    print("你还未成年,建议在家人陪同下使用该软件!")
      print("未成年人如果得到了家长的同意,请忽略以上提示。")  #缩进量不对

运行这段代码,Python 解释器会报出语法错误

SyntaxError: unexpected indent

翻译过来

语法错误:意外的缩进

这段代码中,第一个 print() 语句缩进了 4 个空格,第二个 print() 语句缩进了 6 个空格,缩进量不同导致它们不是同一个代码块。Python 会认为第一个 print() 语句是 if 的执行体,而第二个 print() 是一个意外的存在,不知道该把它当做谁的代码块,所以解析失败,报错

总之,位于同一个代码块中的所有语句必须拥有相同的缩进量,多一个空格或者少一个空格都不行

不要随便缩进

需要注意的是,不需要使用代码块的地方千万不要缩进,一旦缩进就会产生一个代码块

info = "Python教程的网址是:http://c.biancheng.net/python/"
    print(info)

这两条简单的语句没有包含分支、循环、函数、类等结构,不应该使用缩进

Python if语句嵌套

if、if else 和 if elif else,这 3 种条件语句之间可以相互嵌套

在最简单的 if 语句中嵌套 if else 语句

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

在 if else 语句中嵌套 if else 语句

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

Python 中,if、if else 和 if elif else 之间可以相互嵌套。因此,在开发程序时,需要根据场景需要,选择合适的嵌套方案。需要注意的是,在相互嵌套时,一定要严格遵守不同级别代码块的缩进规范

【实例】判断是否为酒后驾车

如果规定,车辆驾驶员的血液酒精含量小于 20mg/100ml 不构成酒驾;酒精含量大于或等于 20mg/100ml 为酒驾;酒精含量大于或等于 80mg/100ml 为醉驾。先编写 Python 程序判断是否为酒后驾车

通过梳理思路,是否构成酒驾的界限值为 20mg/100ml;而在已确定为酒驾的范围(大于20mg/100ml)中,是否构成醉驾的界限值为 80mg/100ml

proof = int(input("输入驾驶员每 100ml 血液酒精的含量:"))
if proof < 20:
    print("驾驶员不构成酒驾")
else:
    if proof < 80:
        print("驾驶员已构成酒驾")
    else:
        print("驾驶员已构成醉驾")

 运行结果:

输入驾驶员每 100ml 血液酒精的含量:10
驾驶员不构成酒驾

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("老年人")

运行结果:

请输入你的年龄:40↙

Python assert断言函数及用法

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

assert 表达式

assert 语句的执行流程可以用 if 判断语句表示

if 表达式==True:
    程序继续执行
else:
    程序报 AssertionError 错误

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

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

运行结果:

90
数学考试分数为: 90
159
Traceback (most recent call last):
  File "C:\Users\mengma\Desktop\file.py", line 3, in <module>
    assert 0 <= mathmark <= 100
AssertionError

当 assert 语句后的表达式值为真时,程序继续执行;反之,程序停止执行,并报 AssertionError 错误

Python while循环语句

Python 中,while 循环和 if 条件分支语句类似,即在条件(表达式)为真的情况下,会执行相应的代码块。不同之处在于,只要条件为真,while 就会一直重复执行那段代码块

while 条件表达式:
    代码块

这里的代码块,指的是缩进格式相同的多行代码,不过在循环结构中,它又称为循环体

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

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

运行程序会发现,程序只输出了 1~99,却没有输出 100。这是因为,当循环至 num 的值为 100 时,此时条件表达式为假(100<100),当然就不会再去执行代码块中的语句,因此不会输出 100

注意,在使用 while 循环时,一定要保证循环条件有变成假的时候,否则这个循环将成为一个死循环。所谓死循环,指的是无法结束循环的循环结构

只要位于 while 循环体中的代码,其必须使用相同的缩进格式(通常缩进 4 个空格),否则 Python 解释器会报 SyntaxError 错误(语法错误)

while 循环还常用来遍历列表、元组和字符串,因为它们都支持通过下标索引获取指定位置的元素

my_char="http://c.biancheng.net/python/"
i = 0;
while i<len(my_char):
    print(my_char[i],end="")
    i = i + 1

运行结果:

http://c.biancheng.net/python/

Python for循环及用法

Python 中的循环语句有 2 种,分别是 while 循环和 for 循环

for 循环,常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素

for 迭代变量 in 字符串|列表|元组|字典|集合:
    代码块

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

add = "http://c.biancheng.net/python/"
#for循环,遍历 add 字符串
for ch in add:
    print(ch,end="")

 运行结果:

http://c.biancheng.net/python/

可以看到,使用 for 循环遍历  add 字符串的过程中,迭代变量 ch 会先后被赋值为 add 字符串中的每个字符,并代入循环体中使用

for 循环进行数值循环

在使用 for 循环时,最基本的应用就是进行数值循环

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

运行结果:

计算 1+2+...+100 的结果为:
5050

for循环遍历列表和元组

当用 for 循环遍历 list 列表或者 tuple 元组时,其迭代变量会先后被赋值为列表或元组中的每个元素并执行一次循环体

my_list = [1,2,3,4,5]
for ele in my_list:
    print('ele =', ele)

运行结果:

ele = 1
ele = 2
ele = 3
ele = 4
ele = 5

for 循环遍历字典

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

my_dic = {'python教程':"http://c.biancheng.net/python/",\
          'shell教程':"http://c.biancheng.net/shell/",\
          'java教程':"http://c.biancheng.net/java/"}
for ele in my_dic:
    print('ele =', ele)

运行结果:

ele = python教程
ele = shell教程
ele = java教程

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

my_dic = {'python教程':"http://c.biancheng.net/python/",\
          'shell教程':"http://c.biancheng.net/shell/",\
          'java教程':"http://c.biancheng.net/java/"}
for ele in my_dic.items():
    print('ele =', ele)

 运行结果:

ele = ('python教程', 'http://c.biancheng.net/python/')
ele = ('shell教程', 'http://c.biancheng.net/shell/')
ele = ('java教程', 'http://c.biancheng.net/java/')

Python循环结构中else用法

Python 中,无论是 while 循环还是 for 循环,其后都可以紧跟着一个 else 代码块,它的作用是当循环条件为 False 跳出循环时,程序会最先执行 else 代码块中的代码

add = "http://c.biancheng.net/python/"
i = 0
while i < len(add):
    print(add[i],end="")
    i = i + 1
else:
    print("\n执行 else 代码块")

运行结果:

http://c.biancheng.net/python/
执行 else 代码块
add = "http://c.biancheng.net/python/"
for i in  add:
    print(i,end="")
else:
    print("\n执行 else 代码块")

运行结果:

http://c.biancheng.net/python/
执行 else 代码块

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

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

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

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

  1. 当外层循环条件为 True 时,则执行外层循环结构中的循环体
  2. 外层循环体中包含了普通程序和内循环,当内层循环的循环条件为 True 时会执行此循环中的循环体,直到内层循环条件为 False,跳出内循环
  3. 如果此时外层循环的条件仍为 True,则返回第 2 步,继续执行外层循环体,直到外层循环的循环条件为 False
  4. 当内层循环的循环条件为 False,且外层循环的循环条件也为 False,则整个嵌套循环才算执行完毕

i = 0
while i<10:
    for j in range(10):
        print("i=",i," j=",j)       
    i=i+1

此程序中运用了嵌套循环结构,其中外循环使用的是 while 语句,而内循环使用的是 for 语句

  • 一开始 i=0,循环条件 i<10 成立,进入 while 外循环执行其外层循环体
  • 从 j=0 开始,由于 j <10 成立,因此进入 for 内循环执行内层循环体,直到 j=10 不满足循环条件,跳出 for 循环体,继续执行 while 外循环的循环体
  • 执行 i=i+1 语句,如果 i<10 依旧成立,则从第 2 步继续执行。直到 i<10 不成立,则此循环嵌套结构才执行完毕

此程序中外层循环将循环 10 次(从 i=0 到 i=9),而每次执行外层循环时,内层循环都从 j=0 循环执行到 j=9。因此,该嵌套循环结构将执行 10*10 = 100 次

嵌套循环执行的总次数 = 外循环执行次数 * 内循环执行次数

if 语句和循环(while、for)结构之间,也可以相互嵌套

i = 0
if i<10:
    for j in range(5):
        print("i=",i," j=",j)   

运行结果:

i= 0  j= 0
i= 0  j= 1
i= 0  j= 2
i= 0  j= 3
i= 0  j= 4

其实 if、while、for 之间完全支持多层( ≥3 )嵌套

if ...:
    while ...:
        for ...:
            if ...:
                ...

也就是说,只要场景需要,判断结构和循环结构之间完全可以相互嵌套,甚至可以多层嵌套

Python break用法

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

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

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

break 语句的语法非常简单,只需要在相应 while 或 for 语句中直接加入即可

add = "http://c.biancheng.net/python/,http://c.biancheng.net/shell/"
# 一个简单的for循环
for i in add:
    if i == ',' :
        #终止循环
        break
    print(i,end="")
print("\n执行循环体外的代码")

运行结果:

http://c.biancheng.net/python/
执行循环体外的代码

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

for 循环后也可以配备一个 else 语句。这种情况下,如果使用 break 语句跳出循环体,不会执行 else 中包含的代码

add = "http://c.biancheng.net/python/,http://c.biancheng.net/shell/"
for i in add:
    if i == ',' :
        #终止循环
        break
    print(i,end="")
else:
    print("执行 else 语句中的代码")
print("\n执行循环体外的代码")

运行结果:

http://c.biancheng.net/python/
执行循环体外的代码

对于嵌套的循环结构来说,break 语句只会终止所在循环体的执行,而不会作用于所有的循环体

add = "http://c.biancheng.net/python/,http://c.biancheng.net/shell/"
for i in range(3):
    for j in add:
        if j == ',':
            break   
        print(j,end="")
    print("\n跳出内循环")

运行结果:

http://c.biancheng.net/python/
跳出内循环
http://c.biancheng.net/python/
跳出内循环
http://c.biancheng.net/python/
跳出内循环

每当执行内层循环时,只要循环至 add 字符串中的逗号( , )就会执行 break 语句,它会立即停止执行当前所在的内存循环体,转而继续执行外层循环

在嵌套循环结构中,如何同时跳出内层循环和外层循环呢?最简单的方法就是借用一个 bool 类型的变量

add = "http://c.biancheng.net/python/,http://c.biancheng.net/shell/"
#提前定义一个 bool 变量,并为其赋初值
flag = False
for i in range(3):
    for j in add:
        if j == ',':
            #在 break 前,修改 flag 的值
            flag = True
            break   
        print(j,end="")
    print("\n跳出内循环")
    #在外层循环体中再次使用 break
    if flag == True:
        print("跳出外层循环")
        break

运行结果:

http://c.biancheng.net/python/
跳出内循环
跳出外层循环

通过借助一个 bool 类型的变量 flag,在跳出内循环时更改 flag 的值,同时在外层循环体中,判断 flag 的值是否发生改动,如有改动,则再次执行 break 跳出外层循环;反之,则继续执行外层循环

Python continue的用法

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

continue 语句的用法和 break 语句一样,只要 while 或 for 语句中的相应位置加入即可

add = "http://c.biancheng.net/python/,http://c.biancheng.net/shell/"
# 一个简单的for循环
for i in add:
    if i == ',' :
        # 忽略本次循环的剩下语句
        print('\n')
        continue
    print(i,end="")

运行结果:

http://c.biancheng.net/python/
http://c.biancheng.net/shell/

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

Python zip函数及用法

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

和 Python 3.x 版本不同,Python 2.x 版本中的 zip() 函数会直接返回列表,而不是返回 zip 对象。但是,返回的列表或者 zip 对象,其包含的元素(都是元组)是相同的

zip(iterable, ...)

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

my_list = [11,12,13]
my_tuple = (21,22,23)
print([x for x in zip(my_list,my_tuple)])
my_dic = {31:2,32:4,33:5}
my_set = {41,42,43,44}
print([x for x in zip(my_dic)])
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() 对象强制转换成列表

my_list = [11,12,13]
my_tuple = (21,22,23)
print(list(zip(my_list,my_tuple)))

运行结果:

[(11, 21), (12, 22), (13, 23)]

Python reversed函数及用法

reserved() 是 Pyton 内置函数之一,其功能是对于给定的序列(包括列表、元组、字符串以及 range(n) 区间),该函数可以返回一个逆序序列的迭代器(用于遍历该逆序序列)

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]

使用 reversed() 函数进行逆序操作,并不会修改原来序列中元素的顺序

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

运行结果:

[5, 4, 3, 2, 1]
a= [1, 2, 3, 4, 5]

Python sorted函数及用法

sorted() 作为 Python 内置函数之一,其功能是对序列(列表、元组、字典、集合、还包括字符串)进行排序

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() 函数对序列进行排序, 并不会在原序列的基础进行修改,而是会重新生成一个排好序的列表

#对列表进行排序
a = [5,3,4,2,1]
print(sorted(a))
#再次输出原来的列表 a
print(a)

运行结果:

[1, 2, 3, 4, 5]
[5, 3, 4, 2, 1]

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

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

运行结果:

[5, 4, 3, 2, 1]

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

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

运行结果:

['http://c.biancheng.net',
 'http://c.biancheng.net/golang/',
 'http://c.biancheng.net/java/',
 'http://c.biancheng.net/python/',
 'http://c.biancheng.net/shell/']
['http://c.biancheng.net',
 'http://c.biancheng.net/java/',
 'http://c.biancheng.net/shell/',
 'http://c.biancheng.net/python/',
 'http://c.biancheng.net/golang/']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值