본문 바로가기
wecode/TIL 정리

위코드 Pre Course - 파이썬의 인수(Argument)

by 왕거 2020. 7. 21.

파이썬에서 사용되는 인수에 대해서 정리하고 과제를 수행한다.

 

기본 인수(Positional Argument)

  • 기본적인 사용방법으로 정의한 순서에 맞게 인수를 입력하는 방법
def basic_Arg(name, age):
	print(name)
    print(age)

basic_Arg("왕민욱", 27) #"왕민욱" 문자열이 name으로, 27이 age로 할당된다.

키워드 인수(Keyword Argument)

  • 함수를 호출할 때 어떤 인수에 데이터를 할당할 지 명시해주는 방법
def keyword_Arg(name, age):
	print(name)
    print(age)

keyword_Arg(name="왕민욱", age=27)
keyword_Arg(age=27, name="왕민욱")	#두 호출 모두 정상적으로 작동한다.

가변 인수(Variable Argument)

  • 얼마나 되는 수의 인수를 받게 될지 알 수 없는 함수를 설계할 때 적용하는 방법
  • 가변인수를 사용하면 호출 때마다 다른 수의 인수를 사용해도 문제없이 처리 가능하다.
  • 가변인수는 인수를 정할 때 가장 마지막에 위치해야 한다.
    • 중간에 넣으면 가변 인수 뒤에 있는 인수들에 값이 전달되지 않아서 문법 에러 발생함!
    • 중간에 넣게되면 뒤에 위치한 인수들은 키워드를 꼭 사용해야 한다.
def variable_Index_Arg(data, *args):
	print(data, args)

variable_Index_Arg(1, 1,2,3,4,5)
variable_Index_Arg(2, 1,2,3)
variable_Index_Arg(3, 1,2,3,4,5,6,7)	#문제없이 입력된 값을 모두 출력할 수 있다.

 

 

default value parameter를 non-default value parameter 앞에 정의하면 안되는 이유

  • default value parameter를 사용하면 인수에 값이 전달되지 않아도 기본적으로 할당된 데이터를 사용하게 되어 있으나 이를 앞부분에 위치시키게 되면 뒤쪽으로 이동한 non-default parameter에 값이 할당되지 않는 상황이 생길 가능성이 있다.
  • 따라서 이런 위험의 발생 가능성을 없애기 위해서 문법 체크 레벨에서 에러로 판단하는 것 같다.
def default_Arg_Exmp(name, age = 27):
	print(name, age)
    
default_Arg_Exmp("왕민욱", 27)		
default_Arg_Exmp("왕민욱")			#두 경우 전부 문제없이 작동한다.

def default_Arg_Exmp(name="왕민욱", age):
	print(name, age)
    
default_Arg_Exmp("왕민욱", 27)		#이 경우는 문제없음
default_Arg_Exmp("왕민욱")	#default value parameter로 지정됐지만 
				#어쨋든 name 인수에는 "왕민욱" 데이터가 입력되고, 
                                #age 인수에는 값이 입력되지 않았기 때문에 문법 에러 발생

 

Assignment. 2 함수 수정 및 에러 파악  -  위치 인수와 가변 인수

def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)


func_param_with_var_args("정우성", "01012341234", "seoul", 20)

#이 코드의 에러가 무엇인지 확인하고 작동하도록 수정하기

#수정본
def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)


func_param_with_var_args("정우성", "01012341234", "seoul", age = 20)	#age 인수로 입력할 데이터라는 걸 명시

#실행 결과
#name=정우성
#args=('01012341234', 'seoul')
#age=20
  • 에러의 원인은 가변 인수 뒤에 선언된 인수에 값이 전달되지 않아서 생긴 에러였다.
  • 키워드를 지정해주어서 해결함

Assignment. 3 함수 수정 및 에러 파악  -  가변 키워드 인수

def func_param_with_kwargs(name, age, **kwargs, address=0):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)


func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
#함수 정의부의 address를 가리키며 문법 에러라고 알린다.

#수정 후
def func_param_with_kwargs(name, age, address=0, **kwargs):	#address와 kwargs의 위치를 바꿨다.
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)


func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")

#실행 결과
#name=정우성
#age=20
#kwargs={'mobile': '01012341234'}
#address=seoul
  • 문제는 positional과 keyword 인수의 관계 때문이었다.
  • 가변 키워드 인수는 임의 개수의 keyword 인수를 받겠다는 의미인데, positional 인수보다 뒤에 위치하여야 한다는 규칙이 적용된다.
  • 그렇다면 가변인수는?
    • 가변인수는 임의 개수의 positional 인수를 받겠다는 의미, tuple 자료형에 저장함
    • 가변 키워드 인수는 임의 개수의 keyword 인수를 받겠다는 의미, dict 자료형에 저장함

Assignment. 4 함수 수정 및 에러 파악  -  위치 인수와 가변 키워드 인수

def mixed_params(name="아이유", *args, age, **kwargs, address):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)


mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
#함수 정의부의 **kwargs를 가리키며 문법 에러라고 알림

#수정 후
def mixed_params(age, address, name="아이유", *args, **kwargs):	#참고한 파이썬 argument order를 참고
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)


mixed_params(20, "seoul", "정우성", "01012341234", "male", mobile="01012341234")  #마지막에 있던 address를 positional에 맞게 이동

#실행 결과
#name=정우성
#args=('01012341234', 'male')
#age=20
#kwargs={'mobile': '01012341234'}
#address=seoul
  • 함수의 인수에는 정렬 기준이 존재한다.
    • def func( 위치 인수 - 디폴트 값을 지정한 인수 - 가변 길이 인수 - 무조건 키워드를 사용하는 인수 - 가변 길이 키워드 인수) 순서로 정렬 기준이 있다.

https://getkt.com/blog/python-keyword-only-arguments/