欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 浅谈Python函数的参数

程序员文章站 2022-05-21 11:56:44
https://www.programiz.com/python-programming/function-argumenthttps://www.geeksforgeeks.org/args-kwargs-python/https://treyhunner.com/2018/04/keyword-arguments-in-python/https://docs.python.org/zh-cn/3/glossary.html#term-argumenthttps://docs.python.org...

1. 函数参数的分类

    函数参数分为形参(parameter)和实参(argument),这两种参数的区别就是:形参用于函数定义,实参用于函数调用。
    函数参数还可以分为位置参数和关键字参数。把这句话换一种说法就是:函数参数分为关键字参数和非关键字参数,也可以分成位置参数和非位置参数。位置参数很好理解,函数定义时确定了参数的位置,函数调用时,输入的具体数值会赋值给相应的位置参数。那关键字参数如何理解呢?实际上,关键字(keyword)的中的key就是key-value值的key,强调的是当函数调用时,特定的取值对应特定的参数。
    那么位置参数和关键字参数有什么关系呢?举个例子,假如100对新人举办婚礼,入场时要按顺序排成两排,男士一排,女士一排,如果其中2个男士的顺序颠倒了,而女士的顺序没有改变,入场时就会产生麻烦,这就是位置参数的缺点,调用函数时,输入值的顺序必须与位置参数的顺序一致。如果入场之前互相检查一下就可以避免麻烦了,这就意味着男士和女士之间是有对应关系的,关键字参数就强调了变量与取值的对应关系。所以,比起位置参数,关键字参数更加精确。

2. 参数分类之间的关系

    想了很久,画了下面这个图,表示形参、实参、位置参数和关键字参数之间的关系。
荐
                                                        浅谈Python函数的参数
    当函数定义为 def func(arg) 时,函数调用可以使用位置参数,也可以使用关键字参数,示例如下:

def func(arg1,arg2):
      print(arg1+" "+arg2+"!")

#下面3条语句输出结果相同
func("Hello",arg2="world")
func(*("Hello","world"))
func(**{"arg2":"world","arg1":"Hello"})

    “仅允许使用位置参数”这个性质是python3.8新增的,意思是 / 符号前面的参数只能是位置参数,不能是关键字参数,示例如下:

def func(arg1, arg2, /, arg3):
      print(arg1+" "+arg2+","+arg3)
      
#下面2条语句输出结果相同
func("Hello","world",arg3="zsx0728")
func(*("Hello","world","zsx0728"))

    “仅允许使用关键字参数”的意识是,* 符号后面的参数只能是关键字参数,不能是位置参数,示例如下:

def func(*, arg1, arg2):
      print(arg1+" "+arg2+"!")
      
#下面2条语句输出结果相同
func(arg1="Hello",arg2="world")
func(**{"arg1":"Hello","arg2":"world"})

    理解了上面的内容就非常好理解可变参数 *arg 和 **kwargs 了。kwargs就是 keyword arguments, **kwargs表示函数调用时只能输入关键字参数,参数作为字典传递,这些参数在函数内部构成一个字典,参数可以是一个或多个; *args表示函数调用时只能输入位置参数,参数以元组形式传递,参数可以是一个或多个。

def func(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print("{} : {}".format(key, value))

func(
        "caption : Luffy",
        *("mate : Zoro","navigator : Nami"),
        sniper="Usop",
        **{"cook":"Sanj","doctor":"Choppe"}
        )

    输出值为:

caption : Luffy
mate : Zoro
navigator : Nami
sniper : Usop
cook : Sanj
doctor : Choppe

3. 使用注意事项

    函数定义和函数调用时,参数都按先位置参数,后关键字参数的顺序进行定义或输入。

#函数定义时,默认参数(关键字参数)在位置参数前会报错
def complex(kwarg="Hello",arg):
SyntaxError: non-default argument follows default argument

#函数调用时,关键字参数在位置参数前会报错
complex(keyword="Hello",arg)
SyntaxError: positional argument follows keyword argument

参考文献

[1]www.programiz.com.Python Function Arguments[EB/OL].https://www.programiz.com/python-programming/function-argument,2020-01-01.
[2]www.programiz.com.Python *args and **kwargs[EB/OL].https://www.programiz.com/python-programming/args-and-kwargs,2020-01-01.
[3]www.geeksforgeeks.org.*args and **kwargs in Python[EB/OL].https://www.geeksforgeeks.org/args-kwargs-python/,2020-01-01.
[4]Python Software Foundation.术语对照表[EB/OL].https://docs.python.org/zh-cn/3.6/glossary.html#term-argument,2020-06-29.
[5]Python Software Foundation.术语对照表[EB/OL].https://docs.python.org/zh-cn/3.6/glossary.html#term-parameter,2020-06-29.
[6]Python Software Foundation.表达式[EB/OL].https://docs.python.org/zh-cn/3.6/reference/expressions.html#calls,2020-06-29.

本文地址:https://blog.csdn.net/zsx0728/article/details/107089382