Python // 함수
정의(definition)은 어떤 이름을 가진 코드가 구체적으로 어떻게 동작하는지를 구체적으로 기술하는것을 말한다.
파이썬에서는 함수나 메소드를 정의할 때 def를 사용한다.
ex)
def hello():
print("hello world")
hello()
hello world
hello라는 함수를 정의하였다.
def 뒤에 정의할 함수 이름을 적어주고 그 뒤에는 매개변수 목록을 위치시킨다. 매개변수 목록은 괄호() 로 감싸며, 매개변수 목록 내의 각 매개변수는 콤마, 로 구분한다. 매개변수 목록 두에는 콜론:이 온다. 코드블록은 항상 들여쓰기로 해야한다.
함수에는 4가지 형태가 있다.
1. 입력값이 있고 반환값이 있다.
def ADD(num1,num2):
sum = num1+num2
return sum
res = ADD(10,2) // 입력값 매개변수로 10과 2를 넘겨주고 return되는 값 res = num1 + num2를 반환받는다. 그 값을 res에 저장한다.
print(res)
2. 입력값이 있고 반환값이 없다.
def ADD(num1,num2)
sum = num1+num2
print(ADD(10,2)) // None 입력값 10과 2를 넘겨주었으나 반환받는 값이 없으므로 None
3. 입력값이 없고 반환값이 있다.
def ADD():
num1 = 10
num2 = 2
sum = num1 + num2
return sum
res= ADD() // 입력값이 없기 때문에 반환값만 받을 수 있다. 반환값을 변수에 저장받아서 받는다.
print(res)
4. 입력값이 없고 반환값이 없다.
def ADD():
print("=============")
print(" 1.입금")
print(" 1.출금")
print(" 1.송금")
print(" 1.종료")
단순히 출력만 할 때 사용한다.
매개변수를 입력받는 여러가지 방법이 있다.
함수의 매개변수에는 어떤 자료형이든 사용할 수 있다.
ex) 문자열과 숫자를 입력받아 입력한 숫자만큼 문자열을 출력하는 함수
출력결과
hi brother
hi brother
hi brother
매개변수로 hi brother과 3이 넘어가서 3이 for문의 카운트가 되었다. 그리하여 3번을 반복하여 3번이 출력이 되었다.
def simple(text,count=1):
for i in range(count):
print(text)
simple('hi brother')
위의 예제는 매개변수로 text만 넘겨주었다. 이 때, 위에 매개변수를 정의할 때 값을 할당해놓으면 이 값이 기본값 매개변수가 된다.
호출 시, 두번째 매개변수가 비었기 때문에 위 예제는 1번만 반복이 된다.
hi brother
호출자가 매개변수의 이름을 일일이 지정해 데이터를 입력하는 것도 가능하다. 이것을 키워드 매개변수라고 한다.
ex)
position과 nationality는 위에 기본값이 사용된다.
가변매개변수 - 상황에 따라 매개변수의 수가 달라지는 함수
def 함수이름(*매개변수):
코드블록
ex)
*를 이용하여 정의된 가변 매개변수는 튜플이다. 따라서 text_list를 다룰 때는 순서열을 다룰 때 사용했던 연산은 모두 사용 가능하다.
*를 한개 사용시 튜플형식의 가변 매개변수가 정의가 되고 ** 두개를 사용하면 가변 매개변수는 딕셔너리 타입으로 정의가 된다.
ex)
def team(**players):
for k in players.keys():
print('{0}={1}'.format(k,players[k]))
team(ospina="GK",ozil="MF",mustafi="DF",lacazette="FW")
출력결과
mustafi=DF lacazette=FW ozil=MF ospina=GK
가변 매개변수의 앞에 정의되는 일반 매개변수는 키워드 매개변수를 이용할 수 없다.
일반 매개변수가 가변 매개변수 뒤에 정의되어 있는 함수를 호출할 때에는 일반 매개변수를 키워드 매개변수로 호출해야 한다.
return 문
1. return문에 결과 데이터를 담아 실행하기 -> 함수가 즉시 종료되고 호출자에게 결과가 전달된다.
2. return문에 아무결과도 넣지않고 실행하기 -> 함수가 즉시 종료된다.
3. retrn문 생략하기 -> 함수의 모든 코드가 실행되면 종료된다.
return을 실행하지 못하고 종료가 되면 함수는 호출자에게 None를 반환한다.
내가 생각하는 가장 큰 장점은 다른 언어들은 안되는 return 값을 여러개 반환할 수 있다.
def sum_sub_mul_div(a,b):
return a+b , a-b , a*b , a/b
result=sum_sub_mul_div(10,5)
print(result)
print(type(result))
출력결과
(15, 5, 50, 2.0)
<class 'tuple'>
리턴값이 여러개 반환되어 그 값들을 튜플에 저장을 할 수 있다.
또 한, 반환되는 값들을 res1, res2, res3, res4 = sum_sub_mul_div(10,5)이렇게 각 변수에 담을 수 있다.
함수의 안에 있는 a와 함수의 밖에있는 a의 값이 같을까 ?
그 답은 X이다.
변수는 자신이 생성된 범위안에서만 유효한다. 함수 안에서 만든 변수는 함수 안에서 살아있다가 함수코드의 실행이 종료되면 그 즉시 없어진다.
이것을 지역변수라고 한다.
이와 반대로 함수 외부에서 만든 변수는 프로그램이 살아있는 동안에는 함께 살아있다가 프로그램이 종료될 때 같이 소멸된다. 프로그램의 전체를 유효범위로 가지는 변수를
전역변수라고 한다.
파이썬은 함수 안에서 사용되는 모든 변수를 지역변수로 간주하는데 전역변수를 사용하려면 global키워드를 사용해야 한다.
ex)
def scope_test():
global a
a = 1
print('a:{0}'.format(a))
a=0
scope_test()
출력결과
a:1
global키워드는 지정한 변수의 유효범위가 전역임을 알리고, 지역변수의 생성을 막는다.
재귀함수 - 자기 스르로 호출하는 함수
재귀함수는 편리하지만 주의해야 할 점이 있다. 재귀함수는 컴퓨터가 많은 일을 하게 되서 성능을 떨어지는 소프트웨어를 만들게 한다.
재귀함수가 종료될 조건을 만들지 않으면 무한루프나 다름없는 코드가 되어버린다.
def no_idea():
print("나는 아무생각이 없다.")
pirnt("왜냐하면")
no_idea()
이런 식으로 만들어버리면 메모리를 추가로 사용하는 무한루프가 되어버린다.
또 한 함수를 변수에 담아 사용할 수 있다.
p = no_idea
print(p)
나는 아무생각이 없다.
왜냐하면
그렇다면 순서열과 딕셔너리도 담을 수 있다.
ex)
def ADD(a,b):
return a+b
def SUB(a,b):
return a-b
flist=[ADD,SUB]
print(flist[0](1,2))
print(flist[1](3,2))
출력결과
3
1
<함수의 매개변수로 함수를 전달할 수 있다.
def korea():
print("hihi")
def eng():
print("hello")
def greet(hello):
hello()
greet(eng)
출력결과 : hello
<함수의 출력결과로 함수를 반환받을 수 있다.
def korea():
print("hihi")
def eng():
print("hello")
def greet(where):
if where == 'k':
return korea
else:
return eng
hello=greet('k')
hello()
출력결과 : hihi