Python教程

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

本文主要是介绍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和**kwargs的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!