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

425 投票
6 回答
468849 浏览
提问于 2025-04-15 11:53

就像在C或C++中使用可变参数一样:

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

6 个回答

28

如果可以的话,Skurmedel的代码是为Python 2写的;要把它改成Python 3,只需要把iteritems改成items,并在print后面加上括号。这样可以避免像我这样的初学者遇到这个错误:AttributeError: 'dict' object has no attribute 'iteritems',然后到处找原因(比如在这个链接中:当尝试使用NetworkX的write_shp()时出现错误“ 'dict' object has no attribute 'iteritems' ”)为什么会发生这种情况。

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
260

补充一下关于“unwinds”的内容:

你可以同时发送多个键值对参数。

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,并且调用的时候也要按照这个顺序。

541

没错,你可以使用 *args 来接收一些不带名字的参数。这样的话,你就可以传入任意数量的参数。

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 的回答

撰写回答