Python函数的参数

2023-12-14 22:02:46

前言:

????????定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。

?【 一 】形参与实参

????????1、形参: 即形式参数,它是在定义函数名和函数体时使用的参数,目的是接收调用该函数传递参数。 2、实参: 即实际参数,它是在调用时传递给函数的参数,传递给被调用函数的值。实参可以是常量、变量、表达式、函数等,但无论是哪种类型,在进行函数调用时必须具有确定的值,这些值会传递给形参。

下面用一段代码具体说明形参和实参

def sum(a,b):
    retutn a+b
    
sum(10,20)

????????在sum函数中a和b就是形参。第四行10和20就是实参

【 1 】位置参数

????????当调用函数时传入的参数位置是和定义函数的参数位置相对应,当使用位置参数传递时,调用韩式传入的参数数量要和定义函数参数的数量相同,否则程序会出错。这也是函数默认的传递方式 观察如下代码?

示例一:

def fun_01(a,b,c):
    return a,b,c

print(fun_01(1,2,3))

#(1,2,3)

示例二:

def fun_02(a,b,c):
    return c,b,a

print(fun_01(1,2,3))

#(3,2,1)

????????上面两个函数在定义时参数名是一样的,并且在调用时传入的参数也是一样的,但返回的结果却不同。这是由于当函数调用时,传入的参数位置和定义的函数参数位置相对应,当调用函数传入参数那一刻,函数的参数值就已经确定了,至于输出结果的顺序是由于return返回值的顺序决定的。


【 2 】关键字参数传递

????????假设某个函数的参数非常复杂,为了不让程序出错,我们可以把参数的名称和值绑定在一起,使用参数名提供的参数叫作关键字参数 观察如下代码?

示例一:

def connect(url,port):
    return 'url is %s,and port is %s'%(url,port)

print(connect(url='www.baidu.com',port='80'))

#url is www.baidu.com,and port is 80

注:

  1. 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为python解释器能够用参数名匹配参数值
  2. 关键字参数可以和位置参数混合使用,但位置参数必须要出现在关键字参数之前

????????关键字参数的优点是,它可以使函数调用更加清晰明了,易于阅读和理解。此外,还可以避免因参数顺序错误而导致的错误。当然,如果函数定义时没有声明该参数名,则会产生一个 TypeError 异常。


【 3 】参数默认值

????????在函数定义时指定的参数默认值,在调用函数时可以不传递该参数,使用其默认值。例如:def greet(name, message="Hello"): 中的 message 参数。

????????在定义函数时,可以给参数赋予默认值,如果该参数最终没有被传递值,将使用该默认值 观察如下代码

def sum(a,b, c =20):
    retrue a+b+c
sum(10,20)


# 50

注: 参数c使用了默认值


【 4 】可变参数

????????可变参数:可以接受任意数量的参数,包括位置参数和关键字参数。在函数定义时,使用 *args 来表示可变位置参数,使用 **kwargs 来表示可变关键字参数。例如:def greet(*args, **kwargs): 中的 *args**kwargs 参数。

????????在python中函数可以定义可变参数,即传入函数的参数是可变的 语法格式如下:

def functionname([formal_args,]*args,**kwargs):
    function_sutite
    return [expression]

?说明: 在上述格式中,以星号(*)开始的变量args会存放所有的未命名的变量参数,args为元组;以**开始的变量kwargs会存放命名参数,即形如key=value的参数,kwargs为字典。 观察如下代码

注: 如果*和**参数混合使用,那么传入的顺序必须和声明的顺序一致,如果调用函数时没有指定参数,那么它就是一个空的元组或者空的字典 对*和**总结:

  • 使用*可以将未命名的参数打包成元组类型

  • 使用**可以将命名的参数打包成字典类型


【 5 】*args与**kwargs用法和使用

【 1 】*args

*args:

  • *args?用于接收不定数量的位置参数,它会将传入的位置参数打包成一个元组。在函数内部,你可以使用这个元组来访问和处理这些位置参数。
  • 在函数定义中,*args?的语法是在参数前加上一个星号?*,如?def func(*args)
  • 调用函数时,你可以传递任意数量的位置参数给?*args它们会被收集到一个元组中。
def foo(*args):
    for arg in args:
        print(arg)

foo(1, 2, 3, 4, 5)

运行这段代码时,它会打印出传入的位置参数:1、2、3、4、5。

【 2 】**kwargs

**kwargs:

  • **kwargs?用于接收不定数量的关键字参数,它会将传入的关键字参数打包成一个字典。在函数内部,你可以使用这个字典来访问和处理这些关键字参数。
  • 在函数定义中,**kwargs?的语法是在参数前加上两个星号?**,如?def func(**kwargs)
  • 调用函数时,你可以传递任意数量的关键字参数给?**kwargs,它们会被收集到一个字典中。
def bar(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

bar(a=1, b=2, c=3)

?运行这段代码时,它会打印出传入的关键字参数及其对应的值:a 1、b 2、c 3。

【 3?】结合使用

  • 如果你希望函数能够同时接收不定数量的位置参数和关键字参数,你可以在函数定义中同时使用?*args??**kwargs
  • 在函数定义中,首先使用?*args?来接收位置参数,然后使用?**kwargs?来接收关键字参数。
def baz(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(key, value)

baz(1, 2, 3, a=4, b=5, c=6)

?运行这段代码时,它会打印出传入的位置参数和关键字参数及其对应的值:1、2、3、a 4、b 5、c 6。


【 6 】混合参数方式

前面介绍的五种参数传递方式在定义和调用函数时可以混合使用,但在混合使用需要符合以下规则:

  1. 先位置参数传递
  2. 再关键字参数传递
  3. 再可变参数传递

文章来源:https://blog.csdn.net/m0_58310590/article/details/134931564
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。