본문 바로가기
Python

[별거아닌팁] 파이썬에 어느 정도 익숙해질 때 챙기면 좋을 팁

by 돈민찌 2021. 9. 20.
반응형

(모듈화) main 사용하기

어떤 파이썬 파일이든 나중에 다른 파이썬 파일에서 모듈로 당겨 쓸 수 있는 가능성을 생각한다. 그런데 만약 파이썬 파일 안에 코드가 함수나 클래스로 구성되어 있지 않고 바로 기능을 작성한 경우, 다른 파일에서 그것을 가져다 쓰기는 매우 힘들어진다. 그것을 가져오는 과정에서 원본 파이썬 파일의 코드까지 실행되어 버리니까. 그래서 나는 main을 자주 쓴다. 파이참에서 빈 라인에 main 이라고 입력한 뒤 탭을 누르면

if __name__ == "__main__":

이라는 코드 자동완성이 나타난다. 그리고 이 조건문이 뜻하는 것은 "내가 이 파일을 직접적으로 실행했을 때에만 아래 코드를 작동한다!"라는 명시다. 파이썬에는 __name__ 말고도 숨겨진 내장 변수가 꽤 있는데, 초급 단계에서 그걸 다 외우고 있을 필요는 없겠지만, 이 경우에는 파일의 모듈화에 아주 중요한 역할을 하는 코드니까 사용하는 것을 추천한다.

import datetime


def find_max_num(array):
    largest = array[0]
    for num in array:
        if num > largest:
            largest = num
    return largest


if __name__ == '__main__':
    numbers = [3, 5, 6, 1, 2, 4, 0, -99, 7, 3, 5]
    start = datetime.datetime.now()
    print("result:", find_max_num(numbers))
    end = datetime.datetime.now()
    print("time:", (end-start).microseconds, "microseconds")

예를 들어 이렇게 한 배열(리스트)에서 가장 큰 수를 구하는 알고리즘 함수를 구현했다(물론 max 내장 함수가 있지만)고 가정하면, 이후 다른 알고리즘을 구현할 때 이 코드를 사용하면 코드 절약이 된다. 그러니까 해당 파일에서 로직이 잘 작동하는지 확인하는 코드 부분은 이 main 구문 안에 넣어두면 외부에서도 문제 없이 함수만 가져가 쓸 수 있다.

(예외처리) Bare Exception 을 사용하지 않는다.

Try - Except 구문은 웹크롤링 같이 변수가 많은 코드를 작성할 때 자주 사용하게 되는데, 이 except 라인에 어떤 유형의 에러/익셉션을 만날 경우 ~~해라 라고 명시해주는 것이 훨씬 깔끔하다. 사용자에게 input을 받거나 하는 경우 모든 오류 상황을 예측할 수는 없겠지만, 다양한 에러의 가능성을 어느정도 예상하고 코드를 작성하는 것을 권장한다. 참고로 try 문에는 except 뿐만 아니라 else와 finally도 붙일 수 있는데, else는 익셉션이 발생하지 않았을 때에만, finally는 오류와 상관없이 실행된다.

try:
    print(12/0)
    print(hello)
except NameError as e:
    print(e)  # 이 오류가 먼저 명시되었지만 출력되지 않을 것이다.    
except ZeroDivisionError as e:
    print(e)  # 이 에러가 먼저 발생하므로 이것이 출력된다.
else:
    print("hello")
finally:
    print("My Name is Donminzzi")

(문법)  # 코멘트

역시 별 건 아닌데, 괜히 #을 많이 사용하지 말고 # 하나에 한칸 공백을 주고 작성한다. 코드 라인에 인라인으로 적을 경우 코드와 두칸 띄어놓는다. 예시는 위의 코드 참조.

(모듈화) 예측 가능한 함수의 경우 리턴 값과 파라미터 유형 명시하기

def find_max_num(array: list) -> int:
    largest = array[0]
    for num in array:
        if num > largest:
            largest = num
    return largest

(모듈화) 작성한 함수 사용법과 출력값 명시하기

