当可以使用参数列表时,使用*args有什么意义?

2024-06-01 11:35:22 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python方法中传递变量列表或字典会比传递*args更简洁吗?你知道吗

例如

def function(a, *argv):
   print('First variable:', a)
   for k in argv:
      print('Additional variable:',k)

与相同

def function(a, list):
   print('First variable:', a)
   for k in list:
      print('Additional variable:',k)

但在第二个参数中传递了一个列表。我认为使用*args通常会在程序中造成额外的错误,因为参数长度只需要比强制参数长度长。请解释一下*args在哪些情况下真的有用?谢谢


Tags: 方法in列表for参数字典defargs
3条回答

当一个list(或dict)可以做同样的任务时,为什么*args(或**kwargs)本质上是必需的,这是一个公平的问题。关键原因是函数的**调用方事先不知道参数的数目**。我将试着结合您所分享的特定场景来解释这一点。你知道吗

假设我们有下面的函数,它查找传入的所有整数的和。(为了演示,我放弃了sum内置函数,请耐心听我说:)

def do_add(*int_args):
    total = 0
    for num in int_args:
        total += num
    return total

对于未知数量的参数,调用它的次数未知。你知道吗

如果需要发送list参数,do_add函数可能如下所示:

def do_add(int_list):
    total = 0
    for num in int_list:
        total += 0
    return total

l1 = [1, 2, 3, 4, ... n]    # memory loaded with n int objects
do_add(l1)

l2 = [10, 20, ... n]
do_add(l2)

首先,您正在加载内存和一个额外的列表对象,这个列表对象仅仅是为了函数调用而创建的。其次,如果您必须向列表中添加更多的项,我们可能需要调用另一个列表方法,例如append或extend。你知道吗

但是如果遵循*args方法,就可以避免创建额外的列表,而只关注函数调用。如果需要添加更多的参数,只需添加另一个用逗号分隔的参数,而不需要调用append或extend方法。你知道吗

假设您想用1000参数调用这个函数n次。它将导致每次创建n * 1000个新的列表对象。但是使用可变参数方法,您可以直接调用它。你知道吗

do_add(1, 2, 3)            # call 1
do_add(10.0, 20.0, 30.0)   # call 2
...
do_add(x, y, z, ..., m)    # call n

第一个函数接受:

function('hello', 'I', 'am', 'a', 'function')

第二个不会。第二个你需要:

function('hello', ['I', 'am', 'a', 'function'])

原则上,第一个参数是在函数可以有任意数量的参数时使用的(想想:print),而第二个参数指定总是有第二个参数,它是一个iterable(不一定是一个列表,不管名称如何)

当您必须在第一级函数中只提取一些(或没有)参数,然后在不知道细节的情况下将其他参数传递给其他内部函数时,传递*args非常有用。e、 g

def inner_func(x, y, z, *args, **kwargs):
    # do something with x, y, and z
    return output

def outer_func(a, b, *args, **kwargs):
    # do something with a and b
    # pass the rest arguments to inner function without caring about details
    output = inner_func(*args, **kwargs)

    # do something with output
    return 

相关问题 更多 >