함수
관련내용
- 함수(Function): 함수의 정의
- 전역변수와 지역변수
- 함수: 인수의 전달
- 가변인수
- 재귀함수(Recursive Function)
- Python의 함수는 1급(First Class)객체
- 1급 객체와 변수의 영역
- 클로저(Closure)
- 람다함수(Lambda Function)
- 주요한 내장함수들
- 데코레이터(Decorator, 장식자)
가변인수
*인수와 **인수
- 함수(Function): 함수의 정의
- 전역변수와 지역변수
- 함수: 인수의 전달
- 가변인수
- 재귀함수(Recursive Function)
- Python의 함수는 1급(First Class)객체
- 1급 객체와 변수의 영역
- 클로저(Closure)
- 람다함수(Lambda Function)
- 주요한 내장함수들
- 데코레이터(Decorator, 장식자)
가변인수
*인수와 **인수
파이썬에서 'Asterisk(*)
' 연산자는 곱셈 뿐만 아니라 지정된 아이템 외에 나머지를 할당하기 위해 사용하며 가변 연산자(*)라고 합니다.
a, b, *rest=range(9) a, b
(0, 1)
rest
[2, 3, 4, 5, 6, 7, 8]
*head, a,b=range(10) head, a, b
([0, 1, 2, 3, 4, 5, 6, 7], 8, 9)
다음 코드는 3개의 객체에 2개만이 할당됩니다. 그러므로 가변 연산자로 연결된 객체 *rest는 받을 값이 없으므로 빈리스트(empty list)가 됩니다.
a, b, *rest=range(2) a, b, rest
(0, 1, [])
식 1에서 나타낸 것과 같이 함수에 전달할 인수의 수가 고정되지 않은 경우 가변연산자(*)와 인수를 연결하여 사용할 수 있으며 가변 인수라고 합니다.
def 함수이름(*인수) | (식 1) |
⇒ 실행: 함수이름(인수값1, 인수값2, …) |
1개 이상의 인수값들을 전달하기 위해 리스트, 튜플과 같은 콜렉션 형태를 사용할 수 있습니다. 가변인자 역시 같은 역할을 하며 인수전달 유형을 고정하지 않기 때문에 보다 유연한 적용이 가능합니다. 다음 사용자 정의한 함수 order()에 전달하는 인수 poduct에 리스트 객체를 전달할 수 있습니다. 이 경우는 인수전달시 리스트 유형을 명시하여야 합니다.
def order(order, num=1, product="coffee"): print(f"주문번호: {order}, 테이블번호: {num}, 품목:{product}")
order(1, 2, ["스파게티", "돈까스", "피자", "커피", "콜라"])
주문번호: 1, 테이블번호: 2, 품목:['스파게티', '돈까스', '피자', '커피', '콜라']
함수 생성시 가변인수를 지정하는 것으로 위 함수와 같은 효과를 나타낼 수 있습니다. 그러나 가변인수의 형식으로 전달할 경우 각 인수값은 리터럴입니다.
def order(order, num, *product): prod=[] for i in product: prod.append(i) print(f"주문번호: {order}, 테이블번호: {num}, 품목:{prod}")
order(2, 10, "스파게티", "돈까스", "피자", "커피", "콜라")
주문번호: 2, 테이블번호: 10, 품목:['스파게티', '돈까스', '피자', '커피', '콜라']
위의 가변인자는 각 인수의 값만을 전달합니다. 그러나 전달하는 인수의 이름을 명확히 하기 위해서는 "인수이름 = 인수값"의 형태를 취해야 하는 경우도 존재합니다. 이 경우 연산자 "**"와 인수를 연결한 키워드 가변인자(keyword variable argument)를 사용합니다(식 2).
def 함수이름(**인수) | (식 2) |
⇒ 실행: 함수이름(인수1=값1, 인수2=값2, …) |
def order(**food): print(f"테이블 번호 {food['num']}에 {food['name']}")
order(num=2, name="돈까스")
테이블 번호 2에 돈까스
order(num=[2,3], name=['돈까스', '커피'])
테이블 번호 [2, 3]에 ['돈까스', '커피']
객체의 언패킹(unpacking)
가변연산자(*)는 길이가 정해지지 않은 인수 값을 전달하기 위해 사용할 뿐만 아니라 리스트, 튜플과 같은 객체의 각 요소를 호출하기 위해 사용할 수 있습니다. 예를 들어 다음 코드의 리스트 객체 x의 요소는 가변 연산자를 사용하여 각 요소를 출력할 수 있습니다. 이 과정은 밀집된 데이터 유형에서 내용을 개별적으로 푸는 것으로 언팩킹(unpacking)이라 합니다.
x=[1, 2, 3, 4, 5] print(*x)
1 2 3 4 5
가변 연산자를 사용한 언팩킹은 함수의 인수 전달과정에서 적용할 수 있습니다. 예를 들어 다음 함수는 3개의 리터럴 숫자들을 전달하여 리스트 형태로 출력하기 위한 함수입니다.
def printList(x, y, z): print(f'[{x},{y},{z}]') printList(0, 1, 0)
[0,1,0]
다음 코드와 같이 3개 요소로 구성된 튜플 객체를 printList() 함수에 적용하기 위해 가변 연산자에 의해 언패킹을 사용할 수 있습니다.
ls=(0,1,0) printList(*ls)
[0,1,0]
'*' 연산자는 시퀀스 객체를 요소 단위로 분해할 수 있는 것과 같이 '**' 연산자(키워드 가변인수)를 사용하여 사전(dictionary) 객체에서 값(value)를 추출할 수 있습니다.
dic={'y':0, 'x':1, 'z':1} printList(**dic)
[1,0,1]
사전은 순서가 지정되지 않기 때문에 사전 키(key)를 기반으로 사전 값과 함수 인수를 일치시킵니다. x 인수는 사전의 'x' 키와 관련된 값을 받습니다. 단일 별표(*) 연산자를 사용하여 사전의 압축을 풀면 key가 원시자료에 입력된 순서대로 함수에 전달됩니다.
printList(*dic)
[y,x,z]
댓글
댓글 쓰기