参数的传入

关于 变量 的概念,在 《FirstWeb》中已经说过了。关于 函数 (Function)、 (Class),这些如何定义的语法,在之前之后的 Python 示例代码中,不断出现,也不做特别说明了。
本篇内容,主要探讨的是 参数 (Arguments),一般来说,参数是传入到某个函数中的,即使在 Class 的实例化过程中,看起来是传给 Class 的,实际上一般是传给 Class 上的 __init__ 这个函数。
传入的参数,一般根据其形式,分为两种: 普通的 Arguments,kv (key-value) 形式的 Keyword Arguments。在动态参数 (定义函数时不固定参数的个数) 传入时,比如说 hello (*args, **kwargs),其中 args 就是一组普通参数,而 kwargs 就是 kv 形式的参数 (dict 类型)。此时的 args 必然是 tuple 类型的,而不会是 list,你觉得为什么呢?

默认参数

看代码,应该能理解 默认参数 是什么意思了:

>>> def show_the_default_arg(k='hello'):
...     print(k)
...
>>> show_the_default_arg()  # 默认参数起作用
hello
>>> show_the_default_arg('not hello') # 没有指定参数名称, 实际上也是传值给 k
not hello
>>> show_the_default_arg(k='not hello, I am new')
not hello, I am new

如何接受参数 (函数中的定义)

我们定义一个函数时,参数的形式比较随意,可以是 def function(k1, k2),可以是 def function(k1, k2=None),可以是 def function(k1=None, k2=None),当然,一个函数也可以不接受任何的参数。
普通参数和 kv 形式的参数,在函数调用时,有可能出现混用的情形。但混用也要遵循基本语法,具体解释起来比较麻烦,不如直接看代码,语法错了程序反正会报错,而且在 PyCharm 会有非常显著的错误提示,所以,也不算什么大的问题。

参考代码:

>>> def accpet_argumetns(hello, world):
...     print('hello: %s; world: %s' % (hello, world))
...
>>> accpet_argumetns(hello='a', world='b')
hello: a; world: b
>>> accpet_argumetns('a', world='b')
hello: a; world: b
>>> accpet_argumetns('a', 'b')
hello: a; world: b
>>>
>>> accpet_argumetns(hello='a', 'b')
  File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg

函数中定义对动态参数的接收:

def show_arguments(*args, **kwargs):
    print('args: %s' % args)
    print('kwargs: %s' % kwargs)

args 以及 kwargs 只是约定俗成的名字,你完全可以换成自己喜欢的名称:

def show_arguments_2(*a, **b):
    print('args: %s' % a)
    print('kwargs: %s' % b)

如何传入参数 (调用函数)

*args**kwargs 不仅仅在函数定义的时候使用,直接调用函数也一样可用。
代码运行时,很多数据会彼此流转,如果已知一个 dict 类型的数据,里面的 keys 跟某个函数需要的所有参数一致,那么调用函数时再一个个参数指定就太麻烦了,直接一个 run_function(**the_dict) 显得方便很多。

参考代码:

>>> def run_function(a, b=2, c=3):
...     print('a:{0}, b:{1}, c{2}'.format(a, b,c))
...
...
>>> run_function(*[5, 6, 7])
a:5, b:6, c7
>>>
>>> run_function(**{'a':7, 'b':8, 'c':9})
a:7, b:8, c9