De manière similaire à l'utilisation de varargs en C ou C ++:
fn(a, b)
fn(a, b, c, d, ...)
De manière similaire à l'utilisation de varargs en C ou C ++:
fn(a, b)
fn(a, b, c, d, ...)
Réponses:
Oui. Vous pouvez utiliser *args
comme argument non mot-clé . Vous pourrez alors passer n'importe quel nombre d'arguments.
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)
Comme vous pouvez le voir, Python décompresse les arguments en un seul tuple avec tous les arguments.
Pour les arguments de mots clés, vous devez les accepter comme un argument réel distinct, comme indiqué dans la réponse de Skurmedel .
manyArgs(x = 3)
échoue avec TypeError
. La réponse de Skumedel montre la solution à cela. Le point clé est que la signature générale d'une fonction est f(*list_args, **keyword_args)
(pas f(*list_args)
).
args
est tuple
. kwargs
signifie args mot-clé . Le type de kwargs
est dictionary
.
for arg in args:
pour l'itération des
Ajout au déroulement de la publication:
Vous pouvez également envoyer plusieurs arguments de valeur-clé.
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
Et vous pouvez mélanger les deux:
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
Ils doivent être à la fois déclarés et appelés dans cet ordre, c'est-à-dire que la signature de fonction doit être * args, ** kwargs et appelée dans cet ordre.
print a
avec print(a)
et kwargs.iteritems():
avec kwargs.items()
.
Si je peux me permettre, le code de Skurmedel est pour python 2; pour l' adapter à python 3, le changement iteritems
de items
et ajouter entre parenthèses à print
. Cela pourrait empêcher des débutants comme moi de tomber sur:
AttributeError: 'dict' object has no attribute 'iteritems'
et de chercher ailleurs (par exemple, l' erreur «l'objet« dict »n'a pas d'attribut« iteritems »» en essayant d'utiliser write_shp () de NetworkX pourquoi cela se produit.
def myfunc(**kwargs):
for k,v in kwargs.items():
print("%s = %s" % (k, v))
myfunc(abc=123, efh=456)
# abc = 123
# efh = 456
et:
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
Ajout aux autres excellents messages.
Parfois, vous ne voulez pas spécifier le nombre d'arguments et souhaitez utiliser des clés pour eux (le compilateur se plaindra si un argument passé dans un dictionnaire n'est pas utilisé dans la méthode).
def manyArgs1(args):
print args.a, args.b #note args.c is not used here
def manyArgs2(args):
print args.c #note args.b and .c are not used here
class Args: pass
args = Args()
args.a = 1
args.b = 2
args.c = 3
manyArgs1(args) #outputs 1 2
manyArgs2(args) #outputs 3
Ensuite, vous pouvez faire des choses comme
myfuns = [manyArgs1, manyArgs2]
for fun in myfuns:
fun(args)
def f(dic):
if 'a' in dic:
print dic['a'],
pass
else: print 'None',
if 'b' in dic:
print dic['b'],
pass
else: print 'None',
if 'c' in dic:
print dic['c'],
pass
else: print 'None',
print
pass
f({})
f({'a':20,
'c':30})
f({'a':20,
'c':30,
'b':'red'})
____________
le code ci-dessus sortira
None None None
20 None 30
20 red 30
Cela revient à passer des arguments variables au moyen d'un dictionnaire
f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
Une autre façon de procéder, outre les bonnes réponses déjà mentionnées, dépend du fait que vous pouvez passer des arguments nommés facultatifs par position. Par exemple,
def f(x,y=None):
print(x)
if y is not None:
print(y)
Rendements
In [11]: f(1,2)
1
2
In [12]: f(1)
1