[DAY 2] Function
Function(함수)
- 어떤 일을 수행하는 코드의 덩어리
- 코드를 논리적인 단위로 분리
- 반복적인 수행을 용이하게 함
- 캡슐화: 인터페이스만 알면 타인의 코드 사용할 수 있음
- 함수 수행 순서
- (1) 함수 부분을 제외한 메인프로그램부터 시작
- main ➡ func call
- (2) 함수 호출시 함수 부분을 수행 후 되돌아옴
- main ⬅ return func
- (1) 함수 부분을 제외한 메인프로그램부터 시작
1
2
def func(x , y):
return x * y
함수 선언
- 함수이름, parameter, indentation, return value(optional)
1
2
3
4
def 함수_이름 (parmaeter1,…,): # def name(input):
수행문 #1(statements) # 앞 indentation 필요
수행문 #2(statements)
return <반환값>
parameter vs argument
- parameter: 함수의 입력 값 인터페이스
- 함수 선언시 input을 지칭하는 것
def func(**x, y**)
- argument: 실제 parameter에 대입된 값
- 함수를 호출할 때 input에 넣어주는 값
func(**x, y**)
함수 형태
- parameter 유무, 반환 값(return value) 유무에 따라 함수의 형태가 다름
- 함수의 반환값이 필요한지, 필요하지 않은지 따져봐야함
- 반환값이 있는지 없는지에 따라 변수 업데이트 여부 나뉠 수 있음
보통 리턴값이 있는 경우, 변수 업데이트 필요
1 2 3 4 5 6 7 8 9 10 11
>>> sorted(a) # 스스로 변화하지않음 # [5, 4, 3, 2, 1] (print 함) >>> a.sort() # 스스로 변화하는 함수 # [1, 2, 3, 4, 5] (print 안함) # 주의 # def f(x): return print(x + 10) >>> f(10) # 20 # 값을 변경하지 않음 >>> c = f(10) # 20 # c에 f 함수의 리턴값을 할당 # 함수 return 전에 x+10출력 >>> c # 출력없음 # 그러나 return print() # => print는 반환형이 없으므로 출력이 없음 !!!
Function-scoping Rule
- 변수의 범위(Scoping Rule)
변수가 사용되는 범위(함수 또는 메인 프로그램)
- 전역변수 vs 지역변수
- 지역변수(local variable): 함수내에서만 사용
- 전역변수(global variable): 프로그램 전체에서 사용
- 전역변수는 함수에서 사용가능
- But, 함수 내에 전역 변수와 같은 이름의 변수를 선언하면 새로운 지역 변수가 생김
- 함수 내에서 전역변수 사용 시 global 키워드 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# Scopingn Rule Test def calculate(x, y): total = x + y # 새로운 값이 할당되어 함수 내 total은 지역변수가 됨 print ("In Function") print ("a:", str(a), "b:", str(b), "a+b:", str(a+b), "total :", str(total)) return total a = 5 # a와 b는 전역변수 b = 7 total = 0 # 전역변수 total print ("In Program - 1") print ("a:", str(a), "b:", str(b), "a+b:", str(a+b)) sum = calculate (a,b) print ("After Calculation") print ("Total :", str(total), " Sum:", str(sum)) # 지역변수는 전역변수에 영향 X """ 결과 In Program -1 a: 5 b: 7 a+b: 12 In function a: 5 b: 7 a+b: 12 total : 12 After Calculation Total : 0 Sum: 12 """
Function Type Hints
- Dynamic Typing
- Dynamic Typing: 실행 시에 변수의 타입을 정하는 것
- Type Hints: 사용자가 interface를 알기 어렵다는 단점을 보완하기 위함
def do_function(var_name: var_type) -> return_type:
def type_hint_example(name: str) -> str
➡ 이렇게 미리 지정가능
- Type Hints의 장점
- 사용자에게 인터페이스를 명확히 알려줄 수 있음
- 함수의 문서화시 parameter에 대한 정보를 명확히 알 수 있음
- mypy 또는 IDE, linter 등을 통해 코드의 발생 가능한 오류를 사전에 확인
- 시스템 전체적인 안정성을 확보할 수 있음
Function Docstring
- 파이썬 함수에 대한 상세 스펙을 사전에 작성하여, 함수 사용자의 이행도를 높이는 것
- 세개의 따옴표로 docstring 영역표시(함수명 아래)
- 함수 작성 가이드 라인
- 함수는 가능하면 짧게 작성할 것 (줄 수를 줄일 것)
- 함수 이름에 함수의 역할, 의도가 명확히 들어낼 것
동사_목적어
- ex) print_hello_world()
- 하나의 함수에는 유사한 역할을 하는 코드만 포함
- 인자로 받은 값 자체를 바꾸진 말 것 (임시변수 선언)
- 함수는 언제 만드는가?
- 공통적으로 사용되는 코드는 함수로 변환
- 복잡한 수식 ➡ 식별 가능한 이름의 함수로 변환
- 복잡한 조건 ➡ 식별 가능한 이름의 함수로 변환
etc
- Debugging(디버깅)
- 코드의 오류를 발견하여 수정하는 과정
- 오류의 원인을 알고 해결책을 찾아야 함
- 문법적 에러를 찾기 위한 에러 메시지 분석
- 논리적 에러를 찾기 위한 테스트도 중요
- 문법적 오류 예시
- 들여쓰기, 오탈자, 대소문자 구분안함
- 에러 메시지 분석
- 에러가 발생하면 인터프리터가 알려줌
- 논리적 에러
- 뜻대로 실행되지 않는 코드
- 중간에 프린터 문을 찍어서 확인
- 함수 확인하기
- check print문