코딩도장_Unit 30. 함수에서 위치 인수와 키워드 인수 사용하기
위치 인수(positional argument) : 함수에 인수를 순서대로 넣는 방식으로 인수의 위치가 정해져 있다.
위치 인수와 리스트 언패킹
>>> print(10, 20, 30) # 10, 20, 30 순으로 넣었으므로 10 20 30으로 출력
10 20 30
# 숫자 세 개를 각 줄에 출력하는 함수
>>> def print_numbers(a, b, c):
print(a)
print(b)
print(c)
>>> print_numbers(10, 20, 30)
10
20
30
리스트의 언패킹
인수를 순서대로 넣을 때는 리스트나 튜플을 사용할 수도 있다. 리스트나 튜플 앞에 *(에스터리스크)를 붙이면 언패킹(unpacking)되어 print_numbers(10, 20, 30)
과 같은 동작이 된다.
- 함수(*리스트)
- 함수(*튜플)
>>> def print_numbers(a, b, c):
print(a)
print(b)
print(c)
>>> x = [10, 20, 30]
>>> print_numbers(*x) # *(에스터리스크) 리스트나 튜플 앞에 붙임
10 # 숫자가 각 줄에 출력
20
30
리스트 변수 대신 리스트 앞에 바로 *를 붙여도 동작은 같다. 단, 이때 함수의 매개변수 개수와 리스트의 요소 개수는 같아야 한다. (다를경우 에러 발생)
>>> def print_numbers(a, b, c):
print(a)
print(b)
print(c)
>>> print_numbers(*[10, 20, 30])
10
20
30
# 변수 개수와 리스트의 요소 개수가 다른 경우
> print_numbers(*[10, 20])
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
print_numbers(*[10, 20])
TypeError: print_numbers() missing 1 required positional argument: 'c'
가변 인수 함수 만들기
위치 인수와 리스트 언패킹은 인수의 개수가 정해지지 않은 가변 인수(variable argument)에 사용한다. 즉, 같은 함수에 인수 한 개를 넣을 수도 있고, 열 개를 넣을 수도 있다. 또는, 인수를 넣지 않을 수도 있다.
가변 인수 함수는 매개변수 앞에 *를 붙여서 만든다.
def 함수이름(*매개변수):
코드
>>> def print_numbers(*args): # 함수 매개변수 앞에 *
for arg in args: # 매개변수 이름은 관례적으로 arguments를 줄여 args로 사용
print(arg)
>>> print_numbers(10) # 1개 넣으면 1개 출력
10
>>> print_numbers(10, 20, 30, 40) # 4개 넣으면 4개 출력
10
20
30
40
리스트나 튜플 앞에 *(에스터리스크)를 붙이면 언패킹(unpacking)된다.
>>> def print_numbers(*args):
for arg in args:
print(arg)
>>> x = [10]
>>> print_numbers(*x)
10
>>> y = [10, 20, 30, 40]
>>> print_numbers(*y)
10
20
30
40
📎 참고) 고정 인수와 가변 인수를 함께 사용하기
고정 인수와 가변 인수를 함께 사용할 때는 고정 매개변수를 먼저 지정하고, 그 다음 매개변수에 *를 붙여주면 된다. 이때 가변 매개변수가 고정 매개변수보다 앞 쪽에 오면 안된다. (가변 매개변수는 반드시 가장 뒤 쪽으로)>> def print_numbers(a, *args): # 가변 매개변수가 맨 뒤로 print(a) print(args) >> print_numbers(1) 1 () >> print_numbers(1, 10, 20) 1 (10, 20) >> print_numbers(*[10, 20, 30]) 10 (20, 30)
키워드 인수 사용하기
보통 함수의 사용 방법을 익힐 때 인수의 순서와 용도를 함께 외운다.
>>> def personal_info(name, age, address):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
# 첫 번째 인수에 이름(name), 두 번째 인수에 나이( age), 세 번째 인수에 주소(address)를 넣어야 한는 것을 알 수 있다.
>>> personal_info('홍길동', 30, '서울시 용산구 이촌동')
이름: 홍길동
나이: 30
주소: 서울시 용산구 이촌동
파이썬에서는 인수의 순서와 용도를 매번 기억하지 않도록 키워드 인수(keyword argument)라는 기능을 제공한다.
키워드 인수는 인수에 이름(키워드)을 붙이는 기능인데 키워드=값 형식으로 사용한다.
>>> def personal_info(name, age, address):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
>>> personal_info(name='홍길동', age=30, address='서울시 용산구 이촌동')
이름: 홍길동
나이: 30
주소: 서울시 용산구 이촌동
# 키워드 인수 사용 시 인수의 순서를 맞추지 않아도 키워드에 해당하는 값이 들어감
>>> personal_info(age=30, address='서울시 용산구 이촌동', name='홍길동')
이름: 홍길동
나이: 30
주소: 서울시 용산구 이촌동
키워드 인수와 딕셔너리 언패킹 사용하기
딕셔너리 언패킹을 사용해 키워드 인수로 값을 넣을 수 있다.
- 함수(**딕셔너리)
>>> def personal_info(name, age, address):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
# 딕셔너리의 키(키워드)는 반드시 문자열 형태
>>> x = {'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}
>>> personal_info(**x) # 앞에 **를 붙여서 함수에 넣기
이름: 홍길동
나이: 30
주소: 서울시 용산구 이촌동
딕셔너리 언패킹 사용 시 함수의 매개변수 이름과 딕셔너리의 키 이름과 개수가 같아야 한다. 이름, 개수가 다른 경우 에러가 발생
>>> def personal_info(name, age, address):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
# 다른 이름
>>> personal_info(**{'name': '홍길동', 'old': 30, 'address':'서울시 용산구 이촌동'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: personal_info() got an unexpected keyword argument 'old'
# 다른 개수
>>> personal_info(**{'name': '홍길동', 'age': 30})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: personal_info() missing 1 required positional argument: 'address'
**를 두 번 사용하는 이유
딕셔너리는 키-값 쌍 형태로 값이 저장되어 있기 때문이다.
>>> def personal_info(name, age, address):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
>>> x = {'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}
>>> personal_info(*x) # # * 를 한 번만 사용
이름: name
나이: age
주소: address # 키가 출력됨 (딕셔너리 한 번 언패킹 = 키 사용)
키워드 인수를 사용하는 가변 인수 함수 만들기
키워드 인수를 사용하는 가변 인수 함수는 매개변수 앞에 **를 붙여서 만든다.
def 함수이름(**매개변수):
코드
# 인수를 직접 넣어 함수 호출
# 매개변수 이름은 관례적으로 keyword arguments를 줄여서 kwargs로 사용
>>> def personal_info(**kwargs): # 매개변수 앞 **
for kw, arg in kwargs.items():
print(kw, ': ', arg, sep='')
>>> personal_info(name='홍길동')
name: 홍길동
>>> personal_info(name='홍길동', age=30, address='서울시 용산구 이촌동')
name: 홍길동
age: 30
address: 서울시 용산구 이촌동
# 딕셔너리 언패킹 사용해 함수 호출
>>> x = {'name': '홍길동'}
>>> personal_info(**x)
name: 홍길동
>>> y = {'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}
>>> personal_info(**y)
name: 홍길동
age: 30
address: 서울시 용산구 이촌동
보통 **kwargs
가변인수 함수는 함수 안에서 특정 키가 있는지 확인 후 만든다.
def personal_info(**kwargs):
if 'name' in kwargs: # in으로 딕셔너리 안에 특정 키가 있는지 확인
print('이름: ', kwargs['name'])
if 'age' in kwargs:
print('나이: ', kwargs['age'])
if 'address' in kwargs:
print('주소: ', kwargs['address'])
📎 참고) 고정 인수와 가변 인수(키워드 인수)를 함께 사용하기
고정 인수와 가변 인수(키워드 인수)를 함께 사용할 때는 고정 매개변수를 먼저 지정하고, 그 다음 매개변수에 **를 붙여준다. 이때 가변 매개변수가 고정 매개변수보다 앞 쪽에 오면 안된다. (가변 매개변수는 반드시 가장 뒤 쪽으로)>> def personal_info(name, **kwargs): print(name) print(kwargs) >> personal_info('홍길동') 홍길동 {} >> personal_info('홍길동', age=30, address='서울시 용산구 이촌동') 홍길동 {'age': 30, 'address': '서울시 용산구 이촌동'} >> personal_info(**{'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}) 홍길동 {'age': 30, 'address': '서울시 용산구 이촌동'}
📎 참고) 위치 인수와 키워드 인수를 함께 사용하기🔎
함수에서 위치 인수를 받는 *args와 키워드 인수를 받는 **kwargs를 함께 사용할 수도 있다. 대표적인 함수가sep
,end
등을 키워드 인수로 넣는다.>> def custom_print(*args, **kwargs): print(*args, **kwargs) >> custom_print(1, 2, 3, sep=':', end='') 1:2:3 # **kwargs가 *args보다 앞쪽에 오면 안 된다. # 매개변수 순서 : 고정 매개변수, *args, **kwargs
매개변수에 초깃값 지정하기
함수의 매개변수에 초깃값을 지정하면 인수를 생략할 수 있다.
def 함수이름(매개변수=값):
코드
매개변수의 초깃값은 주로 사용하는 값이 있으면서 가끔 다른 값을 사용해야 할 때 활용한다.
예) print
함수의 sep
의 초깃값은 공백, 가끔 다른 값을 넣어서 사용
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
# 함수에서 address의 초깃값을 '비공개'로 지정
>>> def personal_info(name, age, address='비공개'):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
# address 부분 비워두고 호출 가능
>>> personal_info('홍길동', 30)
이름: 홍길동
나이: 30
주소: 비공개
# 초깃값이 지정되어 있더라도 값을 넣으면 해당 값 전달
>>> personal_info('홍길동', 30, '서울시 용산구 이촌동')
이름: 홍길동
나이: 30
주소: 서울시 용산구 이촌동
초깃값이 지정된 매개변수의 위치
매개변수의 초깃값을 지정할 때 주의할 점이 초깃값이 지정된 매개변수 다음에는 초깃값이 없는 매개변수가 올 수 없다.
>>> def personal_info(name, address='비공개', age):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
# personal_info('홍길동', 30)로 함수 호출 시 30의 위치가 명확하지 않음
# 초깃값이 지정된 매개변수는 마지막에 몰아주면 된다.
def personal_info(name, age, address='비공개'):
def personal_info(name, age=0, address='비공개'):
def personal_info(name='비공개', age=0, address='비공개'):
# 모든 매개변수에 초깃값을 지정하면 인수를 넣지 않고 함수 호출 가능
Author And Source
이 문제에 관하여(코딩도장_Unit 30. 함수에서 위치 인수와 키워드 인수 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mjk3136/코딩도장Unit-30.-함수에서-위치-인수와-키워드-인수-사용하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)