问题
如下所示,两种方式的区别是什么?
a = [1,3,5,7]
print(a)
print(*a)
首先,来看各自的输出结果:
[1, 3, 5, 7]
1 3 5 7
其次,二者的输出是有着本质的区别,前者输出的是一个列表,而后者输出的是列表中的一个个元素。这种*a的方式也被称之为序列解包。
那么,序列解包有什么作用呢?
方法
下面通过两个整数的加法介绍序列解包的作用。
方法1
这是一种喜闻乐见的方式。
# 定义一个两个整数的加法
def add(a, b):
return a+b
add(1,2)
方法2
这是一种比较罕见的方式。
# 定义一个两个整数的加法
def add(a, b):
return a+b
# 假设2个整数都保存在列表中
c = [1, 2]
# 如果直接将列表传给add函数,会报类型不匹配错误,此时咋办呢?
# add(c)
# 可以借助序列解包来实现
d = add(*c)
print(d)
可以看出,通过列表统一保存参数信息,然后传递给函数进行调用。在某些场景下,变得十分有用。
应用
在PyTorch自定义模型中的应用:
# define an empty container for Linear operations
classifier = []
classifier.append(nn.Linear(in_features=512*7*7, out_features=512))
classifier.append(nn.BatchNorm1d(512))
classifier.append(nn.Linear(in_features=512, out_features=self.num_classes))
# add classifier into class property
self.classifier = nn.Sequential(*classifier)
此处,如果直接传递列表,则程序会报错。
结语
序列解包功能十分强大,应用极其广泛。如果对其不了解,初看一下,还真的会一脸懵逼。希望本文的案例学习对您有所帮助!