可以向函数传递可变数量的参数吗?

2024-10-03 13:28:20 发布

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

类似于在C或C++中使用VARARGS的方法:

fn(a, b)
fn(a, b, c, d, ...)

Tags: 方法fnvarargs
3条回答

如果可以的话,Skurmedel的代码是针对python 2的;要使其适应python 3,请将iteritems更改为items,并在print中添加括号。这可以防止像我这样的初学者碰到: AttributeError: 'dict' object has no attribute 'iteritems'并在其他地方搜索(例如Error “ 'dict' object has no attribute 'iteritems' ” when trying to use NetworkX's write_shp())为什么会发生这种情况。

def myfunc(**kwargs):
for k,v in kwargs.items():
   print("%s = %s" % (k, v))

myfunc(abc=123, efh=456)
# abc = 123
# efh = 456

以及:

def myfunc2(*args, **kwargs):
   for a in args:
       print(a)
   for k,v in kwargs.items():
       print("%s = %s" % (k, v))

myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123

添加到展开后:

您也可以发送多个键值参数。

def myfunc(**kwargs):
    # kwargs is a dictionary.
    for k,v in kwargs.iteritems():
         print "%s = %s" % (k, v)

myfunc(abc=123, efh=456)
# abc = 123
# efh = 456

你可以把两者混合起来:

def myfunc2(*args, **kwargs):
   for a in args:
       print a
   for k,v in kwargs.iteritems():
       print "%s = %s" % (k, v)

myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123

它们必须按此顺序声明和调用,即函数签名必须是*args,**kwargs,并按此顺序调用。

是的。

这很简单,如果忽略关键字参数则有效:

def manyArgs(*arg):
  print "I was called with", len(arg), "arguments:", arg

>>> manyArgs(1)
I was called with 1 arguments: (1,)
>>> manyArgs(1, 2, 3)
I was called with 3 arguments: (1, 2, 3)

如您所见,Python将给您一个包含所有参数的元组。

对于关键字参数,您需要将它们作为单独的实际参数接受,如Skurmedel's answer所示。

相关问题 更多 >