Hodustory/프로그래밍&DB

파이썬(Python) 입문 : 고정값 인수와 입력값 인수 / default & keywords Arguments

호두밥 2018. 3. 26. 14:14

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!')
이 예시는 in을 설명하는 예시 이기도 합니다. in은 연속 값에 특정 값이 있는지 없는지를 판단합니다.

고정 값은 함수가 정의되는 지점에서 평가됩니다. 그래서 아래의 예시는 5를 출력합니다. 
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가지 정도의 인수를 더 소개해드릴 것 같네요! ㅎㅎㅎ

그럼 다음에 또 뵙겠습니다.

반응형