0%

함수

함수

반복되는 코드를 묶음으로 효율적인 코드를 작성하도록 해주는 기능입니다.

함수의 선언과 호출

함수의 선언

1
2
3
4
5
6
7
def grade(point):    
if point >= 90:
print('A')
elif point >= 80:
print('B')
else :
print('C')
함수의 호출
1
2
3
grade(88)

# B

파라미터와 아규먼트

파라미터 : 함수를 선언할때 호출하는 부분에서 보내주는 데이터를 받는 변수

1
2
3
def plus(num1,num2,num3=5): 
#디폴트 파라미터 (= 파라미터 값이 안들어 오면 디폴트로 10을 넣어라)
print(num1+num2-num3)
아규먼트 : 함수를 호출할때 함수에 보내주는 데이터
1
plus(2,2,num3=15) #키워드 아규먼트 (=호출할때 값을 지정)

리턴

함수를 실행한 결과를 저장하고 싶을때 사용합니다.

1
2
3
4
5
6
7
8
9
def plus(num1,num2):
print(num1 + num2)
return num1 + num2 #함수를 실행한 결과를 저장하고 싶을때 사용

result = plus(1,2)
print(result)

# 3
# 3

*args,**kwargs

함수를 호출할때 아규먼트와 키워드 아규먼트의 갯수를 특정지을수 없을때 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
def minus(*args,**kwargs):
print(type(args),args)
print(type(kwargs),kwargs)
return list(args) + list(kwargs.values())


minus("a","b","c",디="d",이="e")
# <class 'tuple'> ('a', 'b', 'c')
# <class 'dict'> {'디': 'd', '이': 'e'}

# ['a', 'b', 'c', 'd', 'e']
> *args는 아규먼트를 튜플로 저장 > **kwargs 는 dict로 저장(키=밸류 형태로 저장)

Docstring

함수의 설명을 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
def echo(msg):
"""
echo func return its input argument
The opertation is :
1. print msg
2. return msg parameter
param : msg : str
return : str
"""
print(msg)
return msg
> 주피터 노트북에서 echo?매직 명령어로 함수의 설명을 볼수 있습니다. > print(echo.__doc__)로도 설명을 볼수 있습니다.

Scope 범위

함수 안에서 선언되는 변수와 함수 밖에서 선언되는 변수의 범위가 다릅니다. > lobal(전역),local(지역)

1
2
3
4
5
6
7
8
9
# global
gv = 10

def echo():
print(gv)

echo()

#10
1
2
3
4
5
6
7
8
9
10
11
12
#local

def echo():
global gv
gv = 100
print(gv)

echo()
gv

# 100
# 100

Inner Function

함수가 지역영역에서 선언됩니다. 함수안에 함수가 선언되는 개념입니다.

1
2
3
4
5
6
7
8
9
10
11
12
def outer(a,b):

def inner(c,d): #2.실행
return c + d

return inner(a,b) #1.inner(a,b)를 호출 # 3.결과값 보내줌


# 실행
outer(1,2)

# 3

callback function : 함수를 아규먼트, 파라미터로 설정해서 사용

1
2
3
4
5
6
7
8
9
10
11
12
def calc(func,a,b):
# code
a **= 2
b **= 2
return func(a,b)
# plus,1,2 라는 변수들을 받아서 각각 func,a,b에 대입, a랑 b제곱 해주고 그 값을 리턴 부분에 func(a,b)에 대입후 실행

def plus(a,b):
return a+b

calc(plus,1,2)
# 5

map, filter, reduce

map : 순서가 있는 데이터 집합에서 모든 값에 함수를 적용시킨 결과 map(func,*args(iterable 데이터 : list,tuple))

1
2
3
4
5
6
7
8
9
10
ls = range(1,10)

def odd_even_test(num):
return "홀수" if num % 2 else "짝수"

print(odd_even_test(4))
# 짝수

print(list(map(odd_even_test,ls)))
# ['홀수', '짝수', '홀수', '짝수', '홀수', '짝수', '홀수', '짝수', '홀수']
filter : 리스트 데이터에서 특정 조건에 맞는 value만 남기는 함수 filter(True,False만 리턴받는 함수, iternable 데이터 하나만)
1
2
3
4
5
6
7
8
# 1~10까지 홀수만 출력

# filter는 리스트 데이터에서 특정 조건에 맞는(=즉 % 2해서 True를 만족하는 데이터들)것만 남기는 함수
# "filter는 True나 False 만 리턴 받는 함수"
datas = range(10)
list(filter(lambda data: True if data % 2 else False ,datas))

# [1, 3, 5, 7, 9]
reduce : 리스트 데이터를 처음부터 순서대로 특정 함수를 실행하여 결과를 누적시켜 주는 함수
1
2
3
4
5
from functools import reduce
ls = [3,1,2,4,5]
reduce(lambda x,y: x+y,ls)

# 15

Decorator

함수에서 코드를 바꾸지 않고 기능을 추가하거나 수정하고 싶을때 사용하는 문법입니다.

데코레이터 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# a
def plus(a,b):
print("start")
result = a + b
print("result : {}".format(result))
return result
# b
def minus(a,b):
print("start")
result = a - b
print("result : {}".format(result))
return result

# decorator
def disp(func):
def wrapper(*args,**kwargs):
print("start")
result = func(*args,**kwargs)
print("result : {}".format(result))
return result
return wrapper
데코레이터 적용
1
2
3
4
5
6
7
8
9
10
# a 데코레이터 쓰면 disp가 리턴하는 함수로 바뀐다
@disp
def plus(a,b):
result = a + b #code_2
return result

plus(1,2)
# start
# result : 3
# 3