Python(六)-拆包,交换变量名,lambda
目录
拆包
交换变量值
引用
lambda函数
lambda实例
字典的lambda
推导式
列表推导式
列表推导式+if条件判断
for循环嵌套列表推导式
字典推导式
集合推导式
拆包
看一下在Python程序中的拆包:把组合形成的元组形式的数据,拆分出单个元素内容。
变量名1,变量名2,... = 结果
例
(1)在一个函数中,使用return返回求解两个数的和、差;
(2)使用items()方式遍历处理字典中存储的学生信息各个键与值;
# 1 定义函数: 返回两个参数的 和 与 差
def get_sum_sub(a, b):
return a+b,a-b
# 2 调用
# 2.1 方式一 手动
result = get_sum_sub(10, 2)
print(result)
print(type(result)) # <class 'tuple'>
print(result[0])
print(result[1])
# 2.2 方式二 自动
res1,res2 = get_sum_sub(12, 2)
print(res1, '---->', res2)
# 3 遍历 字典
dict1 = {"name":"女儿国国王", "age":18, "skill":"XXX"}
# 3.1 方式一
for item in dict1.items():
key = item[0]
val = item[1]
print(key, '--->', val)
print("*" * 100)
# 3.2 方式二
for key,val in dict1.items():
print(key, '--->', val)
交换变量值
使用拆包方式可以用于交换变量的值。
例
(1)有变量a、b,请完成变量之间值的交换;
(2)使用引入第三方变量的形式完成数值的交换;
# (1)有变量a、b,请完成变量之间值的交换;
a = 10
b = 20
# (2)使用引入第三方变量的形式完成数值的交换;
# 方案二
(b, a) = (a, b)
print(f"a = {a}, b = {b}")
# 方案一
c = a
a = b
b = c
print(f"a = {a}, b = {b}")
# (3)使用拆包方式完成数值交换。
"""
有一个整数列表, 按正序排列 list1 = [100, 20, 40, 50, 30, 35]
循环1: i in [0, -2]
循环2: [i+1, -1]
if 列表[i]>列表[i+1]: 交换
"""
list1 = [100, 20, 40, 50, 30, 35]
# 逆序
for i in range(0, len(list1)-1):
for j in range(i+1, len(list1)):
if list1[i]>list1[j]:
list1[i], list1[j] = list1[j], list1[i] # 交换位置
print(list1)
# 正序
for i in range(0, len(list1)-1):
for j in range(i+1, len(list1)):
if list1[i]<list1[j]:
list1[i], list1[j] = list1[j], list1[i] # 交换位置
print(list1)
引用
注意:因为列表和字典是可变类型,所以会开辟新空间,所以地址不相同
# 目标1: 引用
# 1.1 基本类型引用
a = 5;
b = 5;
print(id(a))
print(id(b))
print("-" * 50)
# 字符串
c = "abc"
d = "abc"
print(id(c))
print(id(d))
print("-" * 50)
# 1.2 复杂类型引用
# 1.2.1 列表(可变)
list1 = [1,3,5]
list2 = [1,3,5]
print(id(list1)) # 1979679672512
print(id(list2)) # 1979678989952
print("-" * 50)
# 1.2.2 元组(不可变)
t1 = (1,3,5)
t2 = (1,3,5)
print(id(t1))
print(id(t2))
print("-" * 50)
# 1.2.3 字典(可变)
dict1 = {"a":1, "b":2, "c":3, "d":4}
dict2 = {"a":1, "b":2, "c":3, "d":4}
print(id(dict1)) # 1565550724096
print(id(dict2)) # 1565550724160
print("-" * 50)
# 3 对比内容
# 3.1 基本类型
a = 5;
b = 5;
print(a == b) # 内容: True
print(a is b) # 地址: True
str1 = "aaa"
str2 = "aaa"
print(a == b) # 内容: True
print(a is b) # 地址: True
print("-" * 50)
# 3.2 复杂类型
# 3.2.1 列表(可变)
list1 = [1,3,5]
list2 = [1,3,5]
print(list1 == list2) # 内容: True
print(list1 is list2) # 地址: False
print("-" * 50)
# 3.2.2 元组(不可变)
t1 = (1,3,5)
t2 = (1,3,5)
print(t1 == t2) # 内容: True
print(t1 is t2) # 地址: True
print("-" * 50)
# 1.2.3 字典(可变)
dict1 = {"a":1, "b":2, "c":3, "d":4}
dict2 = {"a":1, "b":2, "c":3, "d":4}
print(dict1 == dict2) # 内容: True
print(dict1 is dict2) # 地址: False
print("-" * 50)
lambda函数
定义匿名函数需要使用lambda关键字,可以创建小型匿名函数。
匿名函数表示没有名字的函数,这种函数得名于省略了用def关键字声明函数的标准步骤
# 定义匿名函数语法:
lambda 参数列表 : 表达式
# 调用匿名函数语法:
函数名 = lambda 参数列表 : 表达式
函数名([参数列表])
例
(1)求解两个数之和;
(2)使用def定义函数,完成求和操作;
(3)使用匿名函数简化函数求和操作。
# 目标1: 获取两个数的和
# 方式一
def get_sum(a, b):
return a + b
print(get_sum(2, 5))
# 方式二:lambda简化
get_sum_2 = lambda a, b : a + b
print(get_sum_2(6, 5))
# 目标2: 明确有两个参数, 由用户来确定计算的规则
def get_result(a, b, fn):
return fn(a, b)
result1 = get_result(10, 5, lambda a, b : a * b)
print(result1)
result2 = get_result(10, 5, lambda a, b : a / b)
print(result2)
result3 = get_result(10, 5, lambda a, b : a + b)
print(result3)
result4 = get_result(10, 5, lambda a, b : a - b)
print(result4)
lambda实例
# 1 无参数
# 1.1 不用lambda
def func1():
return 21
print(func1) # 地址
print(func1()) # 内容
# 1.2 用lambda
func1_2 = lambda : 66
print(func1_2) # 地址
print(func1_2()) # 内容
# 2 带参数
# 2.1 不用lambda
def func2(a, b):
return a * b
print(func2(10, 20))
# 2.2 用lambda
func2_2 = lambda a, b : a * b
print(func2_2(3, 60))
# 3 带默认参数的lambda表达式
# 3.1 不用lambda
def func3(a, b, c=100):
return a+b+c
print(func3(1, 2))
print(func3(1, 2, 3))
# 3.2 用lambda
func3_2 = lambda a, b, c=100: a+b+c
print(func3_2(3, 2))
print(func3_2(3, 2, 20))
# 4 不定长参数:可变参数*args
# # 4.1 不用lambda
def func4(*args):
return args
print(func4(10, 20, 30, 40))
print(type(func4(10, 20, 30, 40)))
# 4.2 用lambda
func4_2 = lambda *args : args
print(func4_2(66, 88, 99, 21))
print(type(func4_2(10, 20, 30, 40)))
# 5 不定长参数:可变参数**kwargs
# 5.1 不用lambda
def func5(**kwargs):
return kwargs
print(func5(name="悟空", skill="七十二变", sex="男"))
# 5.2 用lambda
func5_2 = lambda **kwargs : kwargs
print(func5_2(name="八戒", skill="三十六变", sex="男"))
# 6 带if判断(三目运算符)的lambda表达式
# 6.1 不用lambda
def get_max(a, b):
if a > b:
return a
else:
return b
print(get_max(2, 5))
print(get_max(20, 5))
print(get_max(20, 50))
# 6.2 用lambda
get_max_2 = lambda a, b : a if a > b else b
print(get_max_2(120, 50))
print(get_max_2(120, 500))
字典的lambda
student_list = [
{"name":"悟空", "skill" : "火眼金睛", "wulizhi":90},
{"name":"二郎神", "skill" : "放狗", "wulizhi":120},
{"name":"哪吒", "skill" : "三头六臂", "wulizhi":80}
]
student_list.sort(key=lambda x: x["name"]) # 根据名字排序
print(student_list)
student_list.sort(key=lambda x: x["wulizhi"]) # 根据武力值排序
print(student_list)
student_list.sort(key=lambda x: x["wulizhi"], reverse=True) # 根据武力值逆序
print(student_list)
推导式
共有三种推导:列表推导式,集合推导式,字典推导式
列表推导式
变量名 = [表达式 for 变量 in 列表]
变量名 = [表达式 for 变量 in 列表 if 条件]
变量名 = [表达式 for 变量 in 列表 for 变量 in 列表]
创建一个0-9的列表
# 目标: 获取 0-9的列表
# 1 while
# 初始化计数器
i = 0
list1 = []
# 编写循环条件
while i <= 9:
list1.append(i)
# 更新计数器
i += 1
print(list1)
# 2 for
list1 = []
# 编写for循环
for i in range(0, 10):
list1.append(i)
print(list1)
# 3 列表表达式
list3 = [i for i in range(0, 10)]
print(list3)
列表推导式+if条件判断
变量 = [表达式 for 临时变量 in 序列 if 条件判断]
等价于
for 临时变量 in 序列:
if 条件判断
生成0-9之间的偶数序列
list3 = [i for i in range(10) if i % 2 == 0]
print(list3)
for循环嵌套列表推导式
for 临时变量 in range(n):
for 临时变量 in range(n):等价于
变量 = [表达式 for 临时变量 in 序列 for 临时变量 in 序列]
创建列表 => [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
# 不用 推导式
tuple_list = []
for i in range(1,3):
for j in range(0,3):
tuple_list.append((i, j))
print(tuple_list)
# 用 推导式
tuple_list_2 = [(i, j) for i in range(1,3) for j in range(0,3)]
print(tuple_list_2)
字典推导式
变量 = {key:value for key,value in 序列}
例1:创建一个字典:字典key是1-5数字,value是这个数字的2次方。
dict1 = {i:i**2 for i in range(1,6)}
print(dict1)
例2:把两个列表合并为一个字典
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'male']
# 结果:person = {'name':'Tom', 'age':20, 'gender':'male'}
person = {list1[i]:list2[i] for i in range(len(list1))}
print(person)
例3:提取字典中目标数据
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'ACER': 99}
# 需求:提取上述电脑数量大于等于200的字典数据
counts = {key:value for key, value in counts.items() if value >= 200}
print(counts)
集合推导式
集合推导式跟列表推导式非常相似,唯一区别在于用 { } 代替 [ ]。
集合最大的特点就是去重
创建一个集合,数据为下方列表的2次方。
list1 = [1, 1, 2]
set1 = {i**2 for i in list1}
print(set1)