[python] 함수 호출에서 스타 연산자는 무엇을 의미합니까?

또는 *같은 코드에서와 같이 Python 에서 연산자는 무엇을 의미 합니까?zip(*x)f(**k)

  1. 인터프리터에서 내부적으로 어떻게 처리됩니까?
  2. 성능에 전혀 영향을 미칩니 까? 빠르거나 느린가요?
  3. 언제 유용하고 유용하지 않습니까?
  4. 함수 선언이나 호출에 사용해야합니까?



답변

단일 별 *은 시퀀스 / 컬렉션을 위치 인수로 압축 해제하므로 다음과 같이 할 수 있습니다.

def sum(a, b):
    return a + b

values = (1, 2)

s = sum(*values)

이것은 실제로 다음과 같이 실행되도록 튜플을 압축 해제합니다.

s = sum(1, 2)

이중 별표 **는 딕셔너리와 명명 된 인수 만 사용하여 동일합니다.

values = { 'a': 1, 'b': 2 }
s = sum(**values)

다음을 결합 할 수도 있습니다.

def sum(a, b, c, d):
    return a + b + c + d

values1 = (1, 2)
values2 = { 'c': 10, 'd': 15 }
s = sum(*values1, **values2)

다음과 같이 실행됩니다.

s = sum(1, 2, c=10, d=15)

또한 섹션 4.7.4- Python 문서의 인수 목록 압축 해제를 참조하십시오 .


또한 취할 함수 *x**y인수 를 정의 할 수 있습니다 . 이렇게하면 함수가 선언에 구체적으로 이름이 지정되지 않은 위치 및 / 또는 명명 된 인수를 얼마든지받을 수 있습니다.

예:

def sum(*values):
    s = 0
    for v in values:
        s = s + v
    return s

s = sum(1, 2, 3, 4, 5)

또는 **:

def get_a(**values):
    return values['a']

s = get_a(a=1, b=2)      # returns 1

이를 통해 선언 할 필요없이 많은 수의 선택적 매개 변수를 지정할 수 있습니다.

또한 다음을 결합 할 수 있습니다.

def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if "neg" in options:
        if options["neg"]:
            s = -s
    return s

s = sum(1, 2, 3, 4, 5)            # returns 15
s = sum(1, 2, 3, 4, 5, neg=True)  # returns -15
s = sum(1, 2, 3, 4, 5, neg=False) # returns 15


답변

한 가지 작은 요점은 운영자가 아닙니다. 연산자는 표현식에서 기존 값에서 새 값을 만드는 데 사용됩니다 (예 : 1 + 2는 3이됩니다. 여기에서 * 및 **는 함수 선언 및 호출 구문의 일부입니다.


답변

함수 호출을 ‘저장’하고 싶을 때 특히 유용합니다.

예를 들어 ‘add’함수에 대한 단위 테스트가 있다고 가정합니다.

def add(a, b): return a + b
tests = { (1,4):5, (0, 0):0, (-1, 3):3 }
for test, result in tests.items():
   print 'test: adding', test, '==', result, '---', add(*test) == result

추악한 add (test [0], test [1])와 같은 작업을 수동으로 수행하는 것 외에는 add를 호출하는 다른 방법이 없습니다. 또한 변수 수가 가변적이면 필요한 모든 if 문으로 코드가 매우 추악해질 수 있습니다.

이것이 유용한 또 다른 장소는 Factory 객체 (객체를 생성하는 객체)를 정의하는 것입니다. Car 객체를 만들고 반환하는 Factory 클래스가 있다고 가정합니다. myFactory.make_car ( ‘red’, ‘bmw’, ‘335ix’)가 Car ( ‘red’, ‘bmw’, ‘335ix’)를 생성 한 다음 반환하도록 만들 수 있습니다.

def make_car(*args):
   return Car(*args)

이것은 슈퍼 클래스의 생성자를 호출 할 때도 유용합니다.


답변

이를 확장 호출 구문이라고합니다. 로부터 문서 :

구문 * expression이 함수 호출에 나타나면 expression은 시퀀스로 평가되어야합니다. 이 시퀀스의 요소는 추가 위치 인수 인 것처럼 처리됩니다. 위치 인수 x1, …, xN이 있고 expression이 시퀀스 y1, …, yM으로 평가되는 경우 이는 M + N 위치 인수 x1, …, xN, y1,을 사용하는 호출과 동일합니다. .., yM.

과:

** expression 구문이 함수 호출에 나타나면 expression은 매핑으로 평가되어야하며 그 내용은 추가 키워드 인수로 처리됩니다. 표현식과 명시 적 키워드 인수로 모두 나타나는 키워드의 경우 TypeError 예외가 발생합니다.


답변

함수 호출에서 하나의 별 (예 : 별도의 인수로 목록을 변 zip(*x)과 동일한 zip(x1,x2,x3)경우 x=[x1,x2,x3]예 () 및 이중 별 별도의 키워드 인수에 사전을 회전 f(**k)과 동일 f(x=my_x, y=my_y)경우 k = {'x':my_x, 'y':my_y}.

함수 정의에서는 그 반대입니다. 단일 별표는 임의 개수의 인수를 목록으로 변환하고 이중 시작은 임의 개수의 키워드 인수를 사전으로 변환합니다. 예 def foo(*x)수단 “foo는 인수의 임의의 수를 소요하고 그들이 목록 X를 통해 액세스 할 수 있습니다 (즉, 사용자 호출하는 경우 foo(1,2,3), x될 것 [1,2,3])”및 def bar(**k)수단 “바는 키워드 인자의 임의의 수를 소요하고는 사전 K를 통해 액세스 할 수 있습니다 (사용자가 호출하는 경우 즉 bar(x=42, y=23), k될 것이다 {'x': 42, 'y': 23}“).


답변