python #1 기본문법, 가상환경, 로깅 #
#2025-08-12
1. 기본문법 #
#1 break와 continue의 차이 (p.29)
# break
for i in range(10):
if i==5:
break
print(i)
# continue
for i in range(5):
if i==2:
continue
print(i)
- break
- 0부터 9까지 세는 반복문에서 i가 5가 되는 순간 break를 만나면 그 뒤의 숫자는 전혀 세지 않고 반복이 끝난다.
- continue
- 0부터 4까지 세는 반복문에서 i가 2인 경우 continue를 만나면 2를 출력하지 않고 바로 다음 숫자인 3으로 넘어가고 반복문 자체는 끝나지 않는다.
#
#2 가변 인자 (p.78)
- *args는 인자들을 하나의 튜플로 묶어서 받는다.
- **kwargs는 인자들을 하나의 딕셔너리로 묶어서 받는다.
mix_example(a, b, *args, **kwargs)
일때mix_example(1, 2, 3, 4, 5, name="철수", age=30)
- 1과 2는 매개변수 a와 b에 저장
- a:1, b:2
- 3, 4, 5는 args라는 튜플에 저장
- args: (3,4,5)
- name=“철수"와 age=30은 kwargs라는 딕셔너리에 저장
- kwargs: {’name’:‘철수’, ‘age’:30}
- 1과 2는 매개변수 a와 b에 저장
#
#3 클로저 (p.86)
def multiplier(factor):
def multiply(x):
return x*factor
return multiply
double = multiplier(2)
print(double(10)) #20
- multiplier(2)를 호출
- factor가 2로 고정된 multiply 함수가 만들어짐.
- 이 함수는 나중에 호출해도 2라는 값을 기억하고 있다.
- double(10)을 하면 10에 2를 곱한 20이 나온다.
#
2. 가상환경 #
#1 지금 환경을 그대로 뜨는 방법 (p.109)
- pip freeze > requirements.txt를 하면 현재 환경에 설치된 모든 패키지와 그 버전이 기록되고
- 다른 환경에서 똑같은 설정을 만들고 싶다면 pip install -r requirements.txt를 실행하면 된다.
#
#2 .env (p.115)
- 데이터베이스 비밀번호나 API 키처럼 코드에 직접 적으면 안 되는 값들은 .env라는 파일에 따로 저장하고 코드에서는 이 파일을 읽어서 사용하는 것이 안전하다.
- 사용법
- from dotenv import load_dotenv로 불러오고
- load_dotenv()를 실행하면 .env 파일 안의 값들이 환경 변수로 등록된다.
- os.getenv(“DB_USER”)로 필요한 값을 꺼낼 수 있다.
- 깃허브에 올릴때는 gitignore에 넣어야된다.
#
3. Logging 실습 #
문제
LOG_LEVEL=DEBUG
APP_NAME=MyCoolApp
.env를 위와같이 작성했을때 app.log에 다음 로그 출력하기
- INFO 레벨 메시지: “앱 실행 시작”
- DEBUG 레벨 메시지: “환경 변수 로딩 완료”
- ERROR 레벨 메시지: ZeroDivisionError 예외 발생 시 출력
#
코드
import os
import logging
from logging import StreamHandler, FileHandler
from dotenv import load_dotenv
def configure_logging(level, filename="app.log"): # 로그 파일명: app.log
"""
콘솔과 파일 모두에 로그를 출력하는 함수
"""
fmt = "%(asctime)s [%(levelname)s] %(message)s" # 로그 포맷: 시간 | 로그레벨 | 메시지
formatter = logging.Formatter(fmt, "%Y-%m-%d %H:%M:%S")
# 로그 출력
sh = StreamHandler() # 콘솔 출력 핸들러 생성
sh.setFormatter(formatter)
fh = FileHandler(filename, encoding="utf-8") # 파일 출력 핸들러 생성
fh.setFormatter(formatter)
logging.basicConfig(level=level, handlers=[sh, fh]) # 콘솔 + 파일 동시에 출력되도록 핸들러 구성
def main():
# 1) .env 파일 로드
load_dotenv()
# 2) 환경 변수에서 로그 레벨과 앱 이름 읽기
log_level = getattr(logging, os.getenv("LOG_LEVEL"), logging.INFO) # .env에서 LOG_LEVEL을 읽어오기
app_name = os.getenv("APP_NAME", "MyApp") # .env에서 APP_NAME을 읽어오기
# 3) 로깅 설정 적용
configure_logging(log_level) # configure_logging 함수: 콘솔 + 파일(app.log) 두 군데에 동시에 로그가 찍히도록 핸들러를 구성.
# 4) 로그 메시지 출력
logging.info("앱 실행 시작") # INFO 레벨
logging.debug(f"환경 변수 로딩 완료 (APP_NAME={app_name})") # DEBUG 레벨
# 5) 예외 발생 예시
try:
1 / 0 # ZeroDivisionError
except ZeroDivisionError:
logging.error("예외 발생 예시", exc_info=True) # ERROR 레벨로 예외 메시지와 스택 트레이스 출력
if __name__ == "__main__":
# main() 함수 실행
main()
#
결과
#app.log
2025-08-12 17:13:40 [INFO] 앱 실행 시작
2025-08-12 17:13:40 [DEBUG] 환경 변수 로딩 완료 (APP_NAME=MyCoolApp)
2025-08-12 17:13:40 [ERROR] 예외 발생 예시
Traceback (most recent call last):
File "/Users/yshmbid/Documents/home/github/Data-MLOps/env_logging_example/main.py", line 43, in main
1 / 0 # ZeroDivisionError
~~^~~
ZeroDivisionError: division by zero