可以向函数传递可变数量的参数吗?
就像在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 的回答。