文章目录
一、形参&实参
- 形参 指的是出现在函数定义中的参数名称;
- 实参 指的是在调用函数时实际传入的参数值;
- 形参定义了一个函数能接受何种类型的实参。
- 形参 可以在函数内被作为“变量”使用,也叫“形参变量”。
- 实参 可以是任何的表达式,最终算出的值会被赋值给函数体中对应的形参变量。(变量、具体的值、算数表达式、字符串表达式、函数调用等都可以作为实参的参数)
二、参数类型
2.1 实参类型
实参是在调用函数时传入的值。实参只有两种:
- 位置参数
- 关键字参数
位置参数之前不能出现关键字参数,关键字参数之后也不能出现位置参数。
在为函数传入实参时,要遵循的顺序由左到右是:
- 位置参数在前
- 关键字参数在后。
2.1.1 位置参数
实参的 位置参数 只能出现在参数列表左侧部分,之前不能有 关键字参数。
位置参数 有以下两种书写方式:
function1(3, 5)
function1(*(3, 5))
上面 function1() 函数调用中的 3
和 5
都是位置参数,是位置参数的两种写法。
2.1.2 关键字参数
实参的 关键字参数 只能出现在 位置参数 之后。
关键字参数 有以下两种书写方式:
function2(a=3, b=5)
function2(**{'a': 3, 'b': 5))
上面 function2() 函数调用中的 3
和 5
都是关键字,是关键字参数的两种写法。
2.2 形参类型
形参是出现在函数定义中的参数名称,有以下5种:
- 仅限位置1参数(positional-only)
- 位置或关键字参数(positional-or-keyword)
- 仅限关键字参数(keyword-only)
- 可变位置参数(var-positional)
- 可变关键字参数(var-keyword)
且,仅限位置参数、位置或关键字参数、仅限关键字参数 还分为有缺省值的和没有缺省值的;可变位置参数、可变关键字参数 不存在缺省值这一说法。
在定义形参时,要遵循的顺序由左到右是:
- 无缺省值的仅限位置参数
- 有缺省值的仅限位置参数 或 无缺省值的位置或关键字参数
- 有缺省值的位置或关键字参数
- 仅限关键字参数(有无缺省值都可) 或 可变位置参数
- 可变关键词参数
2.2.1 仅限位置参数
仅限位置参数的形参,在实参中只能通过位置参数的方式传入值。
在形参列表中通过 /
字符,定义仅限位置参数。/
左侧的形参均为 仅限位置参数。
下面 function1() 函数中的 pos_only1
和 pos_only2
均是仅限位置参数:
def function1(pos_only1, pos_only2, /, positional_or_keyword):
pass
#下面 有缺省值的 仅限位置参数, 之后的 位置或关键字参数(positional_or_keyword) 应该也要 有缺省值,否则报错
def function1(posonly1, posonly2=None, /, positional_or_keyword=None):
pass
Python 中 pass 是空的占位语句。不做任何事情,是为了保持程序结构的完整性。
2.2.2 位置或关键字参数
位置或关键字参数的形参,在实参中可以通过位置参数传入值,也可以通过关键字参数传入值,两种方式任选其一均可。
如果在实参中通过关键字参数传入值,之后的实参也应该通过关键字传入值。因为在实参中关键字参数之后不允许出现位置参数。如有疑问请参阅 实参类型 。
下面 function2() 函数中的 pos_or_kw1
和 pos_or_kw2
均是位置或关键字参数:
def function2(pos_or_kw1, pos_or_kw2=None):
pass
#下面 有缺省值的 位置或关键字参数(pos_or_kw1) 之后出现的 位置或关键字参数(pos_or_kw2) 也要有缺省值,否则报错
def function2(posonly1, posonly2=None, /, pos_or_kw1=None, pos_or_kw2=None):
pass
2.2.3 仅限关键字参数
仅限关键字参数的形参,在实参中只能通过关键字参数的方式传入值。
在形参列表中通过 *
字符,定义仅限关键字参数。仅限关键字参数,出现在 *
的右侧 。
下面 function3() 函数中的 kw_only1
和 kw_only2
均是仅限位置参数:
def function3(arg, *, kw_only1, kw_only2):
pass
# 仅限关键字参数(kw_only1和kw_only2)中,有无缺省值 其形参顺序不会受影响,也不受其他参数有无缺省值的影响。
# 有缺省值的 可以在 无缺省值 的前面,无缺省值的 也可以在 有缺省值的 前面。
def function3(arg, *, kw_only1, kw_only2=None):
pass
def function3(arg, *, kw_only1=None, kw_only2):
pass
def function3(arg, *, kw_only1=None, kw_only2=None):
pass
2.2.4 可变位置参数
可变位置参数的形参,在实参中只能通过位置参数的方式传入值,且不限制位置参数的数量。
“可变位置参数”会以 元组(tuple) 类型接收参数值。经常使用args
作为“可变位置参数”的参数名。
“可变位置参数” 是指实参中“位置参数”的数量是可变的,可以传入零个或多个"位置参数"。
在形参列表中通过在 形参名称前加缀*
来定义“可变位置参数。”
在一个函数的形参列表中,只能出现一个
*
。所以只能有一个可变位置参数,且可变位置参数与仅限关键字参数不能共存,因为仅限关键字参数也是通过*
定义的。
下面 function4() 函数中的 args
就是“可变位置参数”:
def function4(*args, **kwargs):
pass
2.2.5 可变关键字参数
可变关键字参数的形参,在实参中只能通过关键字参数的方式传入值,且不限制关键字参数的数量。
“可变关键字参数”会以 字典(dict) 类型接收参数值。经常使用kwargs
作为“可变关键字参数”的参数名。
“可变关键字参数” 是指实参中“关键字参数”的数量是可变的,可以传入零个或多个关键字参数。
在形参列表中通过在 形参名称前加缀**
来定义可变关键字参数。
在一个函数的形参列表中,只能出现一个
**
。所以只能有一个“可变关键字参数”。
下面 function5() 函数中的 kwargs
就是可变位置参数:
def function5(*args, **kwargs):
pass
2.3 参数类型举例
下面两个例子,所有形参都是没有缺省值的。
例一:
- 形参列表由左到右分别为:仅限位置参数、位置或关键字参数、仅限关键字参数、可变关键字参数。
- 实参列表由左到右分别为:位置参数、关键字参数。
三次 fun1() 函数调用的程序执行结果都如下图一样:
例二:
- 形参列表由左到右分别为:仅限位置参数、位置或关键字参数、可变位置字参数、可变关键字参数。
- 实参列表由左到右分别为:位置参数、关键字参数。
四次 fun2() 函数调用的程序执行结果都如下图一样:
三、参数的数据类型
要区分参数的数据类型与参数类型的区别,不要混淆!
-
参数的数据类型:指的是形参与实参需要满足什么数据类型。比如:int(整数)、float(浮点数)、str(字符串)、list(列表)、dict(字典)等数据类型。请参阅:Python基础-数据类型 了解更多的更详细的数据类型。
-
参数类型:指的是实参的两种类型,位置参数、关键字参数;以及形参的五种类型,仅限位置参数、位置或关键字参数、仅限关键字参数、可变位置参数、可变关键字参数。
由本文中的 形参&实参 可知,形参定义了一个函数能接受何种类型的实参。
形参不仅可以定义函数能接受何种参数类型的实参,还可以定义函数能接受何种数据类型的实参。
形参定义实参的数据类型时,只是推荐实参给出什么样的数据类型,并不强制,如果实参给出的数据类型,不满足形参定义的数据类型,不会报错。
但为了程序的严谨性,给出的实参要尽量满足形参定义的数据类型。
参数的数据类型定义,是在形参种完成定义的,只需在形参名称后面 给出一个 :
并给出 数据类型
即可。
下面函数 function6() 中的 a
和 b
就定义了“参数的数据类型”,并且 b
还给出了缺省值。
def function6(a: int, b: str = 10):
pass
参考资料(如有侵权,请联系作者删除内容):
具体说明请参考:Python 3.8-新的特性-仅限位置形参 ↩︎