함수를 왜 사용할까?
Decomposition
- 기능을 분해하고 재사용 할 수 있게 한다.
Abstraction ( 추상화 )
- 재사용성과 가독성, 생상성을 높여준다.
함수 ( Function )
사용자 함수
ex) def function (parameter ):
#codeblock
return returning_value
함수를 사용해야 하는 이유
'''
세제곱을 만드는 함수cube 만들기
2의 세제곱과, 100의 세제곱 반환
'''
def cube(x):
#이때 x의 자료형은 int형
return x**3
print(cube(2),cube(100))
#case2
# def cube1(num):
# result=num**3
# return result
>>> 8 1000000
값에 따른 함수의 종류
Void function
Value returning function
#Void function
print('hello python')
>>> hello python
#Value returning function
float(3.14)
>>> 3.14
'''
print 와 float의 차이?
print는 return이 없음
float는 return이 있음
'''
a = print('hello')
b = float('3.5')
print(a,b)
>>> None 3.5
'''
return은 함수 안에서만 사용되는 키워드
printsms 출력을 위해 사용되는 함수
'''
두개 이상의 값을 반환하는 방법
def haha(x,y):
return x - y , x * y
print(haha(2,3))
>>> (-1, 6)
'''
가로,세로 길이를 입력 받아 넓이와 둘레 출력
'''
def rec(width,height):
area=width*height
round_rec=(width+height)*2
return area,round_rec
print(rec(2,4))
def add(x,y):
return x+y
print(add(1,2)) # x=1 ; y=2 Positional Argument
print(add(y=3,x=1)) #x=1 ; y=2 Keyword Argument
print(add(x=1,2)) #ERROR
print(add(1,y=2)) #동작, 위치를 지정..키워드
#처음부터 키워드로 쓰거나, 위치로 쓰다가 키워드로 써야한다.
def add(x,y=4):
return x+y
print(add(2))
>>> 6
*args
def add(*args):
print(args,type(args))
return args
# for arg in args:
print(add(2,3,4))
>>>
(2, 3, 4) <class 'tuple'>
(2, 3, 4)
입력 받는 args의 type은 'tuple'
Key와 Value의 타입으로 묶고 싶은 경우 ( dict() ) =>kwargs**
def family(**kwargs):
print(kwargs,type(kwargs))
return kwargs
family(father='이종현',mother='김수정')
>>>
{'father': '이종현', 'mother': '김수정'} <class 'dict'>
def family(**kwargs):
#kwargs=> dict()타입이기 때문에 kwargs.items()로 리스트 변경하여 사용 해야함
for key,value in kwargs.items():
print(key,":",value)
return kwargs
family(father='이종현',mother='김수정')
keyword argument 의 타입은 'dict'
keyword argument 다음에 positional argument는 사용할 수 없음!!
코드 내부에 local scope를 생성,
그 외 공간인 global scope로 구분
scope
global scope: 코드 어디에서든 참조 가능
local scope : 함수 내부에서만 참조 가능
def ham():
a='spam'
return a
print(a) #NameError : 'a' is not defined
print(ham())
Local -> Enclosed -> Global -> Bulit-in
#case1
a=10
def func1():
#global 을 통해 a의 값을 변경 시켜 줄 수 있음
global a
a=3
print(a)
func1()
print(a)
>>>
10
3
#case2
a=10
def func1():
#global a
a=3
print(a)
func1()
print(a)
>>>
10
10
global 변수는 사용하기 전에 먼저 선언 해줘야 한다.
func1() 안에 a는 func1()이 종료되면 같이 사람진다
따라서 case2는 둘다 a의 값이 10으로 나옴.
#split() input으로 받은 str을 스페이스바 기준으로 잘라 리스트로 저장해줌
n , m = map(int, input().split())
numbers=[1,2,3,4]
letters=['a','b','c']
for pair in zip(numbers,letters):
print(pair)
>>>
(1, 'a')
(2, 'b')
(3, 'c')
lambda [parameter] : 표현식
ex)
def factorial(n):
if n==0 or n == 1:
return 1
else :
return n * factorial(n-1)
print(factorial(4))
'''
f(4)
return 4 * f(4-1)
return 3 * f(2)
return 2 * f(1)
return 1
=> 1 * 2 * 3 * 4 : 24
'''
>>>
24
재귀 함수는 base case 에 도달할 때 까지 함수를 호출
메모리 스택이 넘치게 되면 프로그램이 동작하지 않게 됨