ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python笔记 --- *args和**kwargs

2022-04-27 19:03:43  阅读:214  来源: 互联网

标签:python args list --- test 参数 kwargs print


  • *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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有