1. 함수
1.1 함수란?
- 반복되는 코드를 묶음으로 효율적인 코드를 작성하도록 해주는 기능
- 기본 함수
- 파라미터와 아규먼트
- 리턴
*args, **kwargs
- docstring
- scope
- inner funcion
- lambda function
- map, filter, reduce
- decorator
2. 기본 함수
2.1 기본 함수란?
- 함수의 선언과 호출
2.2 코드 생성
1
2
3
4
5
6
7
8
9
10
point = 88
if point >= 90:
print('A')
elif point >= 80:
print('B')
else :
print('C')
1
B
- 함수를 사용하지 않으면 매번 이렇게 작성한 코드를 실행시켜야 한다.
2.3 함수 만들기
1
2
3
4
5
6
7
8
9
10
def grade(point):
if point >= 90:
print('A')
elif point >= 80:
print('B')
else :
print('C')
1
grade(90)
1
A
- 위에서 작성한 코드를 함수로 만들어 만들었다.
- 함수는 def 함수명(파라미터) 로 생성한다.
3. 파라미터와 아규먼트
3.1 파라미터와 아규먼트란?
- 파라미터 : 함수를 선언할때 호출하는 부분에서 보내주는 데이터를 받는 함수
- 아규먼트 : 함수를 호출할때 함수에 보내주는 데이터
3.1.1 파라미터
1
2
3
# 파라미터
def plus(num1, num2):
print(num1 + num2)
- num1과 num2과 파라미터 이다
3.1.2 아규먼트
1
2
# 아규먼트
plus(1, 2)
1
3
- plus 함수에서 1과 2를 아규먼트라고 한다
3.2 아규먼트와 함수가 다르다면
1
2
# 아규먼트를 함수와 다르게 보내주면 에러뜸
plus(1, 2, 3)
1
2
3
4
5
6
7
8
9
10
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-c1a4c39a8c98> in <module>
1 # 아규먼트를 함수와 다르게 보내주면 에러뜸
----> 2 plus(1, 2, 3)
TypeError: plus() takes 2 positional arguments but 3 were given
- 만일 아규먼트를 정해진 파라미터에 맞지않게 보낸다면 에러가 남
3.3 디폴트 파라미터
1
2
3
4
5
6
# num2 = 디폴트 파라미터
def plus(num1, num2 = 10):
print(num1 + num2)
# 디폴트 파라미터는 자동으로 10이 들어감
plus(3)
1
13
- 함수 생성시 기본으로 파라미터 값을 설정해 놓는것을 디폴트 파라미터라고 함.
- 위에서는 num2 = 10 이 기본값으로 설정되어있으며, 함수를 실행할떄 num1값만 넣으면 자동으로 됨
1
2
def plus(num1, num2 = 10, num3 = 20):
print(num1 + num2 - num3)
1
plus(10)
1
0
1
plus(10, num3 = 100)
1
-80
- 디폴트 파라미터에 num =10, num3 =20을 넣은 코드
- 디폴트 파라미터 위치 혹은 인자값을 적고 다른 값을 넣는다면 디폴트 파라미터보다 우선시 된다.
- num3 = 100으로 넣은것
4. 리턴
4.1 리턴이란
- 함수를 실행한 결과를 저장하고 싶을때 사용
- return
1
2
def plus(num1, num2):
print(num1 + num2)
1
2
result = plus(1, 2)
print(result)
1
2
3
None
- print는 결과를 저장하지 않고 출력만 함
- result에 저장이 되지 않아 result에는 아무것도 없는 None이 반환됨
1
2
3
def plus(num1, num2):
print(num1 + num2)
return num1 + num2
1
2
result = plus(1,5)
print(result)
1
2
6
6
- 만일 다른 변수에 저장을 위해선 return을 사용하여 반환시켜줘야 함
4.2 다른 변수에 저장되는 함수
1
2
3
data1 = 'python'
result = data1.upper()
result
1
'PYTHON'
- upper는 함수내에 return값을 설정해 놓아 자동으로 저장이 된다.
4.3 다른 변수에 저장이 안되는 함수
1
2
3
4
data2 = [2, 1, 3]
result = data2.sort()
print(result)
print(data2)
1
2
None
[1, 2, 3]
- sort는 함수에 return이 없어서 다른 변수로 저장이 안되어 result는 None값이 반환됨
- 대신 data2 자체가 sort되어 있음 [1, 2, 3]
1
2
3
4
5
6
7
8
# 함수 선언
def grade(point):
if point >= 90:
return "A"
elif point >= 80:
return "B"
else :
return "C"
1
grade(80)
1
'B'
4.4 함수에서의 return의 성질
1
2
3
4
def echo(mgs):
if mgs == 'quit':
return print('종료 합니다')
print(mgs)
1
echo('안녕하세요')
1
안녕하세요
1
echo('quit')
1
종료 합니다
- 함수에서 return 코드가 실행되면 함수는 종료된다.
5. *args, **kwargs
5.1 *args, **kwargs
란?
- 함수를 호출할때 아규먼트와 키워드 아규먼트의 갯수를 특정지을수 없을때 사용
5.2 *args
예제
1
2
def plus(num1, num2):
return num1 + num2
1
plus(1, 2)
1
3
- 만일 파라미터를 2개로 지정하고, 아규먼트도 2개만 받을수 있다
1
2
3
def plus(*args):
print(type(args), args)
return sum(args)
1
plus(1, 2, 3, 4, 5)
1
2
<class 'tuple'> (1, 2, 3, 4, 5)
15
*args
를 사용하면 아규먼트가 몇개가 들어와도 상관없다
5.3 **kwargs 예제
1
2
3
4
5
6
# 키워드 있는건 **kwargs를 사용하여야함, type은 dict
def plus(*args, **kwargs):
print(type(args), args)
print(type(kwargs), kwargs)
# 키워드가 있는 건 dict로 가져오기 때문에 따로 sum을 해줌
return sum(args) + sum(list(kwargs.values()))
1
plus(1, 2, 3, 4, 5, num1 = 100)
1
2
3
<class 'tuple'> (1, 2, 3, 4, 5)
<class 'dict'> {'num1': 100}
115
- **kwargs는 num1 = 100처럼 키워드를 넣는 아규먼트에 사용가능
- **kwargs는 있는 건 함수내에서 dict로 인식이 됨
5.4 List 데이터의 함수 적용(*args)
1
2
3
4
5
def func(num1, num2, num3):
return num1 + num2 + num3
data = [1, 2, 3]
func(*data)
1
6
- list를
*args
로 사용한것 - 함수(*ListData)를 하면 *data = func(1,2,3)으로 봄
- func(data) # data = func([1,2,3,])리스트 데이터로 인식하여 error가뜸
5.5 Dict 데이터의 함수 적용(**kwargs)
1
2
3
4
5
data = {
"num2" : 100,
"num3" : 200,
}
func(1,**data) # ** 두개를 붙여서 각 키워드로 인식시킴
1
301
- dict를
**kwargs
로 사용한것 - 함수(*DictData)를 하면 *data = func(num1 = 1, num2 = 100, num3 = 200)으로 봄
- func(data) # data = func([1,2,3,])리스트 데이터로 인식하여 error가뜸