大爽Python入门教程 4-3 函数传参 形参、实参 default、*args、**kwargs
大爽Python入门公开课教案 点击查看教程总目录
1 回顾参数
先来熟悉下参数,参数在函数头定义。
回顾一下,前两节定义了一些函数的函数头,
例如
def calculate_sum(n):
def show_course_average(course_name)
这些函数是需要传参的,
n
是函数calculate_sum
需要的参数。
course_name
是函数show_course_average
需要的参数。
再例如
def simple_func():
这个函数是不需要传参的。
简而言之,就是定义函数时,
函数头的括号里,定义的就是参数。
2 实参形参 parameter、argument
其实,参数对应的英文有两个
parameter、 argument
很多地方这两个说法是混用的,大多数时候其实也不讲究。
不过这里做教程,严谨的谈论下这两个。
- parameter 是定义函数时使用的变量,
也可以说是形式上的参数,形参(formal parameter) - argument 是调用函数时传入的变量名,
也可以说是实际上的参数,实参(actual argument)
举例如下
def calculate_sum(n): # n: parameter,形参,formal parameter
k = 1
s = 0
for i in range(n):
s += k / (i + 1)
k = -k
print("n=%s: S=%s" % (n, s))
a = 100
calculate_sum(a) # a: argument,实参,actual argument
大多数时候,不产生混淆的话,都统称为参数就好。
3 参数默认值
一般来讲,parameter的数量和argument的数量需要是一样的。
即声明函数定义了多少个形参,
调用函数时就需要传多少个实参。
但是。。。
也有偷懒的办法。
如果一个形参,常常使用一个值,每次我们都传一遍实参就划不来了。
省事的办法是,在定义函数的地方,我们可以给这个参数一个默认参数值(Default Argument Values)。
如果调用时不写参数,就使用默认的,
写了参数就是用写了的参数。
比如,这是一个非常简单的打招呼的函数。
def greet(name, hello="Hello"):
print("%s %s" % (hello, name))
greet("Lee")
greet("Lee", "Hi")
greet("Lee", "Welcome")
其输出为
Hello Lee
Hi Lee
Welcome Lee
即调用时,不指定hello
变量的值,
则使用默认参数"hello"
。
指定了,就是用指定的值。
4 传参方式
调用函数时,传入的实参和形参是怎么匹配的呢?
之前的例子,都是通过位置来匹配的。
第一个实参匹配第一个形参,
第二个实参匹配第二个形参,
......
使用这样的匹配方式的参数,也叫做positional arguments
,
基于位置匹配的参数,简称位置参数。
除了通过位置来匹配,还可以在调用时,使用形参名来匹配。
示例如下
def func(a, b, c):
print("a: %s" % a)
print("b: %s" % b)
print("c: %s" % c)
func(c=2, b=1, a=3)
其输出为
a: 3
b: 1
c: 2
上面这句代码func(c=2, b=1, a=3)
其中a
、b
、c
分别对应三个形参名。
等号后要传给这些形参的实参值。
使用这样的方式传递的参数,叫做keyword argument
,
基于形参名匹配的参数,关键字参数。
这两种可以混用,但是注意:
positional arguments
必须要在keyword argument
之前。
示例如下
def func(a, b, c):
print("a: %s" % a)
print("b: %s" % b)
print("c: %s" % c)
func(1, 2, c=5)
当然,初学者估计会有疑惑,
这两种传参方式哪个好,或者说什么时候用哪个。
这里个人的看法是,
一般能用positional arguments
就用positional arguments
,
发现这个不行了或者麻烦,再用keyword argument
。
5 *args
在形参中,*args
用于接受不定数量的位置参数positional arguments
。
并会将这些参数打包放在元组中
具体见下
def func(*args):
print(args)
func()
func(1)
func(1, 2)
func(1, 2, 5)
输出如下
()
(1,)
(1, 2)
(1, 2, 5)
注意,这里的核心是*
符号,后面的args
换成别的名字也可以。
6 **kwargs
在形参中,**kwargs
用于接受不定数量的关键词参数keyword argument
。
并会将这些参数打包放在字典中
具体见下
def func(**kwargs):
print(kwargs)
func()
func(a=1)
func(a=1, bb=2)
func(a=1, b=2, value=5)
输出如下
{}
{'a': 1}
{'a': 1, 'bb': 2}
{'a': 1, 'b': 2, 'value': 5}
注意,这里的核心是**
符号,后面的kwargs
换成别的名字也可以。
*args
和**kwargs
暂时不需要会用,能看懂代码就行。