python函数——形参中的:*args和**kwargs

Note:多个实参,放到一个元组里面,以*开头,可以传递多个参数;**是形参中按照关键字传值吧多余的传值以字典的方式实现。

------------------------------------------手动分割线------------------------------------

*args:将实参中按照位置传值,多出来的值都给args,以元组方式实现。

首先,为理解*args,实现一个乘法函数:

def multiply(x, y):
	print (x * y)

multiply(5, 4)

输出结果为:20

改变输入:

def multiply(x, y):
    print (x * y)

multiply(5, 4, 3)

 输出结果为:TypeError: multiply() takes 2 positional arguments but 3 were given

使用*args,修改函数:

def multiply(*args):
    z = 1
    for num in args:
        z *= num
    print(z)

multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)

输出结果为:

20
90
24
900

因为我们使用*args向我们的函数发送一个可变长度的参数列表,所以我们能够将尽可能多的参数传入函数调用中。使用*args,你可以创建更灵活的代码,在你的函数中接受不同数量的非keyworded参数。

示例1:

def func(x,*args):
	print(x)
	print(args)

func(1,2,3,4,5) #1->x  2,3,4,5->args

结果为:

1
(2, 3, 4, 5)

当args与位置参数和默认参数混用的情况下:(注意三者顺序)

示例一:(三者顺序是:位置参数、默认参数、*args)

def func(x,y=1,*args):
	print('x = ',x)
	print('y = ',y)
	print('args = ',args)

func(1,2,3,4,5) #1->x  2->y  3,4,5->args

输出结果为:

x =  1
y =  2
args =  (3, 4, 5)

示例二:(三者顺序为:位置参数、*args、默认参数)

def func(x,*args,y=1):
	print('x = ',x)
	print('args = ',args)
	print('y = ',y)

func(1,2,3,4,5) #1->x  2,3,4,5->args  1->y

输出结果为:

x =  1
args =  (2, 3, 4, 5)
y =  1

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------                   手动分割线          -------------------------------------------------

**kwargs:形参中按照关键字传值把多余的传值以字典的方式实现

例如1:

def print_kwargs(**kwargs):
    print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)

结果为:

{'kwargs_1': 'Shark', 'kwargs_2': 4.5, 'kwargs_3': True}

例如2:

def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(my_name="Sammy", your_name="Casey")

结果为:

The value of my_name is Sammy
The value of your_name is Casey

Note:**kwargs形成的字典不会按照函数的输入形式排序,字典格式是随机的。结果也有可能为:

The value of your_name is Casey
The value of my_name is Sammy

*******************

示例:

def func(x,**kwargs):
	print('x = ',x)
	print('kwargs = ',kwargs)

func(1,y=1,a=2,b=3,c=4) # y a b c -> kwargs

结果为:

x =  1
kwargs =  {'a': 2, 'c': 4, 'b': 3, 'y': 1}

关于**kwargs、位置参数、*args、默认参数混用问题:(注意顺序)

位置参数、*args、**kwargs三者的顺序必须是:位置参数、*args、**kwargs,否则会出错。

示例1:
 

def func(x,*args,**kwargs):
	print('x = ',x)
	print('args = ',args)
	print('kwargs = ',kwargs)

func(1,2,3,4,y=1,a=2,b=3,c=4) 

结果为:

x =  1
args =  (2, 3, 4)
kwargs =  {'b': 3, 'c': 4, 'a': 2, 'y': 1}

错误示例:(顺序错误)

def func(x,**kwargs,*args):
	print('x = ',x)
	print('args = ',args)
	print('kwargs = ',kwargs)

func(1,y=1,a=2,b=3,c=4,2,3,4) 

结果为:

SyntaxError: invalid syntax

位置参数、默认参数、**kwargs的顺序必须为:位置参数、默认参数、**kwargs,否则会报错。

示例:

def func(x,y=2,**kwargs):
	print('x = ',x)
	print('y = ',y)
	print('kwargs = ',kwargs)

func(1,y=1,a=2,b=3,c=4) 

结果为:

x =  1
y =  1
kwargs =  {'c': 4, 'a': 2, 'b': 3}

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页