压缩和拆分
如果想把两个或多个列表压缩在一起,可以使用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。