关于 变量 的概念,在 《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