파이썬에서 사용되는 인수에 대해서 정리하고 과제를 수행한다.
기본 인수(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( 위치 인수 - 디폴트 값을 지정한 인수 - 가변 길이 인수 - 무조건 키워드를 사용하는 인수 - 가변 길이 키워드 인수) 순서로 정렬 기준이 있다.
'wecode > TIL 정리' 카테고리의 다른 글
위코드 Pre Course - 절대경로와 상대경로 (1) (0) | 2020.07.22 |
---|---|
위코드 Pre Course - Python 1 (0) | 2020.07.21 |
위코드 Pre Cource - Semantic Web과 Tag (0) | 2020.07.21 |
위코드 Pre Course - HTML/CSS 2 (0) | 2020.07.21 |
위코드 Pre Course - HTML/CSS 1 (0) | 2020.07.20 |