CまたはC ++でvarargsを使用するのと同様の方法で:
fn(a, b)
fn(a, b, c, d, ...)
CまたはC ++でvarargsを使用するのと同様の方法で:
fn(a, b)
fn(a, b, c, d, ...)
回答:
はい。キーワード以外の引数*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の回答に示されているように、それらを個別の実際の引数として受け入れる必要があります。
manyArgs(x = 3)失敗しTypeErrorます。スクメデルの答えはこれに対する解決策を示しています。重要な点は、関数の一般的なシグネチャはf(*list_args, **keyword_args)(ではないf(*list_args))であることです。
argsですtuple。キーワードargsをkwargs意味します。タイプはです。kwargsdictionary
for arg in args:渡された引数を反復するためだけ
巻き戻し投稿に追加:
複数のKey-Value引数を送信することもできます。
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
そして、あなたは2つを混合することができます:
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であり、その順序で呼び出す必要があります。
print aしてprint(a)、そしてkwargs.iteritems():持ちますkwargs.items()。
もしそうなら、Skurmedelのコードはpython 2用です。これをpython 3に適合させるには、に変更iteritemsしitemsてかっこをに追加しますprint。これは、私のような初心者がぶつかるのを防ぐことができます:
AttributeError: 'dict' object has no attribute 'iteritems'そして、これが起こっている理由を他の場所で検索します(たとえば、NetworkXのwrite_shp()を使用しようとすると、エラー「「dict」オブジェクトには属性「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
他の優れた投稿に追加します。
引数の数を指定したくない場合や、それらのキーを使用したい場合があります(辞書で渡された1つの引数がメソッドで使用されていない場合、コンパイラーは文句を言います)。
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
その後、次のようなことができます
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'})
____________
上記のコードが出力されます
None None None
20 None 30
20 red 30
これは、ディクショナリを使用して変数引数を渡すのと同じです。
f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')