반복되는 코드를 묶어서 하나의 기능을 수행한다.
→ 반복 사용이 가능하고 코드의 가독성이 높아진다.
반드시 인풋과 아웃풋이 있다. input은 parameter
라 하고, output은 return 값
이다.
return 값이 없으면 None을 반환한다.
코드의 재사용성을 높이고 중복을 최소화한다.
절차적 분해 - 절차에 따라 혹은 기능에 따라 분해하여 테스트하기가 편하다.
def 문으로 정의하고, 함수명()으로 호출한다.
def 문을 만나면 해당 함수명을 네임스페이스에 저장해둔다.
-> ‘id(함수명)’으로 숫자주소를 볼 수 있다. ex) 변수도 마찬가지이다.
Global (전역) : 가장 바깥쪽
Local (지역)
함수 안에 위치한 변수 → 함수 외부에서 내부 변수 접근 불가하다.
하지만, 함수 내부에서 외부 변수로 접근은 가능하다.
-> 내부에 있는지 확인 후 없으면 점점 외부로 확인한다.(non-local 혹은 global)
Shadowing 효과 : 변수명이 같을때, 좁은 scope 변수가 넓은 scope의 변수를 가려버리는 것
함수는 객체이기 때문에 변수에 할당이 가능하다.
함수 내에서 변수를 찾을때 LEGB 규칙에 따라 찾는다.
LEGB 규칙
Local → Enclosure → Global → Built-in
함수는 input parameter
를 받아서 return
값을 output으로 리턴한다.
Positional arguments (위치 인수)
→ 입력된 인자의 순서는 parameter의 순서대로 전달된다.
→ 입력 인자의 순서가 바뀌어도 파악이 어려운 단점이 있다.
parameter 순서에 맞추지 않고 값을 전달할 수 있다.
함수를 호출할때 parameter 이름과 함께 값을 전달하는 방식이다.
func(parameter2 = value2, parameter1 = value1)
어떤 parameter에 어떤 argument가 입력되는지 명확히 알 수 있다.
default value를 정해두면 입력값이 없어도 함수 호출이 가능하다.
함수를 정의할때 parameter에 값을 지정한다.
def func(param1, param2 = default_value):
parameter2
가 다른 값으로 입력되어도 작동된다.
default 값이 있으면 non-default argument보다 뒤에 와야한다.
그렇지 않으면, SyntaxError: non-default argument follows default argument
가 발생한다.
def func(a=1,b,c):
print(a)
print(b)
print(c)
func(2,3)
# SyntaxError: non-default argument follows default argument
→ 첫번째 인수 2가 a 파라미터로 들어가서 초기값을 바꿔야하는지, b에 들어가야 하는지 알 수 없기 때문이다.
*args
파라미터로 표현한다.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)
#`TypeError: func_param_with_var_args() missing1 required keyword-only argument: 'age'`
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
에러가 발생한다.
→ *args
파라미터는 여러개의 인수를 받을 수 있기 때문에 age
파라미터의 값을 무엇으로 할지 알 수 없다.
→ 해결 : age=20
처럼 키워드를 이용해 age
파라미터의 값을 명시해서 입력해야한다. 아니면 *args
파라미터를 가장 끝으로 보내고 20
을 두번째 인수로 입력한다.
**kwargs
파라미터로 표현한다.# 에러발생
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")
위 예시는 SyntaxError: invalid syntax
에러 발생
age
와 address
를 앞으로 옮기면? address
가 여러 값을 받는다.
TypeError: mixed_params() got multiple values for argument 'address'
address
파라미터는 키워드로 인수를 입력하는 keyword-only argument
이다.
## 수정본
def mixed_params(age, name="아이유", *args, address, **kwargs):
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")
# name=정우성
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul
kwargs
에 딕셔너리 형태로 입력된다.위 예시에서 디폴트 값
"아이유"
가 나오게 하려면?
func(param1, param2, param3=default_value, *args, key=value, **kwargs)
위치 인수 - 디폴트 인수 - 가변 위치 인수 - 키워드 인수 - 가변 키워드 인수
Regular Positional args. : 인수 순서를 지키는 기본 형태
Default args. : 파라미터에 초기값이 설정되어 있는 경우
Variable length positional args. : 여러개의 위치 인수를 입력하는 경우 *args
keyword-only args. : 인수에 키워드를 지정해서 입력하는 경우
Variable length keyword args. : 파라미터에 없는 키워드로 값을 입력하는 경우 **kwargs