위의 코멘트와 타입 명시를 합한 것이라 생각하면 좋다. 파이참에서 작성한 함수에 마우스를 올리고 나타나는 노란 전구를 클릭하면 (혹은 함수의 어디든지 커서가 있는 상태에서 alt+Enter를 입력하면, 나타나는 것 중 insert document string stub이 있다. 클릭하면 """으로 둘러싸인 여러 열의 doc string 이 나타나며, 각 변수가 어떤 의미이고 어떤 값을 입력하는 것이 좋은지, 또 이 함수가 리턴하는 값이 무엇인지 입력할 수 있는 템플릿을 입력할 수 있다.

def is_existing(target, array):
    """
    대상 리스트에 타겟 값이 존재하는지 여부를 나타냅니다.
    
    :param target: 찾고자 하는 값입니다.
    :param array: 찾고자 하는 대상이 되는 배열(리스트)입니다.
    :type array: list
    :return: Boolean
    """
    if len(array) == 0:
        return False
    curr = (len(array)) // 2
    if array[curr] == target:
        return True
    elif array[curr] < target:
        return is_existing(target, array[curr + 1:])
    else:
        return is_existing(target, array[:curr])

작성 이후에는 이렇게 내가 사용하던 외부에 공유하던 훨씬 사용성이 좋아진다. 협업에 큰 도움이 되고, 설명이 따로 첨부되니 변수나 함수명을 지나치게 길게 작성할 필요가 없어진다.

(모듈 사용) import 임포트 구문

별건 아니지만 처음 파이썬을 배울 때 배운 것이 습관이 된 것이다. import를 작성할 때, 가장 위에는 표준 라이브러리를, 그 다음에는 pip3로 설치한 라이브러리를 그 다음에는 로컬 모듈을 명시한다.

앗 모듈 설치를 깜빡했다! => import 구문 위에 커서를 올리고 Alt(맥은 option)+Enter 누르면 설치 옵션이 나타난다.

(Etc.)딕셔너리 객체 접근 시에 get 사용하기

오류를 발생시키지 않는 코드 작성법. 딕셔너리에 해당 키가 존재하지 않으면 에러를 일으키지 않고 None을 리턴한다. JSON 데이터를 다루거나 할 때 유용하게 쓰는 편.

(모던문법) f-string (파이썬 3.6 이상)

keyword = "hello"
url = f"https://www.google.com/search?q=hello&oq={keyword}"

이미 많은 분들이 알고 있을 것 같기는 하지만, 모르면 귀찮은 최신 문법. 예를 들어 정수형의 값을 "myblog.com/"+number 이렇게 사용하면 타입에러(문자열+정수 x)가 나타나는데, f-string을 이용하면 저절로 문자열로 타입이 변형되어 편하다.

(단축키 모음?) 

  • Alt+Shift+↑↓ 누르면 해당 줄의 코드가 통째로 라인 이동 (VSCode에서는 Alt 키와 방향키)
  • Ctrl+Shift+I 누르면 변수나 함수를 코드 상단에 올라가서 볼 필요없이 작은 모달로 보여줌.
  • 문법 오류로 밑줄이 그어졌을 때 F2키 누르면 해당 코드로 이동.
  • 이거 은근히 모르는 사람 많음. 코드 한 줄을 그대로 복사/복제/잘라내기 하려면 드래그 없이 Ctrl+C / D / X 
  • Ctrl + Y 처음 사용하면 "Redo(컨트롤z의 반대)" 와 해당 코드 줄 삭제 중에 키맵 설정하는게 나온다.
  • 더 많은 단축키를 알고 싶다면 세팅의 plugin 탭에서 Key promoter를 설치해보자. 직접 마우스로 어떤 기능을 수행할 때, "이거 ㅁㅁ 단축키로 하면 00ms 아꼈을 거예요!"라고 알려줌..(좀 귀찮다.)
  • 세팅하는 김에 Keymap 자체를 조금 수정해 보는 것도 추천. 많이 바꿀 필요는 없고 함께 쓰는 IDE들끼리 통일시키는 정도로.

디버그 좀 하면서 쓰자💦

일반적으로 Shift+F10 키 혹은 Run 버튼을 클릭해서 현재 파일을 실행하는데, 디버그 모드는 코드의 진행 중에 변수와 함수가 정의되고 값이 변하는 과정을 볼 수 있어 훨씬 좋은 코드를 작성할 수 있다. 그냥 클릭하면 Run 코드와 마찬가지로 동작하지만, 값을 확인하고 싶은 코드 라인의 n번째 줄을 나타내는 곳 옆을 한번 클릭하면 빨간 점이 생긴다. 이 상태에서 디버그를 돌리면 디버그 모드가 실행된다.

재귀함수를 사용하면 메인 쓰레드에 스택이 쌓이는 모습도 볼 수 있고 우측 하단을 보면 지금까지 정의된 변수의 현재 값도 볼 수 있다. 물론 Run 모드처럼 콘솔 확인도 당연히 가능하고, 코드를 한줄한줄씩 실행하며 실행중인 코드라인이 위아래로 옮겨지는 것을 볼 수 있다.

설명하자면 긴데 꼭 알아뒀으면 하는 함수들

  • enumerate: for문과 아주 찰떡 궁합이다. 열거 가능한 어떤 값을 반복할 때, 각 요소의 순서에 맞춰 0,1,2... 인덱스를 튜플로 출력해준다. for idx, value in enumerate(list): 이런 문법으로 사용한다.
  • zip: 역시 for문과 찰떡 궁합이다. 길이가 같은 다수의 배열을 함께 묶어서, 같은 인덱스를 가진 값들끼리 튜플로 묶어준다. for value1, value2 in zip(list1, list2): 이런 문법으로 사용한다.
  • map/apply: 배열의 값을 순회하며 같은 함수나 메소드를 적용해준다. 꼭 검색해서 익혀두길..! 데이터 분석할 때 진짜 많이 썼다...
  • lambda: 익명의 함수를 만들 수 있다. def 없이 임시적으로 사용하고 바로 폐기할 수 있는 함수, 자바스크립트의 애로우 함수를 사용하는 것 같다.
반응형

댓글