[python] 가변 개수의 인수를 함수에 전달할 수 있습니까?

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)

보시다시피, 파이썬은 모든 인수와 함께 단일 튜플로 인수를 압축 해제 합니다.

키워드 인수 의 경우 Skurmedel의 답변에 표시된대로 키워드 인수를 별도의 실제 인수로 수락해야합니다 .


답변

소식을 추가하면 게시물이 해제됩니다.

여러 키-값 인수를 보낼 수도 있습니다.

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이어야하고 그 순서대로 호출되어야합니다.


답변

내가 할 수 있다면 Skurmedel의 코드는 파이썬 2 용입니다. 파이썬 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


답변

다른 우수한 게시물에 추가합니다.

때때로 당신은 인수의 수를 지정하지 않으 그들을 위해 키를 (사전에 전달 된 하나 개의 인수는 방법에 사용하지 않는 경우 컴파일러가 불평) 사용하려고합니다.

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

이것은 사전을 통해 변수 인수를 전달하는 것만 큼 좋습니다.


답변

이미 언급 한 좋은 답변 외에도 다른 방법으로 위치에 따라 선택적 명명 된 인수를 전달할 수 있다는 사실에 달려 있습니다. 예를 들어

def f(x,y=None):
    print(x)
    if y is not None:
        print(y)

수확량

In [11]: f(1,2)
1
2

In [12]: f(1)
1


답변