Posts 可迭代对象的元素的拆包
Post
Cancel

可迭代对象的元素的拆包

今天用到了元组一个很实用又很简单的运算,就是元素拆包。其实可以把拆包推广到所有的可迭代对象: list,set, dictiona等,只要这个可迭代对象的值的数量和接收它门的变量数量一致,拆包就能实现自动匹配。

花了点时间,实验了比较多的可能性,把拆包总结了一下。

赋值拆包

这个用在变量的定义赋值语句中,比如下面的三种迭代类型:元组、列表和集合。元素a,b,c按照顺序自动获取每个整型值。

1
2
3
a, b, c = (1, 2, 3)
a, b, c = [1, 2, 3]
a, b, c = {1, 2, 3}

对于字典类型,需要通过values()获取值,如果想要获取key,就切换为keys()

1
a, b, c = dict(one=1, two=2, three=3).values()

函数参数拆包

如果一个函数需要接收多个参数,可以使用*运算符把可迭代对象作为唯一的参数传递给函数。

比如myfun1,需要3个参数。

1
2
def myfun1(x, y, z):
    print("x={0},y={1},z={2}".format(x, y, z))

使用函数参数拆包的方式,可以调用为:

1
2
3
4
5
6
7
8
9
10
11
tuple_a = (1, 2, 3)
list_b = [1, 2, 3]
set_c = {1, 2, 3}
dict_d = dict(one=1, two=2, three=3)

myfun1(*tuple_a)
myfun1(*list_b)
myfun1(*set_c)
myfun1(*dict_d.items())
myfun1(*dict_d.keys())
myfun1(*dict_d.values())

函数返回值拆包

Python中一个函数可以定义成返回多个值。比如:

1
2
3
4
5
6
7
8
9
10
11
12
def myfun2(x, y):
    return x+y, x-y, x*y
	
tuple_a = (1, 2)
list_b = [1, 2]
set_c = {1, 2}
dict_d = dict(one=1, two=2)

a, b, c = myfun2(*tuple_a)
a, b, c = myfun2(*list_b)
a, b, c = myfun2(*set_c)
a, b, c = myfun2(*dict_d.values())

函数返回值的拆包,其实就是赋值拆包的体现。

另外,如果仅仅需要获取返回值列表里的某些值,可以使用占位符过滤掉其他不感兴趣的返回值。比如我只想获取第二个返回值,可以占位符为:

1
_, b, _ = myfun2(*set_c)
This post is licensed under CC BY 4.0 by the author.

容器对象的推导方式和元组生成器表达式

Java证书安装及多个Java应用间的根证书交叉信任