함수
- 어떤 입력 값을 받아서 결과를 만들어 주는 것
- 엑셀 함수를 생각하면 쉬움
- 프로그래밍에서 함수란 특정 기능을 수행하는 코드
- 엑셀에서는 이미 만들어진 함수를 주로 호출함
- 파이썬(프로그래밍)에서는 필요한 함수를 프로그래머가 직접 개발할 수 있음.
파이썬에서 함수 만들기
- 프로그래밍에서는 함수를 만드는 것을 = 함수를 정의한다 , 라고 표현함.
- 파이썬 함수를 정의할 때 규칙
-
def 키워드를 사용하여 함수를 만들 수 있음.
-
함수의 이름이 필요(변수 이름과 같은 규칙)
-
함수의 입력이 있는 경우 입력 값들을 바인딩할 변수를 적어 줌
-
들여쓰기 후 함수가 호출될 때 수행할 문장을 기술함.
def 함수이름():
코드
def sum(A1, A2, A3):
코드
함수 정의
- 함수 이름은 별찍기
- 함수의 기능은 별을 출력
- 함수 이름은 들여쓰기 된 코드를 바인딩
- 그러니까 별찍기는 들여쓰기 된 코드들을 바인딩하게됨.
파이썬 변수와 함수의 차이점
-
파이썬 변수는 값에 대한 이름표
- 어떤 값이 자주 사용될 때 값에 이름표를 붙이는 개념임.
- 변수는 값을 바인딩 함.
-
파이썬 함수는 어떤 코드에 대한 이름표
- 어떤 코드가 자주 사용될 때 코드에 이름표를 붙이는 개념.
- 함수는 코드를 바인딩 함.
파이썬 함수 호출
- 파이썬 함수의 이름은 코드 객체를 바인딩
- 함수 이름이 바인딩하고 있는 코드를 수행하는 것을 함수 호출이라고 부름
- 함수 호출 방법
함수 호출의 이해
- 파이썬 코드는 기본적으로 위에서 아래로 순차적으로 실행 됨
- 파이썬 인터프리터는 def 키워드를 만나면 코드를 메모리에 할당하고 이를 함수 이름이 바인딩
def mysum(a,b):
ret = a+b
return ret
- 함수를 호출할 때, 정의에서 2개를 받기로 했으면 두개를 받아줘야 함.
- mysum은 코드 객체를 바인딩하고 있음.
- 하지만 메모리에 위치만 알고 있는 상태기 때문에, 내가 함수를 사용하기 위해 함수를 호출할 때는 인자값을 넣어줘서 불러내야함.
함수 호출의 이해(2)
- 함수 이름에 ‘()’를 붙이면 해당 함수가 호출 됨
- 함수의 호출이란 함수 이름이 가리키는 코드의 실행을 의미함
- 인터프리터는 코드를 실행하기 위해 함수로 이동
def mysum(a,b):
ret = a+b
return ret
ret1 = mysum(3,4)
함수 호출의 이해(3)
- 함수 호출의 1단계 : 입력 값 바인딩
- 함수 정의부의 변수(파라미터)는 함수 호출부에 전달한 값(인자/Argument)를 바인딩한다.
- a = 3, b =4
- 함수 호출의 2단계 : 함수 실행
- 함수 내에 들여쓰기 된 코드가 수행됨.
- ret = a + b / 3+4 , 이제 ret는 7을 바인딩하게 됨.
- 함수 호출의 3단계 : 결괏값 리턴
- 함수 내에서 사용된 변수 소멸 / a,b,ret가 다 없어짐
- 바인딩 되지 않은 객체(참조되지 않은 값)는 소멸됨.
- 인터프리터는 함수 호출부로 돌아감.
- 여기서 ret가 소멸되므로 mysum(3,4)는 7인데 왼쪽에 있던 ret1이 7이라는 값을 바인딩하게 됨.
- 리턴이 되면서, 3과 4는 아무도 가리키지 않기 때문에 지워지게 되지만 7은 함수 바깥쪽에 있는 ret1이라는 변수가 가리키고 있기 때문에
- 결과값은 계속 남아있게 되는 것!!
- = 함수를 호출할 때 결과값을 바깥에서 바인딩 해주는 이유!
연습문제
num = 10
def foo()
num = 20
foo()
print(num)
- 다음 코드를 실행할 때 출력되는 값은?
- 정답
- num은 10을 바인딩하게 됨.
- foo라는 함수는 들여쓰기 된 코드를 바인딩 하는 중
- foo() 인터프리터가 foo를 수행함. 이 때 num이 20을 가르키게 된다. 명시적으로 리턴하지 않았을 때 return none이 리턴됨.
하지만! 이 num은 함수 foo안에서의 num이다. 인자값이 없으므로 foo()를 실행했을 때, return none이 되면서
함수 내에 사용된 변수 소멸(num 소멸), 참조되지 않은 값도 소멸(20 소멸)
- 함수 foo() 호출이 끝나고, 여전히 함수 바깥에서 num은 10을 가리키고 있기에 print(num)은 10이다.
전역 변수와 지역 변수
- 전역 변수
- 함수 밖에서 정의한 변수
- 특정 파이썬 파일에 정의된 변수 / 파일 단위로 계속 유지
- 지역 변수
- 함수 내에서 정의된 변수
- 함수가 호출되는 그 순간에만 존재함
a = 10
def test():
b = 20
print(b)
test()
LEGB 규칙
- LGEB 규칙(rule)
- 파이썬에서 변수에 값을 바인딩하거나 변수를 참조할 때 LEGB 규칙을 따름.
SCOPE | 설명 |
---|
local | local의 약자로 함수 안을 의미한다. |
enclosing | enclossed function locals의 약자로 내부 함수에서 자신의 외부 함수의 범위를 의미한다. 함수와 함수 사이 |
global | global의 약자로 함수 바깥쪽을 의미한다. |
built-in | built-in의 약자로 open, range등과 같은 파이썬 내장 함수를 의미한다. |
[파이썬 강의 참고](https://youtu.be/jkwNBOyzSvQ?feature=shared)
궁금하신 점은 댓글 달아주세요!