python笔记 --- *args和**kwargs
作者:互联网
- *args:接收若干个位置参数,转换成元组(tuple)的形式
- **kwargs:接收若干个关键字参数,转换成字典(dict)的形式
举个简单的例子:
1> 获取两数之和
def test_sum(a, b): return a + b
这个函数求和仅限于两个参数。如果需要对不同数量的参数求和,如果传递的特定参数数量仅在运行时确定,该怎么办?那就需要创建一个可以对传递给它的所有参数求和的函数,不管是多少个参数。
2> 常规且最直观的做法
def test_sum(my_list): result = 0 for i in my_list: result += i return result m_list = [1, 2, 3, 4, 5] print(test_sum(m_list))
简单地传递一个list函数的参数,你可以将你所有要相加的数以一个list的形式传入。
可以这样实现,但是每当你要调用这个函数的时候,你就需要创建一个list作为参数传入。这样可能并不方便,尤其是你实现并不知道要加入list的所有值的时候。
3> *args的作用就体现出来了,它可以让你传递可变数量的位置参数。
def test_sum(*args): result = 0 for i in args: result += i return result print(test_sum(1, 2, 3, 4, 5))
不再需要向test_sum()函数传递一个list,而是传递三个不同的位置参数,test_sum()会获取所有输入的参数,并将它们打包成一个可迭代的简单对象,命名为args。
注意,args只是一个名字,你可以不用args这个名字,选择任何你喜欢的名字。
一、* args
1、使用解包(unpacking)操作符*获得的可迭代对象不是一个list,而是一个元组(tuple)。
2、在列表、元组、字典、字符串等前面加*,会将其拆分成一个一个的独立元素
3、*也可以作用于二维列表
4、*可以用在任意python提供的可迭代对象上
print(*(1, 2, 3)) print(*[1, 2, 3]) print(*'123') print(*{'1':'A', "2":'B', "3":'C'}) print(*{'1':'A', "2":'B', "3":'C'}.values()) print(*[[1, 2], [5, 6]]) # 将二维列表进行拆分,结果是两个一维列表
5、*的用途
1> *操作符去解包一个list并传递给函数作为参数,就好像你在传递每一个单独的参数。那么可以使用多个解包操作符,从多个lists中获取值并作为参数传递个一个函数
def test_sum(*args): result = 0 for i in args: result += i return result list0 = [1, 2, 3] list1 = [5, 6, 7] list2 = [7, 8, 9] print(test_sum(*list0, *list1, *list2))
2> 将列表分成三个不同的部分。输出应该显示第一个值、最后一个值和中间的所有值
my_list = [1, 2, 3, 4, 5, 6] a, *b, c = my_list print('a=', a, "b=", b, "c=", c)
3> 可以使用解包操作符(*)来对任何可迭代对象进行分片。如果是将两个list进行合并,就会非常有用
list0 = [1, 2, 3] list1 = [5, 6, 7] print([*list0, *list1])
4> python中字符串也是可迭代对象,也可以使用*进行解包操作
print([*"hello"])
*a, = 'hello' print(a)
这里的解包操作符*,后面跟了一个变量,一个逗号和一个赋值。但是这个代码和上面的代码没有什么区别。只是将字符串hello中所有的项指定到一个新的list a。
a后面的逗号就可以了。当使用带有变量赋值的解包操作符时,Python要求得到的变量要么是列表,要么是元组。使用后面的逗号,实际上已经定义了一个只有一个命名变量a的元组。
虽然这是一个巧妙的技巧,但许多Pythonistas并不认为这段代码可读性很强。因此,最好少用这类结构。
二、**kwargs
1、**kwargs工作原理和*args有点类似,但不是接收位置参数,而是接收关键字(keyword)参数
def test(**kwargs): result = "" for i in kwargs: # for i in kwargs.values(): result += i return result print(test(a='1', b='2', c='3'))
2、和args类似,kwargs只是一个名字,可以修改成任何你想要的名字。
3、**只能用于字典
4、合并两个不同的字典,通过解包操作符(**)
my_first_dict = {"A": 1, "B": 2} my_second_dict = {"C": 3, "D": 4} my_merged_dict = {**my_first_dict, **my_second_dict} print(my_merged_dict)
三、函数中参数的顺序
参数的正确顺序是:
(1) 位置参数
(2) *args参数
(3) **kwargs参数
① 如果只有位置参数、默认参数、*args。顺序是:(位置参数,默认参数,*args)或者(位置参数,*args,默认参数)
def test_01(x, y=1, *args): print("x=", x, "y=", y, "args=", args) test_01(1, 2, 3, 5)
def test_02(x, *args, y=1): print("x=", x, "y=", y, "args=", args)
test_02(1, 2, 3, 5)
② 位置参数、默认参数、*args*和*kwargs同时出现。顺序是:(位置参数,*args,默认参数,*kwargs)
def test_01(x, y, *args, a=8, b=9, **kwargs): print("x=", x, "y=", y, "args=", args, "a=", a, "b=", b, "kwargs=", kwargs) test_01(1, 2, 3, 5, 6, 7, 9, 0, 0) def test_02(x, y, *args, a=8, b=9, **kwargs): print("x=", x, "y=", y, "args=", args, "a=", a, "b=", b, "kwargs=", kwargs) test_02(1, 2, 3, 5, 6, a=7, b=9, c=0, d=0) # 这种会导致args无值,所以args需要在关键字参数前(关键字参数必须跟随在位置参数后面! 因为python函数在解析参数时, 是按照顺序来的, 位置参数是必须先满足, 才能考虑其他可变参数) def test_03(x, y, a=8, b=9, *args, **kwargs): print("x=", x, "y=", y, "args=", args, "a=", a, "b=", b, "kwargs=", kwargs) test_03(1, 2, a=3, b=5, m=6, n=7, f=9, c=0, d=0)
③ 不带默认参数。顺序是:(位置参数, *args, **kwargs)
def test_01(x, y, *args, **kwargs): print("x=", x, "y=", y, "args=", args, "kwargs=", kwargs) test_01(1, 2, 3, 5, n=7, f=9, c=0)
四、zip函数
zip() 函数用于将一个或多个可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表/对象)。(zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。)
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
利用 * 号操作符,可以将元组解压为列表。
a = [1,2,3] b = (4,5) print(list(zip(a))) print(list(zip(a, b))) print(tuple(zip(a, b))) print(dict(zip(a, b)))
1> 案例1:相邻元素依次相连
t_list = ['a', 'b', 'c', 'd', 'e','f'] # t_list[:-1]输出第一个元素至倒数第二个元素,t_list[1:]输出第二个元素到最后一个元素 print(list(zip(t_list[:-1],t_list[1:])))
2> 案例二:对二维列表(矩阵)取列
matrix = [[1,2,3],[4,5,6],[7,8,9]] print(list(zip(*matrix)))
————————————————————————————————————————————————
参考博客:
https://www.cnblogs.com/abclife/p/11483372.html
标签:python,args,list,---,test,参数,kwargs,print 来源: https://www.cnblogs.com/falling-trees/p/16200142.html