>

TIL

2주차 Day 2. 파이썬 심화

ekdud 2024. 7. 3. 21:04

목차

    파이썬 가상환경 설정

    터미널에서 python -m venv 가상환경이름(기본적으로 venv로 많이 사용) 입력.

    => 다음부터 해당 폴더를 열 때 자동으로 활성화됨. 만들자마자는 활성화되지 않으니 터미널에

    설정한 가상환경이름\Scripts\activate(tab하면 자동완성) 입력.

    *터미널이 command prompt(cmd)로 되어있는지 반드시 확인. (그냥 bash에서 하다가 안돼서 당황함..)

     

     

    반대로, 가상환경을 비활성화 시킬 때는 cmd창에 deactivate 입력. 

     

    파이썬에서는 pip(package installer)를 사용해 패키지들을 설치하고 관리함.

    기본적으로 파이썬을 실행하는 모든 환경에 설치되므로 여러개의 프로젝트를 개발하는 경우 호환성 문제 발생 가능.

    => python 가상환경을 활용해 각 프로젝트마다 독립적인 환경을 구성하여 호환성 문제 최소화.(패키지가 해당 폴더에만 설치됨)

     

     


    코드 컨벤션

    : 언어에 따라 요구하는 내용이 다르기 때문에 내가 개발하는 언어에 맞는 컨벤션 스타일에 맞춰 코드를 작성하는 것이 좋다.

    파이썬의 경우, 변수나 함수를 네이밍할 때는 Snake 표기법, Class를 네이밍할 때는 Pascal 표기법을 사용한다. 이런것들을 규정해놓은 가이드가 PEP-8.

     

    - Pascal: 각 단어의 첫 글자만 대문자로. ex. PythonIsVeryGood

    - Camel: Pascal과 동일하지만 첫문자가 소문자로 시작. ex. pythonIsVeryGood

    *Upper Camel Case의 경우 첫문자도 대문자. 이는 Pascal과 동일하기 때문에 Pascal체와 Camel체의 용어 혼동 有.

    - Snake: 각 단어를 언더바로 구분. ex. python_is_very_good

     

    상수 - 한 번 선언하고 바꾸지 않도록 한다. (문법적으로는 문제가 없지만 코드컨벤션에 맞지 않음)
    formatter 사용으로 코드 컨벤션에 맞게 자동 포맷팅 가능! (black formatter를 설치함)

     

    pep8 요약 - 참고자료   🤍  

     


    전역변수와 지역변수

    - 지역변수는 함수 내부에서 선언되는 변수. 전역변수는 함수 밖에서 선언되는 변수로 어디서나 접근 가능.

    - 지역변수는 global 키워드를 사용해 전역변수로 재선언 가능. (지양할 것)

    - 함수 내부에서 전역 변수와 같은 이름으로 지역 변수를 할당하려하면 오류 발생.

     

    *전역 변수를 권장하지 않는 이유: 코드가 길어질수록 전역 변수로 선언 된 값은 어디서 값이 변했는지 추적하기 어렵고, 문제가 생겼을 때 디버깅을 하기 어려워지기 때문.

     


    자주 사용되는 모듈 및 패턴

    - type() : 갑의 자료형 확인

    - .split() : string을 list로 변환

    - .join() : list를 string으로 변환

     

    - .replace() : 문자열 바꾸기.   "변경할 문자".replace("변경 전 문자", "변경 후 문자") 

    before_string = "hello world!!!"
    after_string = before_string.replace("!", "~") # !를 ~로 변경
    
    print(after_string) # hello world~~~

     

    - pprint() : 코드 예쁘게 출력하기.  from pprint import pprint 를 상단에 써줘야 함.

    - random : 랜덤한 로직이 필요한 경우. import random

     

    - time : 시간 다루기. import time

    import time
    
    start_time = time.time() # 현재 시간 저장
    
    time.sleep(1) # 1초간 대기
    
    end_time = time.time()
    
    # 코드가 종료된 시간 - 코드가 시작된 시간으로 실행 시간 구하기 (단위 : 초)
    print(f"코드 실행 시간 : {end_time-start_time:.5f}") # 코드 실행 시간 : 1.00100

     

    - datetime : 날짜 다루기. from datetime import datetime, timedelta

    (추가 포맷코드 datetime — Basic date and time types — Python 3.12.4 문서 )

    from datetime import datetime, timedelta
    
    # 현재 날짜 및 시간 출력
    print(datetime.now()) # 2023-02-22 15:55:32.277095
    
    # datetime의 format code
    '''
    %y : 두 자리 연도 / 20, 21, 22
    %Y : 네 자리 연도 / 2020, 2021, 2022
    %m : 두 자리 월 / 01, 02 ... 11 ,12
    %d : 두 자리 일 / 01, 02 ...  30, 31
    %I : 12시간제 시간 / 01, 02 ... 12
    %H : 24시간제의 시간 / 00, 01 ... 23
    %M : 두 자리 분 / 00, 01 ... 58, 59
    %S : 두 자리 초 / 00, 01 ... 58, 59
    '''
    
    # string을 datetime 날짜로 변경하기
    string_datetime = "23/12/25 13:20"
    datetime_ = datetime.strptime(string_datetime, "%y/%m/%d %H:%M")
    print(datetime_) # 2023-12-25 13:20:00
    
    # datetime 날짜를 string으로 변환하기
    now = datetime.now()
    string_datetime = datetime.strftime(now, "%y/%m/%d %H:%M:%S")
    print(string_datetime) # 22/09/04 04:04
    
    # 3일 전 날짜 구하기
    three_days_ago = datetime.now() - timedelta(days=3)
    print(three_days_ago) # 2023-02-19 16:27:52.526502

     


    조건문 - any(), all()

    # all() : 요소들이 모두 True일 경우 True 리턴
    if all([True, True, True, False, True]):
        print("통과!") # False가 존재하기 때문에 분기문을 통과하지 못함
    
    # any() : 요소들 중 하나라도 True일 경우 True 리턴
    if any([False, False, False, True, False]):
        print("통과!") # True가 1개 이상 존재하기 때문에 분기문을 통과함

     


    함수를 사용할 때..

    • 구글링 해보기.

    • docstring을 활용해 알아보기.

    • 외부라이브러리를 import해 사용하는 경우, 함수를 ctrl + click하면 구현코드를 확인할 수 있다.

     


    에러처리

    number = input()
    
    try:
        int(number)
        10 / number
    
    except ValueError: # int로 변환하는 과정에서 에러가 발생했을 떄
        print(f"{number}은(는) 숫자가 아닙니다.")
        
    except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
        print("0으로는 나눌수 없습니다.")
        
    except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
        print(f"예상하지 못한 에러가 발생했습니다. error : {e}")
    
    # except 문법도 if / elif와 같이 연달아서 작성할 수 있다.

     


    class

    - class에 __init__메소드를 사용할 경우 인스턴스 생성 시 해당 메소드가 실행된다.

    class CookieFrame():
        def __init__(self, name):
            print(f"생성 된 과자의 이름은 {name} 입니다!")
            self.name = name
    
    cookie1 = CookieFrame("cookie1") # 생성 된 과자의 이름은 cookie1 입니다!
    cookie2 = CookieFrame("cookie2") # 생성 된 과자의 이름은 cookie2 입니다!

     

    - 클래스를 사용해 만들어진 객체 = 인스턴스

     


    정규표현식(regex)

    : Regular expression. 문자열이 특정 패턴과 일치하는지 판단하는 형식 언어. 

    정규표현식을 사용할 경우 코드를 매우 간소화 시킬 수 있음. 언어별로 다를 수 있으니 유의 ! 구글링 !!

    RegExr: Learn, Build, & Test RegEx ----- 참고사이트

     


    파일

    - import glob : 파일 및 디렉토리 목록 확인.

    from pprint import pprint
    import glob
    
    # ./는 현재 python 파일이 위치한 경로를 의미합니다.
    # *은 "모든 문자가 일치한다" 라는 의미를 가지고 있습니다.
    # ./venv/*은 venv 폴더 내 모든 파일들을 의미합니다.
    path = glob.glob("./venv/*")
    pprint(path)
    
    # result output
    """
    ['./venv\\Include', './venv\\Lib', './venv\\pyvenv.cfg', './venv\\Scripts']
    """
    
    # **은 해당 경로 하위 모든 파일을 의미하며, recursive 플래그와 같이 사용합니다.
    # recursive를 True로 설정하면 디렉토리 내부의 파일들을 재귀적으로 탐색합니다.
    path = glob.glob("./venv/**", recursive=True)
    pprint(path)
    
    # result output
    """
    ['./venv\\',
     './venv\\Include',
     './venv\\Lib',
     './venv\\Lib\\site-packages',
     './venv\\Lib\\site-packages\\autopep8-2.0.1.dist-info',
     ...
    ]
    """
    
    # *.py와 같이 작성 시 특정 확장자를 가진 파일들만 볼 수 있습니다.
    # ./venv/**/*.py는 venv 하위 모든 폴더들을 재귀적으로 탐색하며 .py 확장자 파일을 탐색합니다.
    path = glob.glob("./venv/**/*.py", recursive=True)
    pprint(path)
    
    # result output
    """
    ['./venv\\Lib\\site-packages\\autopep8.py',
     './venv\\Lib\\site-packages\\pycodestyle.py',
     './venv\\Lib\\site-packages\\pip\\__init__.py',
     './venv\\Lib\\site-packages\\pip\\__main__.py',
     './venv\\Lib\\site-packages\\pip\\__pip-runner__.py',
     ...
    ]
    """

     

     

    - f = open("file.txt", "모드", encoding = "인코딩형식")

    - f.close() 로 파일에 대한 작업이 끝나면 파일 닫아주기.

    - with open()은 그냥 f = open()과 다르게 with문법을 빠져나가는 순간 자동으로 파일을 닫기 때문에 수시로 열고 닫아야하는 경우 사용하면 좋다.

    - "a"모드는 "w"모드와 다르게 기존 내용을 유지한 상태로 내용을 추가한다.

    with open("file.txt", "r", encoding="utf-8") as r:
        while True:
            # readline은 파일을 한 줄 씩 읽어들입니다.
            line = r.readline()
    
            # 파일 끝까지 텍스트를 읽어들였다면 반복문을 중지합니다.
            if not line:
                break
    
            # 텍스트의 줄바꿈 문자 제거
            line = line.strip()
            print(line)

     

    내장 함수 — Python 3.12.4 문서

     


    리턴 타입

    list.sort()와 sorted(list) 함수는 리턴 값이 다르다.

    list. sort()는 return data 없이 리스트 자체를 정렬하고 sorted()함수는 정렬된 리스트를 리턴한다.

     


    Itertools

    : 효율적인 looping을 위한 이터레이터를 만드는 함수.

     

    📕  ←이터레이터 기능 참고

     

    특정 패턴이 무한하게 반복되는 배열을 만들거나 배열의 값을 일괄적으로 계산하는 등의 작업을 할 수 있다.

    from itertools import 이터레이터 이름  형식으로 import해 사용함.

     

     


    Requests

    : 파이썬에서 http 통신을 가능하게 해주는 모듈. beautifulsoup과 함께 웹 크롤링을 하거나, api통신을 할 때 사용.

    requests를 요청하면 서버에서는 응답을 내려주고 응답은 내용(content)과 상태코드(status code)를 받아온다.

    - GET : 데이터 정보 요청

    - POST : 데이터 생성 요청

    - PUT : 데이터 수정 요청

    - DELETE : 데이터 삭제 요청 

     

    더보기

    자주 사용되는 상태 코드 정보   상태코드정보 참고링크

    2xx - 성공

      200 : 정상 통신 완료

      201 : 정상 생성 완료

      …

     

    3xx : 페이지 리다이렉션

      301 : url 변경

      …

     

    4xx : 클라이언트 오류

      400 : 클라이언트가 잘못 된 요청을 보냄

      401 : 인증되지 않은 사용자

      403 : 액세스 권한이 없음

      …

     

    5xx : 서버 오류

      500 : 서버에서 처리할 수 없음

      502 : 게이트웨이에서 잘못된 응답을 받음

      …

     


    json

    : JavaScript Object Notation. 데이터를 저장하거나 데이터 통신을 할 때 주로 사용. .json 확장자 파일.

    key:value 쌍으로 이루어진 형태. 파이썬의 dictionary와 매우 유사. => 파이썬에서는 이 두 데이터형을 서로 변경할 수 있음.

    import json
    import requests
    
    # 해당 사이트는 요청에 대한 응답을 json 형태의 문자열로 내려줍니다.
    url = "https://jsonplaceholder.typicode.com/"
    
    r = requests.get(f"{url}users/1")
    print(type(r.text))  # <class 'str'>
    
    # 문자열 형태의 json을 dictionary 자료형으로 변경합니다.
    response_content = json.loads(r.text)
    print(type(response_content))  # <class 'dict'>
    
    # dictionary 자료형이기 때문에 key를 사용해 value를 확인할 수 있습니다.
    print(f"사용자 이름은 {response_content['name']} 입니다.")
    
    # result output
    """
    사용자 이름은 Leanne Graham 입니다.
    """

     


    csv 파일

    : comma-separated values. 쉼표(,)를 사용해 필드를 구분. (.csv확장자 사용)

    텍스트 편집기를 사용해 간단한 csv 파일을 만드는 것도 가능.   import csv 

     


    Decorator

    : 파이썬의 함수를 장식. @decorator 형태로 선언되는 함수 위에 써주면 해당함수가 실행될 때 데코레이터에서 선언된 코드가 함께 실행됨.

    # 데코레이터는 호출 할 함수를 인자로 받도록 선언합니다.
    def decorator(func):
        # 호출 할 함수를 감싸는 wrapper 함수를 선언합니다.
        def wrapper():
            # func.__name__에는 데코레이터를 호출 한 함수의 이름이 들어갑니다.
            print(f"{func.__name__} 함수에서 데코레이터 호출")
            func()
            print(f"{func.__name__} 함수에서 데코레이터 끝")
    
        # wrapper 함수를 리턴합니다.
        return wrapper
        
        @decorator
        def decorator_func():
            print("decorator_func 함수 호출")
    
        decorator_func()
    
        # result output
        """
        decorator_func 함수에서 데코레이터 호출
        decorator_func 함수 호출
        decorator_func 함수에서 데코레이터 끝
        """