Discuss / Python / 关于本章*args 以及**kw的使用

关于本章*args 以及**kw的使用

Topic source

关于本章args以及 *kw的使用

关键在于熟悉: 1.args,**kw作为定义函数输入变量时的作用 2.args,**kw作为调用函数时输入变量的作用 3.混合使用也就是本章最后的这个小范例。

定义了

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)     
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
#这里输入的args一般为list或者tuple型,先进行提取,把里面的元素一个个拿出来并根据函数定义的那样进行分配,也是一个萝卜一个坑的原则,分到*args时只有4一个元素了,于是就把4重新组成了一个tuple.**kw以dict形式传值,这个问题不大。

>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)     
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
#这里输入的args刚好只有3个元素,上来就拆解开成3个子元素然后分配给a,b,c ;再看kw = {'d': 88, 'x': '#'},这里面包含两对键-值,输入后先遇到了f2函数定义中的*,d  命名关键字参数,他会先检测你输入的数据里面有没有'd',如果没有就会报错,有的话就把'd'的值提取出来并给传递给函数中的d.
#最后还剩下个一对键-值即'x': '#'就被传递给了函数中的kw.
#值得注意的是:在定义kw = {'d': 88, 'x': '#'}中,'x'不能用'a''b''c'这些已经出现的,原因我觉得可能是:在调用函数f2(*args, **kw)中,**kw,可理解为f2(*args,d=88,x='#'),若此时这个x变成a,相当于给函数中的变量a第二次赋值(前一次是在*args解绑后已经付过一次值了);这也很好的解释了弹出的错误:f2() got multiple values for argument 'a'  意思估计就是你给变量a太多值了

关于这些个讨论,我参考了齐伟老师的《跟老齐学python从入门到精通》

>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)     
#这句其实就是f1(args[1],args[2],args[3],args[4],d=99,x='#')的缩写
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)     
#这句其实就是f2(args[1],args[2],args[3],d=88,x='#')的缩写,所以x不能用a替换,否则变成既给a赋值args[1],又给a赋值'#'
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}

本孝子

#4 Created at ... [Delete] [Delete and Lock User]

董先生,真厉害啊

关于tuple的一个解释中角标弄错了,应该从0开始。


  • 1

Reply