Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中函数的动态输入数_Python - Fatal编程技术网

python中函数的动态输入数

python中函数的动态输入数,python,Python,使用*args和获取一个列表作为函数动态输入的区别是什么 这两种方法与其他方法相比有什么优势吗?这只是函数所期望的参数类型不同而已。它们是相当可互换的;您选择哪一个主要取决于偏好(尽管请参见答案末尾的例外情况) 鉴于以下定义: # Separate arguments def foo(*args): pass # Single sequence of arguments def bar(list_of_args): pass x = [1, 2, 3] 这两个调用是等效的:

使用
*args
和获取一个列表作为函数动态输入的区别是什么


这两种方法与其他方法相比有什么优势吗?

这只是函数所期望的参数类型不同而已。它们是相当可互换的;您选择哪一个主要取决于偏好(尽管请参见答案末尾的例外情况)

鉴于以下定义:

# Separate arguments
def foo(*args):
    pass

# Single sequence of arguments
def bar(list_of_args):
    pass

x = [1, 2, 3]
这两个调用是等效的:

foo(1, 2, 3)
foo(*x)      # Unpack a list before calling
bar(x)
bar([1, 2, 3])  # Explicitly pack individual arguments
这两个调用是等价的:

foo(1, 2, 3)
foo(*x)      # Unpack a list before calling
bar(x)
bar([1, 2, 3])  # Explicitly pack individual arguments

您在问题中提到了
**args
。参数的名称并不重要;特殊行为由以一个或两个
*
s开头的参数名称表示。一个
*
表示任意位置参数,如上所示。两个
*
s表示任意关键字参数。按照惯例,两个最常见的名称是
*args
**kwargs

一个与上述类似的简要示例:

# Arbitrary keyword arguments
def foo(**kwargs):
    pass

# Single dict d
def bar(d):
    pass

d = {'a': 1, 'b': 2}

# Equivalent
foo(*d)
foo(a=1, b=2)

# Equivalent
bar(d)
bar(dict(a=1, b=2))

例外情况:如果函数实际希望改变某个值,则不能用
*
/
**
参数有效地替换该值。例如:

def foo(**kwargs):
    kwargs['foo'] = 3
这会将
'foo'
到3的映射添加到字典中,但它只是为调用
foo
而创建的临时字典。函数之外的任何内容都没有对该字典的引用,因此在
foo
返回后,更新不会产生任何效果

类似的逻辑也适用于
*args
,但由于
args
是一个元组,并且元组是不可变的,因此您几乎无法处理参数。也就是说,如果函数确实需要一个列表,而不仅仅是一个任意的参数序列,那么必须定义函数来处理它

def foo(some_list):    # can't use *args here
    some_list.append(3)
你不能有效地将其定义为

def foo(*args):
    args.append(3)

因为
foo
接收的是一个临时元组,而不是一个列表对象,

这只是函数期望的参数类型的不同。它们是相当可互换的;您选择哪一个主要取决于偏好(尽管请参见答案末尾的例外情况)

鉴于以下定义:

# Separate arguments
def foo(*args):
    pass

# Single sequence of arguments
def bar(list_of_args):
    pass

x = [1, 2, 3]
这两个调用是等效的:

foo(1, 2, 3)
foo(*x)      # Unpack a list before calling
bar(x)
bar([1, 2, 3])  # Explicitly pack individual arguments
这两个调用是等价的:

foo(1, 2, 3)
foo(*x)      # Unpack a list before calling
bar(x)
bar([1, 2, 3])  # Explicitly pack individual arguments

您在问题中提到了
**args
。参数的名称并不重要;特殊行为由以一个或两个
*
s开头的参数名称表示。一个
*
表示任意位置参数,如上所示。两个
*
s表示任意关键字参数。按照惯例,两个最常见的名称是
*args
**kwargs

一个与上述类似的简要示例:

# Arbitrary keyword arguments
def foo(**kwargs):
    pass

# Single dict d
def bar(d):
    pass

d = {'a': 1, 'b': 2}

# Equivalent
foo(*d)
foo(a=1, b=2)

# Equivalent
bar(d)
bar(dict(a=1, b=2))

例外情况:如果函数实际希望改变某个值,则不能用
*
/
**
参数有效地替换该值。例如:

def foo(**kwargs):
    kwargs['foo'] = 3
这会将
'foo'
到3的映射添加到字典中,但它只是为调用
foo
而创建的临时字典。函数之外的任何内容都没有对该字典的引用,因此在
foo
返回后,更新不会产生任何效果

类似的逻辑也适用于
*args
,但由于
args
是一个元组,并且元组是不可变的,因此您几乎无法处理参数。也就是说,如果函数确实需要一个列表,而不仅仅是一个任意的参数序列,那么必须定义函数来处理它

def foo(some_list):    # can't use *args here
    some_list.append(3)
你不能有效地将其定义为

def foo(*args):
    args.append(3)

因为
foo
接收一个临时元组,而不是一个具有N个参数的列表对象,一个具有N个项目的列表。您的意思是
*args
?@Rahul是您的权利。我更正了一个参数有N个,另一个参数是N个项目的列表。你的意思是
*args
?@Rahul是的,你的权利。我纠正了它。这两种方法与另一种相比有什么优势吗?(请查看问题的更新)不,这几乎是一个偏好问题。通常,您会选择与函数预期用途相匹配的方法。请在评论中使用您当前的声明更新您的答案。与其他方法相比,这两种方法是否有任何优势?(请查看问题的更新)不,这几乎是一个偏好问题。通常,您会选择与函数预期用途相匹配的选项。请在评论中用您当前的声明更新您的答案。