source

아스타리스크*는 Python에서 무엇을 의미합니까?

manysource 2023. 1. 27. 21:22

아스타리스크*는 Python에서 무엇을 의미합니까?

*는 Python에서 C와 같이 특별한 의미가 있습니까?Python Cookbook에서 다음과 같은 기능을 보았습니다.

def get(self, *a, **kw)

설명을 해주시거나 답변을 찾을 수 있는 곳을 가르쳐 주세요(Google은 *를 와일드카드 문자로 해석하기 때문에 만족스러운 답변을 찾을 수 없습니다).

언어 참조의 기능 정의를 참조하십시오.

폼이*identifier이 존재하면 과도한 위치 파라미터를 수신하는 태플로 초기화되며 디폴트로는 빈 태플이 됩니다.폼이**identifier이 존재하면 초과 키워드 인수를 수신하는 새로운 딕셔너리로 초기화되어 새로운 빈 딕셔너리로 기본 설정됩니다.

또, 「함수 호출」도 참조해 주세요.

positional 인수와 키워드 인수가 무엇인지 알고 있다고 가정하면 다음과 같은 예를 제시하겠습니다.

예 1:

# Excess keyword argument (python 2) example:
def foo(a, b, c, **args):
    print "a = %s" % (a,)
    print "b = %s" % (b,)
    print "c = %s" % (c,)
    print args

foo(a="testa", d="excess", c="testc", b="testb", k="another_excess")

위의 예에서 볼 수 있듯이 파라미터만 있습니다.a, b, c의 서명으로서foo기능.부터d그리고.k존재하지 않으며 args 딕셔너리에 저장됩니다.프로그램의 출력은 다음과 같습니다.

a = testa
b = testb
c = testc
{'k': 'another_excess', 'd': 'excess'}

예 2:

# Excess positional argument (python 2) example:
def foo(a, b, c, *args):
    print "a = %s" % (a,)
    print "b = %s" % (b,)
    print "c = %s" % (c,)
    print args

foo("testa", "testb", "testc", "excess", "another_excess")

여기서, 우리는 위치 논쟁을 테스트하고 있기 때문에, 초과된 논쟁은 끝에 있어야 합니다.*args이 프로그램의 출력은 다음과 같습니다.

a = testa
b = testb
c = testc
('excess', 'another_excess')

사전 또는 태플을 함수의 인수에 언팩할 수도 있습니다.

def foo(a,b,c,**args):
    print "a=%s" % (a,)
    print "b=%s" % (b,)
    print "c=%s" % (c,)
    print "args=%s" % (args,)

argdict = dict(a="testa", b="testb", c="testc", excessarg="string")
foo(**argdict)

인쇄:

a=testa
b=testb
c=testc
args={'excessarg': 'string'}

그리고.

def foo(a,b,c,*args):
    print "a=%s" % (a,)
    print "b=%s" % (b,)
    print "c=%s" % (c,)
    print "args=%s" % (args,)

argtuple = ("testa","testb","testc","excess")
foo(*argtuple)

인쇄:

a=testa
b=testb
c=testc
args=('excess',)

다른 답변에서 명확하지 않은 단 한 가지 추가 사항이 있습니다(완전성을 위해).

함수를 호출할 때도 별을 사용할 수 있습니다.예를 들어 다음과 같은 코드가 있다고 가정합니다.

>>> def foo(*args):
...     print(args)
...
>>> l = [1,2,3,4,5]

이렇게 목록을 foo로 넘기면...

>>> foo(*l)
(1, 2, 3, 4, 5)

사전에도 같은 작업을 수행할 수 있습니다.

>>> def foo(**argd):
...     print(argd)
...
>>> d = {'a' : 'b', 'c' : 'd'}
>>> foo(**d)
{'a': 'b', 'c': 'd'}

위의 답변은 모두 명확하고 완전했습니다만, 참고로 Python의 *와 **의 의미는 C의 유사 연산자의 의미와는 전혀 유사하지 않습니다.

이들은 argument-unpacking 연산자 및 키워드 인수-unpacking 연산자라고 불립니다.

별이 하나면 변수 'a'가 함수에 공급된 추가 파라미터의 튜플이 된다는 것을 의미합니다.이중 별은 변수 'kw'가 키워드와 함께 제공된 추가 매개 변수의 가변 크기 사전임을 의미합니다.

실제 행동은 명확하지만, 여전히 매우 직관적이지 않을 수 있습니다.일부 샘플 함수를 작성하고 다양한 파라미터 스타일로 호출하면 허용되는 항목과 결과를 이해하는 데 도움이 될 수 있습니다.

def f0(a)
def f1(*a)
def f2(**a)
def f3(*a, **b)
etc...

*는 다른 콜백 함수를 파라미터로 사용하는 함수를 쓸 때 유용합니다.

def some_function(parm1, parm2, callback, *callback_args):
    a = 1
    b = 2
    ...
    callback(a, b, *callback_args)
    ...

이렇게 하면 발신자는 콜백 함수에 전달되는 임의의 추가 파라미터를 전달할 수 있습니다.좋은 점은 콜백 함수가 일반 함수 파라미터를 사용할 수 있다는 것입니다.즉, * 구문을 사용할 필요가 없습니다.다음은 예를 제시하겠습니다.

def my_callback_function(a, b, x, y, z):
    ...

x = 5
y = 6
z = 7

some_function('parm1', 'parm2', my_callback_function, x, y, z)

물론 클로저를 사용하면 x, y, z를 some_function()을 통해 my_callback_function()에 전달할 필요가 없습니다.

언급URL : https://stackoverflow.com/questions/400739/what-does-asterisk-mean-in-python