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

Python函数浅析(一)——参数详解

程序员文章站 2024-02-18 18:22:16
...

函数参数

首先,我们必须明确的是参数调用时传入的参数要和定义的个数相等!

  1. 位置参数
    例如:定义一个函数 def fun(x,y,z) 调用时 fun(1,2,3)此时是按照参数定义的顺序传入实参。

  2. 关键字参数
    例如:定义一个函数 def fun(x,y,z),调用时fun(x=1,y=2,z=3)此时使用形参的名字来传入实参,传参的顺序就可以不同了。

函数参数默认值

定义函数时,在形参后面加上一个值:

def add(x=4,y=5)
    return x+y
print(add()) //9
print(add(6)) //11  默认6是X的值,y仍然是5
print(add(6,y=7)//13
print(add(6,x=5)) //TypeError(发生错误)传参按位置进行,6已经是X的值了,再传入一个X发生错误
print(add(x=6,7)//TypeError(发生错误)位置参数必须在关键字前面
print(add(7,x=6)) //13

在参数非常多的时候可以传入必须参数,可以避免繁琐!

可变参数

  • 位置参数的可变参数
def add(num):
    sun = 0
    for i in num:
        sun += i
    print(sum)
add(1) 
add([1,3,2]) 
add((2,4,3)) 

传入单个对象或者可迭代的对象!

def add(*num):
    sun = 0
    for i in num:
        sun += i
    print(sum)
add([1,3,2]) 

在形参前使用 * 表示该形参是可变参数,可以接收多个参数,组成一个元组。

  • 关键字参数的可变参数
def show(**kwargs):
    for k,v in kwargs.items():
        print('{} = {}'.format(k,v))

show(host='127.0.0.1',port='8080',username='xmc')

形参前使用 ** 符号,表示可以接收多个关键字参数,组成一个字典!

总结上面的内容举个实例代码解析一下:

def fun(x,y,*args,**kwargs):  #这里面包含着位置参数、关键字参数,位置参数的可变参数,关键字参数的可变参数

fun(1,2) #1给x,2给y,这容易理解
fun(1,2,3) #1给x,2给y,3给 *args
fun(1,2,3,4,5)  #1给x,2给y,之后的3,4,5就是一个元组,统一赋值给了 *args,大家理解一下,就是一个迭代的对象
fun(1,2,3,4,5,m=6,n=7,p='xmc') #这就是四种参数都有了,1给x,2给y,3,4,5都给了 *args,之后的m,n,p就是一个字典,一组键值对!
  • Keyword-only参数

如果在一个 位置可变参数之后出现了普通的参数,此时这个普通参数已经不再普通,称为keyword-only参数。

def fun(*args,x): #定义函数
fun(1,2)  #1,2作为一个元组赋给*args
fun(1,2,x = 3#此时1,2作为一个元组赋给*args,3赋给x

可见,在这种情况下,x必须使用关键字参数才能得到实参!
如果在一个关键字参数的可变参数之后出现了普通参数就没有意义了,如下代码!

def fun(**kwargs,x) //在调用函数时,不管传入的实参是什么,他都会默认为是赋给**kwargs的值,即使你传参是 x=1也是这样,默认为字典!

- 参数解构

在给函数提供参数时,一旦实参是集合类型的,我们需要对实参进行解构,提取元素!

def add(x,y): 
    return x+y 
add(1,2) #3
add((4,5)) #error 此时传入的是一个元组,不是单个元素
add(*(4,5)) #9
add(*[1,2]) #3
add({'x':1,'y':2}) #error 此时传入的是一个字典,错误
add(*{'x':1,'y':2}) #error
add(**{'x':1,'y':2}) #3 此时字典内的key值必须和函数的形参相对应!

非字典类型使用 * 来解构成位置参数,字典类型使用 ** 来解构成关键字参数!

相关标签: 参数 可变参数