튜플을 인수로 확장


411

파이썬 튜플을 함수로 확장하는 방법이 있습니까?

예를 들어, 여기 expand()마술이 있습니다.

some_tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(some_tuple)) # (2, "foobar", "barfoo")

나는 하나가 정의 할 수 있습니다 알고 myfunmyfun((a, b, c))하지만, 물론 레거시 코드가있을 수 있습니다. 감사

답변:


734

myfun(*some_tuple)요청한 내용을 정확하게 수행합니다. *오퍼레이터는 단순히 튜플 (또는 반복 가능한)를 풀어서 함수의 인수 위치로 전달한다. 인수 풀기 에 대해 자세히 알아보십시오 .


8
* 연산자는 단순히 튜플의 압축을 풀고 위치 인수로 함수에 전달합니다. 자세한 내용은 여기를 참조하십시오 : docs.python.org/3/tutorial/…
john_mc

4
튜플뿐만 아니라 목록에도 동일한 구문을 사용할 수 있습니다.
brendon-ai

변경 사항이 어떻게 영향을 미치는지 확실하지 않은 목록 (실제로 문자열을 포함한 반복 가능)으로 동일한 작업을 수행 할 수 있음을 발견했습니다. 살펴보면 흥미로울 것입니다.
wcyn

52

인수 목록의 일부를 확장 할 수도 있습니다.

myfun(1, *("foo", "bar"))

13
확장 된 튜플이 정상적으로 제공되는 인수 뒤에있는 경우에만이 작업을 수행 할 수있는 것으로 보입니다. 통역사는이 작업을 수행 할 때이를 좋아하지 않습니다.some_func(*tuple_of_stuff, another_argument)
Tom Galvin

6
@Quackmatic 어떤 위치에서 확장 된 튜플을 갖는 것은 파이썬 3.5.1에서 잘 작동 보인다

1
@Quackmatic seconding @River, 이것은 Python 3.5.4에서 잘 작동합니다. def func(a,b,c,d): print(a,b,c,d)withargs = ('fee', 'fi', 'fo'); func(*args, 'fum')
R. Navega

15

파이썬 튜토리얼 섹션 4.7.3 및 4.7.4를 살펴보십시오 . 튜플을 인수로 전달하는 방법에 대해 설명합니다.

또한 튜플을 사용하고 시퀀스를 전달하는 대신 명명 된 매개 변수를 사용하고 사전을 전달하는 것을 고려할 것입니다. 위치가 직관적이지 않거나 여러 매개 변수가있을 때 위치 인수를 사용하는 것이 나쁜 습관이라는 것을 알았습니다.


8

이것이 함수형 프로그래밍 방법입니다. 구문 설탕에서 튜플 확장 기능을 해제합니다.

apply_tuple = lambda f, t: f(*t)

사용법 예 :

from toolz import * 
from operator import add, eq

apply_tuple = curry(apply_tuple)

thread_last(
    [(1,2), (3,4)],
    (map, apply_tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'

카레 재정의는 apply_tuple장기적으로 많은 partial통화 를 저장 합니다.


5
초보자에게는 도움이되지 않습니다. 그것은 ... 타사 모듈을 사용하고 다른 혼란 물건을 수행
gberger

gberger lambda f, t: f(*t)는 타사 모듈을 사용하지 않으며 Python 초보자이며 이것이 도움이됩니다. 이것은 순수한 기능적 접근입니다. 이 스타일을 사용하지 않으면이 답변이 적합하지 않습니다.
Dominykas Mostauskis

1
toolz는 제 3 자입니다. 제가 의미하는 바는
gberger

5
모든 답변이 초보자를위한 것은 아닙니다
Jordan

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.