赞
踩
- 形参 可以在函数内被作为“变量”使用,也叫“形参变量”。
- 实参 可以是任何的表达式,最终算出的值会被赋值给函数体中对应的形参变量。(变量、具体的值、算数表达式、字符串表达式、函数调用等都可以作为实参的参数)
实参是在调用函数时传入的值。实参只有两种:
位置参数之前不能出现关键字参数,关键字参数之后也不能出现位置参数。
在为函数传入实参时,要遵循的顺序由左到右是:
- 位置参数在前
- 关键字参数在后。
实参的 位置参数 只能出现在参数列表左侧部分,之前不能有 关键字参数。
位置参数 有以下两种书写方式:
function1(3, 5)
function1(*(3, 5))
上面 function1() 函数调用中的 3
和 5
都是位置参数,是位置参数的两种写法。
实参的 关键字参数 只能出现在 位置参数 之后。
关键字参数 有以下两种书写方式:
function2(a=3, b=5)
function2(**{'a': 3, 'b': 5))
上面 function2() 函数调用中的 3
和 5
都是关键字,是关键字参数的两种写法。
形参是出现在函数定义中的参数名称,有以下5种:
且,仅限位置参数、位置或关键字参数、仅限关键字参数 还分为有缺省值的和没有缺省值的;可变位置参数、可变关键字参数 不存在缺省值这一说法。
在定义形参时,要遵循的顺序由左到右是:
- 无缺省值的仅限位置参数
- 有缺省值的仅限位置参数 或 无缺省值的位置或关键字参数
- 有缺省值的位置或关键字参数
- 仅限关键字参数(有无缺省值都可) 或 可变位置参数
- 可变关键词参数
仅限位置参数的形参,在实参中只能通过位置参数的方式传入值。
在形参列表中通过 /
字符,定义仅限位置参数。/
左侧的形参均为 仅限位置参数。
下面 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 是空的占位语句。不做任何事情,是为了保持程序结构的完整性。
位置或关键字参数的形参,在实参中可以通过位置参数传入值,也可以通过关键字参数传入值,两种方式任选其一均可。
如果在实参中通过关键字参数传入值,之后的实参也应该通过关键字传入值。因为在实参中关键字参数之后不允许出现位置参数。如有疑问请参阅 实参类型 。
下面 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
仅限关键字参数的形参,在实参中只能通过关键字参数的方式传入值。
在形参列表中通过 *
字符,定义仅限关键字参数。仅限关键字参数,出现在 *
的右侧 。
下面 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
可变位置参数的形参,在实参中只能通过位置参数的方式传入值,且不限制位置参数的数量。
“可变位置参数”会以 元组(tuple) 类型接收参数值。经常使用args
作为“可变位置参数”的参数名。
“可变位置参数” 是指实参中“位置参数”的数量是可变的,可以传入零个或多个"位置参数"。
在形参列表中通过在 形参名称前加缀*
来定义“可变位置参数。”
在一个函数的形参列表中,只能出现一个
*
。所以只能有一个可变位置参数,且可变位置参数与仅限关键字参数不能共存,因为仅限关键字参数也是通过*
定义的。
下面 function4() 函数中的 args
就是“可变位置参数”:
def function4(*args, **kwargs):
pass
可变关键字参数的形参,在实参中只能通过关键字参数的方式传入值,且不限制关键字参数的数量。
“可变关键字参数”会以 字典(dict) 类型接收参数值。经常使用kwargs
作为“可变关键字参数”的参数名。
“可变关键字参数” 是指实参中“关键字参数”的数量是可变的,可以传入零个或多个关键字参数。
在形参列表中通过在 形参名称前加缀**
来定义可变关键字参数。
在一个函数的形参列表中,只能出现一个
**
。所以只能有一个“可变关键字参数”。
下面 function5() 函数中的 kwargs
就是可变位置参数:
def function5(*args, **kwargs):
pass
下面两个例子,所有形参都是没有缺省值的。
例一:
例二:
要区分参数的数据类型与参数类型的区别,不要混淆!
参数的数据类型:指的是形参与实参需要满足什么数据类型。比如:int(整数)、float(浮点数)、str(字符串)、list(列表)、dict(字典)等数据类型。请参阅:Python基础-数据类型 了解更多的更详细的数据类型。
参数类型:指的是实参的两种类型,位置参数、关键字参数;以及形参的五种类型,仅限位置参数、位置或关键字参数、仅限关键字参数、可变位置参数、可变关键字参数。
由本文中的 形参&实参 可知,形参定义了一个函数能接受何种类型的实参。
形参不仅可以定义函数能接受何种参数类型的实参,还可以定义函数能接受何种数据类型的实参。
形参定义实参的数据类型时,只是推荐实参给出什么样的数据类型,并不强制,如果实参给出的数据类型,不满足形参定义的数据类型,不会报错。
但为了程序的严谨性,给出的实参要尽量满足形参定义的数据类型。
参数的数据类型定义,是在形参种完成定义的,只需在形参名称后面 给出一个 :
并给出 数据类型
即可。
下面函数 function6() 中的 a
和 b
就定义了“参数的数据类型”,并且 b
还给出了缺省值。
def function6(a: int, b: str = 10):
pass
参考资料(如有侵权,请联系作者删除内容):
具体说明请参考:Python 3.8-新的特性-仅限位置形参 ↩︎
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。