Python中压缩和参数拆分,args和kwargs

浏览: 2180

压缩和拆分

如果想把两个或多个列表压缩在一起,可以使用Zip把多个列表转换为一个对应元素的元组的单个列表中。

list1 = [1, 2, 3]
list2 = [‘a’, ‘b’, ‘c’]
zip(list1, list2) #[(1, ‘a’), (2, ‘b’), (3, ‘c’)]

如果列表的长度不同,zip会在第一个列表结束时停止。

可以使用一种特殊的方法“解压”一个列表:

paris = [(1, ‘a’), (2, ‘b’), (3, ‘c’)]
letters, numbers = zip(*paris)


其中的*号执行参数拆分(argument unpacking)。参数拆分使用paris的元素作为独立的参数传给zip,这就和调用以下函数的结果是一样的:

zip((1, ‘a’), (2, ‘b’), (3, ‘c’))
返回[(‘1’, ‘2’, ‘3’), (‘a’, ‘b’, ‘c’)]

我们可以在任何函数上使用参数拆分:

def add(a, b):return a + b
add(1, 2) #返回3
add([1, 2]) #TypeError
add(*[pa]) #返回3

参数拆分用的比较少,但是用的时候是个小技巧。

args和kwargs

如果我们想创建一个高阶函数,把某个函数f作为输入,并返回一个对任意输入都返回f值两倍的新函数:

def doubler(f):
def g(x):
return 2 * f(x)
return g

#这个函数在有些情况下可以实现
def f1(x):
return x + 1

g = doubler(f1)
print g(3) #8 (==(3+1) * 2)
print g(-1) #0 (==(-1+1) * 2)

#对于有多个参数的函数来说,就不适用
def f2(x, y):
return x + y

g = doubler(f1)
print g(1, 2) #TypeError:g()只能有一个参数,(但是给了两个)

此时我们需要的是一种指定一个可以取任意参数的函数的方法,利用参数拆分和一点点魔法就可以做到:

def magic(*args, **kwargs):
print "unnamed args:", args
print "keyword args:", kwargs

magic(1, 2, key="word", key2="word2")
#输出:
#未命名args:(1, 2)
#关键词args:{'key2':'word2', 'key':'word'}

也就是说,当我们定义了这样一个函数时,args是一个它的未命名参数的元组,而kw    args是一个它的已命名参数的dict,反过来也可以,你可以使用一个list(或者tuple)和dict来给函数提供参数:

def other_way_magic(x, y, z):
return x + y + z

x_y_list = [1, 2]
z_dict = {"z": 3}
print other_way_magic(*x_y_list, **z_dict) #6

参照上面的例子,我们可以充分利用这种技巧,我们将会只用它来创建可以将任意参数作为输入的高阶函数:

 def doubler_correct(f):
def g(*args, **kwargs):
return 2 * f(*args, **kwargs)
return g

g = doubler_correct(f2)
print g(1, 2) #6

希望通过上面的内容能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。

如果想快速联系我,欢迎关注微信公众号:AiryData。

推荐 4
本文由 Airy 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

清晰易懂
谢谢支持,欢迎关注微信公众号:AiryData。

要回复文章请先登录注册