AI Basic/Python

[Python] 04 Advanced Function Concept

iamzieun 2023. 3. 7. 21:39

01 call by object reference

  • 함수에서 parameter를 전달하는 방식
    • 값에 의한 호출 call by value
      • 함수에 인자를 넘길 때 이 복사되어 함수로 전달되는 방식
      • → 함수 내에 인자 값 변경 시, 호출자에게 영향을 주지 않음
      def swap_value(x, y):
      	temp = x      # 값이 복사되어 함수로 전달됨 -> 호출자에게 영향을 주지 않음
      	x = y
      	y = temp
      
      x = 4
      y = 5
      swap_value(x, y)
      print(x, y)     # 4 5
      
    • 참조에 의한 호출 call by reference
      • 함수에 인자를 넘길 때 메모리 주소가 함수로 전달되는 방식
      • → 함수 내에 인자 값 변경 시, 호출자의 값도 변경됨
    • 객체 참조에 의한 호출 call by object reference
      • 파이썬의 함수에서 parameter을 전달하는 방식
      • 함수에 인자를 넘길 때 객체의 주소가 함수로 전달되는 방식
      • → 전달된 객체를 참조하여 변경이 이루어지는 경우 호출자에게 영향을 주지만, 새로운 객체를 생성하는 경우 호출자는 영향을 받지 않음
      def spam(eggs):
      	eggs.append(1)    # 전달된 객체(eggs)를 참조한 변경이 이루어짐 -> 호출자에게 영향을 줌
      	eggs = [2, 3]     # 새로운 객체를 생성 -> 호출자에게 영향을 주지 않음
      
      ham = [0]
      spam(ham)
      print(ham)          # [0, 1]
      

02 Scoping Rule

  • 변수가 사용되는 범위에 따른 변수의 구분
    • 지역변수 (local variable): 함수 내에서만 사용
    • 전역변수 (global variable): 프로그램 전체에서 사용
    def f_1():
    	s = "I love spring"     # s: 지역변수  
    	print(s)
    
    def f_2():
    	global s                # global을 통해 전역변수 s를 함수 내에서 사용
    	s = "I love spring"
    	print(s)
    
    s = "I love summer"       # s: 전역변수
    
    f_1()                     # I love spring
    print(s)                  # I love summer
    
    f_2()                     # I love spring
    print(s)                  # I love spring
    
    • 전역변수는 global 키워드를 사용하여 함수 내에서 사용할 수 있음
    • 하지만, 함수 내에서 전역 변수와 같은 이름의 변수를 선언하면 그 변수는 새로운 지역 변수가 됨

03 Recursive Functions

  • 재귀함수 (recursive function)
    • 자기 자신을 호출하는 함수
    • 점화식 등의 재귀적 수학 모형을 표현할 때 사용
    • 재귀 종료 조건을 설정하여 종료 조건까지 함수가 반복적으로 호출되게 함

04 Function Type Hints

  • 파이썬의 가장 큰 특징은 dynamic typed lauguage라는 점인데, 함수를 처음 사용하는 사용자는 이러한 특징으로 인하여 함수의 interface를 알기 어렵다는 단점을 가진다
  • → 이에 따라 python 3.5 버전 이후로는 PEP 484에 기반하여 type hints 기능을 제공하고 있다
  • type hints
    • 코드 작성 시에 변수의 데이터 타입을 알려주는 것
    def function_name(var_name: var_type) -> return_type:
    	pass
    # var_type: parameter의 data type을 알려줌
    # return_type: 반환값의 data type을 알려줌
    
  • type hints의 장점
    • 사용자에게 인터페이스를 명확하게 알려줄 수 있다
    • 함수를 문서화할 때 parameter에 대한 정보를 명확하게 알 수 있다
    • mypy 또는 IDE, linter 등을 통해 코드의 발생 가능한 오류를 사전에 확인할 수 있다
    • 시스템의 전체적인 안정성을 확보할 수 있다

05 Docstring

  • docstring
    • 함수, 모듈, 클래스 또는 메소드 정의의 첫 번째 명령문으로 발생하는 문자열
    • 함수, 모듈, 클래스 또는 메소드에 대한 상세한 정보를 제공함으로써 함수 사용자의 이행도를 높임
  • docstring의 기본 형태
def calculate_rectangle_area(x, y):
    """_summary_                     # 함수의 기능

    Args:                            # 인자
        x (_type_): _description_
        y (_type_): _description_

    Returns:                         # 반환값
        _type_: _description_
    """    
    return x * y    
  • cf. vscode의 autoDocstring - Python Docstring Generator을 사용하면 더욱 편리하게 docstring을 작성할 수 있다 !

06 함수 개발 가이드라인

  • 함수 작성 가이드라인
    • 함수는 가능하면 짧게 작성할 것
    • 함수 이름에 함수의 역할 및 의도를 명시할 것
      • V(동사)_O(목적어) 형태로 작성
      • ex. print_hello
    • 하나의 함수에는 유사한 역할을 하는 코드만 포함
    • 인자로 받은 값 자체를 바꾸지 말 것
      • 인자로 받은 값을 활용하고자 할 때에는 값을 복사하여 새로운 변수에 할당하여 사용
  • 함수는 언제 만드는가?
    • 반복되어 사용되는 코드는 함수로 변환하여 사용
    • 복잡한 수식 및 조건은 식별 가능한 이름의 함수로 변환하여 사용

07 How to write Good Code

  • 코딩 컨벤션
    • 명확한 규칙은 없기 때문에 팀 및 프로젝트마다 다른 컨벤션을 사용하기도 함
    • 어떤 컨벤션을 사용하든 ‘일관성’을 지키는 것이 가장 중요
  • 코딩 컨벤션의 예시
    • 들여쓰기는 공백 4칸으로 사용
    • 한 줄에 최대 79자까지 작성
    • 불필요한 공백은 피할 것
    • 코드의 마지막에는 항상 한 줄의 빈 줄을 추가할 것
    • 소문자 l, 대문자 O, 대문자 I 사용 금지
  • 코딩 컨벤션 체크 및 수정 모듈
    • flake8: 코딩 컨벤션 체크
    • black: 파이썬 코딩 컨벤션의 기준으로 여겨지는 PEP8에 거의 부합하게 코드를 수정