More Defining Functions
다양한 인수를 통해 함수를 정의하는 것이 가능합니다. 여기 함께 쓸 수 있는 3가지 형식이 있습니다.
1. 고정값 인수
하나 이상의 인수에 고정값을 지정하는 것으로 가장 유용합니다. 함수에 보다 적은 인수를 지정할 수 있게 해줍니다.
def ask_ok(prompt, retries=4, reminder='Please try again!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise ValueError('invalid user response')
print(reminder)
이 함수는 몇가지 방법으로 호출됩니다.
- 필수 인수만 입력 : ask_ok('Do you really want to quit?')
- 선택 인수 1개 + 필수 인수 : ask_ok('OK to overwrite the file?', 2)
- 모든 인수 : ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
i = 5
def f(arg=i):
print(arg)
i = 6
f()
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
[1] [1, 2] [1, 2, 3]
연속된 호출 사이에 고정값을 공유하고 싶지 않다면, 아래와 같이 해주면 됩니다.
def f(a, L=None):
if L is None:
L=[]
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
[1] [2] [3]
2. 키워드 인수
함수는 또한 a=value형태의 키워드 인수를 이용합니다. 필수 인수는 score이고 선택 인수는 state, action, type 입니다.
def 점수(score, state='상태', action='다트', type='회원'):
print('오늘은', action, end=' ')
print("오늘은", score, "입니다")
print('오늘은', type)
print('오늘은', state, '!')
점수(1000)
점수(score=1000)
점수(score=1000, action='골프')
점수(action='골프', score=1000)
점수('1000', '나이스데이','야구', 'vip' )
점수('1000', state='나이스데이')
그러나 아래와 같이 입력하면 값이 나오지 않습니다.
점수() #필수 인수 없음.
점수(score=1.0, '우울') #'우울'이 어떤 인수인지 정의되지 못함
점수('우울', score=1.0) #score에 여러개의 값이 입력.
점수(person='호두') #정의되지 않은 인수.
함수가 호출될 때, 키워드 인수는 반드시 위치 인수를 따릅니다. 모든 입력된 키워드 인수는 함수에서 정의된 인수 중 하나에 부합해야 합니다. (person은 점수 함수에 정의된 인수가 아닙니다.) 그리고 인수의 순서도 중요합니다. 이것은 선택적이지 않은 인수도 포함됩니다.
인수는 두 번 이상 값을 받을 수 없습니다.
def function(a):
pass
function(0,a=0)
Traceback (most recent call last):
File "C:/Python/study.py", line 3, in <module>
function(0,a=0)
TypeError: function() got multiple values for argument 'a'
**name 형태의 형식 매개변수는 일치하는 매개변수를 제외한 키워드 인수를 포함하는 딕셔너리로 받습니다. 이는 형식매개변수 리스트 이외의 위치 인수를 포함한 튜플을 받는 *name 형태의 공식 매개변수와 결합됩니다. (*name은 **name 이전에 발생합니다.)
형식 매개함수는 연속된 같은 형태의 인수를 인식합니다. 아래의 함수 호출문에서 "문장"은 argument 인수로 키워드 인수='값'은 keywords로 인식된 것을 확인할 수 있습니다.
def cheeseshop(kind, *arguments, **keywords):
print("-- Do you have any", kind, "?")
print("-- I'm sorry, we're all out of", kind)
for arg in arguments:
print(arg)
print("-" * 40)
for kw in keywords:
print(kw, ":", keywords[kw])
다음과 같이 호출합니다.
cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
sketch="Cheese Shop Sketch")
결과는 아래와 같이 나옵니다.
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch
키워드 인수가 출력되는 순서는 함수 호출에서 제공된 순서와 일치하도록 보장됩니다.
----------------------------------
안녕하세요. 호두입니다.
이번엔 함수에서 중요한 인수 중 디폴트(default) / 고정값 인수와 keywords/키워드/입력값 인수에 대해 알아보았습니다.
앞으로도 4가지 정도의 인수를 더 소개해드릴 것 같네요! ㅎㅎㅎ
그럼 다음에 또 뵙겠습니다.