Python#
다양한 특징을 가진 강력하고 유연한 프로그래밍 언어.
인터프리터 언어#
파이썬은 인터프리터 언어.
이는 코드가 한 줄씩 실행되며, 컴파일 과정 없이 바로 실행할 수 있다는 의미.
장점:
- 마치 대화를 하듯이 즉각적인 결과를 볼 수 있어서, 특히 학습과 디버깅에 매우 유용.
- 플랫폼 독립적으로 실행 가능
- REPL(대화형 셸)을 통한 빠른 테스트와 학습
단점:
- 컴파일 언어에 비해 실행 속도가 상대적으로 느림
- 런타임 에러가 실행 시점에서만 발견됨
예를 들어, 다음과 같은 코드를 바로 실행하고 결과를 확인할 수 있다:
1
2
3
4
| >>> x = 5
>>> y = 3
>>> print(x + y)
8
|
동적 타이핑#
파이썬은 변수의 타입을 미리 선언할 필요가 없다.
변수는 할당되는 값에 따라 자동으로 타입이 결정된다:
장점:
- 코드 작성이 빠르고 간편
- 유연한 프로그래밍 가능
- 프로토타이핑에 적합
단점:
- 타입 관련 오류가 런타임에 발생할 수 있음
- 대규모 프로젝트에서 유지보수가 어려울 수 있음
1
2
3
4
| # 같은 변수에 다른 타입의 값을 자유롭게 할당할 수 있습니다
x = 42 # 정수
x = "Hello" # 문자열
x = [1, 2, 3] # 리스트
|
객체 지향 프로그래밍 지원#
파이썬은 클래스와 객체를 사용한 객체 지향 프로그래밍을 완벽하게 지원한다:
장점:
- 클래스, 상속, 다형성 등 OOP 개념 완벽 지원
- 코드 재사용성과 유지보수성 향상
단점:
- 간단한 스크립트에 OOP를 과도하게 적용할 경우 복잡성 증가
1
2
3
4
5
6
7
8
9
10
| class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"
|
풍부한 표준 라이브러리와 생태계#
장점:
- 다양한 기능을 즉시 사용 가능
- 외부 라이브러리가 풍부
- 활발한 커뮤니티 지원
단점:
- 라이브러리 의존성 관리가 복잡할 수 있음
- 버전 호환성 문제 발생 가능
1
2
3
4
5
6
7
8
9
| # 데이터 분석
import pandas as pd
import numpy as np
# 웹 개발
from flask import Flask
# 머신러닝
from sklearn import linear_model
|
1
2
3
4
5
6
7
8
9
10
11
| # 가상 환경과 의존성 관리 도구 사용
"""
# requirements.txt 생성
pip freeze > requirements.txt
# 가상 환경 생성
python -m venv myenv
# 의존성 설치
pip install -r requirements.txt
"""
|
크로스 플랫폼 지원#
장점:
- 다양한 운영 체제에서 동일하게 실행 가능
- 코드의 이식성이 높음
단점:
문법적 특징#
들여쓰기를 통한 코드 블록 구분#
장점:
- 코드의 가독성이 높음
- 일관된 코드 스타일 강제
- 깔끔한 코드 구조
단점:
- 들여쓰기 오류로 인한 문법 에러 발생 가능
- 복사-붙여넣기 시 들여쓰기 깨질 수 있음
1
2
3
4
5
6
7
8
9
| def calculate_grade(score):
if score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
else:
return 'F'
|
리스트 컴프리헨션과 제너레이터 표현식#
장점:
- 간결하고 표현력 있는 코드 작성 가능
- 메모리 효율적인 처리 가능
- 함수형 프로그래밍 스타일 지원
단점:
- 과도한 사용 시 가독성 저하
- 복잡한 로직에서는 디버깅이 어려울 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 적절한 주석과 분리로 가독성 향상
# 복잡한 컴프리헨션은 일반 반복문으로 분리
numbers = [1, 2, 3, 4, 5]
# 간단한 경우 리스트 컴프리헨션 사용
squares = [x**2 for x in numbers]
# 복잡한 경우 일반 반복문 사용
filtered_squares = []
for x in numbers:
if x % 2 == 0:
if x**2 > 10:
filtered_squares.append(x**2)
|
다중 상속과 믹스인#
장점:
- 코드 재사용성 향상
- 유연한 클래스 설계 가능
- 기능의 조합이 용이
단점:
- 다이아몬드 문제 발생 가능
- 복잡한 상속 관계로 인한 유지보수 어려움
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 믹스인 패턴과 명시적 메서드 해결 순서 사용
class LoggerMixin:
def log(self, message):
print(f"[LOG] {message}")
class ServiceMixin:
def service_method(self):
self.log("Service method called")
class MyService(ServiceMixin, LoggerMixin):
pass
# MRO(Method Resolution Order) 확인
print(MyService.__mro__)
|
덕 타이핑#
장점:
- 유연한 인터페이스 구현
- 코드 재사용성 향상
- 테스트가 용이
단점:
- 타입 안정성이 낮을 수 있음
- 런타임 에러 발생 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 프로토콜과 추상 기본 클래스 사용
from typing import Protocol
from abc import ABC, abstractmethod
class Drawable(Protocol):
def draw(self) -> None: …
class Shape(ABC):
@abstractmethod
def draw(self) -> None:
pass
class Circle(Shape):
def draw(self) -> None:
print("Drawing circle")
|
파이썬의 단점과 해결 방안#
실행 속도#
인터프리터 언어의 특성상 컴파일 언어에 비해 실행 속도가 느리다.
해결 방안#
- Cython 사용: 파이썬 코드를 C로 변환하여 성능 향상
1
2
3
4
5
| # Cython 예시
%%cython
def fast_calculation(int x, int y):
cdef int result = x * y
return result
|
- NumPy 활용: 수치 계산을 최적화된 배열 연산으로 처리
1
2
3
4
5
| import numpy as np
# 일반 파이썬 리스트 대신 NumPy 배열 사용
array = np.array([1, 2, 3, 4, 5])
result = array * 2 # 빠른 벡터화 연산
|
GIL(Global Interpreter Lock)로 인한 멀티스레딩 제한#
GIL로 인해 멀티코어 CPU를 완전히 활용하기 어렵다.
해결 방안#
1
2
3
4
5
6
7
8
| from multiprocessing import Pool
def heavy_computation(x):
return x * x
if __name__ == '__main__':
with Pool(4) as p: # 4개의 프로세스 생성
result = p.map(heavy_computation, range(1000))
|
1
2
3
4
5
6
7
8
9
10
| import asyncio
async def async_task(name):
print(f'Task {name} starting')
await asyncio.sleep(1)
print(f'Task {name} completed')
async def main():
tasks = [async_task(f'Task_{i}') for i in range(3)]
await asyncio.gather(*tasks)
|
메모리 사용량#
동적 타이핑으로 인해 메모리 사용량이 많을 수 있다.
해결 방안#
1
2
3
4
5
6
7
8
| # 리스트 대신 제네레이터 사용
def number_generator(n):
for i in range(n):
yield i ** 2
# 메모리 효율적인 처리
for num in number_generator(1000000):
process(num)
|
1
2
3
4
5
6
| class MemoryEfficientClass:
__slots__ = ['name', 'age'] # 인스턴스 속성 제한
def __init__(self, name, age):
self.name = name
self.age = age
|
타입 안정성#
동적 타이핑으로 인해 런타임 에러가 발생할 수 있다.
해결 방안#
1
2
3
4
5
6
7
8
9
| from typing import List, Dict
def calculate_average(numbers: List[float]) -> float:
return sum(numbers) / len(numbers)
def process_user_data(data: Dict[str, str]) -> None:
name = data['name']
email = data['email']
print(f"Processing user {name} with email {email}")
|
1
2
| # 터미널에서 실행
mypy your_script.py
|
참고 및 출처#
Roadmap#
Basic Syntax Python의 기본 구문법은 코드의 가독성과 일관성을 높이기 위해 간결하고 명확한 규칙을 따른다.
Python 기본 구조 Python은 C나 Java와 유사한 부분이 있으면서도 독특한 규칙을 가지고 있으며, “한 가지 분명하고 명백한 방법"으로 문제를 해결하도록 설계되었다. Python의 문법은 들여쓰기를 통해 코드 블록을 구분하므로, 코드의 구조가 시각적으로 드러나고 가독성이 높아진다. 실행 방식: 인터랙티브 모드와 스크립트 모드 Python은 명령 프롬프트나 터미널에서 바로 코드를 입력할 수 있는 인터랙티브 모드와, .py 확장자를 가진 파일로 코드를 작성하여 실행하는 스크립트 모드를 지원한다.
...
Python Web Framework 동적 웹사이트, 웹 서비스 및 웹 애플리케이션의 개발을 지원하기 위해 만들어진 소프트웨어 프레임워크
정의와 목적:
웹 프레임워크는 개발자가 웹 애플리케이션을 더 빠르고 쉽게 구축할 수 있도록 도와주는 코드 라이브러리.
이는 신뢰성 있고 확장 가능하며 유지보수가 용이한 웹 애플리케이션을 구축하기 위한 기본 패턴을 제공.
주요 기능:
웹 프레임워크는 다음과 같은 일반적인 기능을 제공합니다:
URL 라우팅 입력 폼 관리 및 유효성 검사 템플릿 엔진을 통한 HTML, XML, JSON 등의 출력 설정 데이터베이스 연결 구성 및 ORM(Object-Relational Mapper)을 통한 데이터 조작 웹 보안 (CSRF, SQL 인젝션, XSS 등의 공격 방지) 세션 저장 및 검색 유형:
웹 프레임워크는 크게 두 가지 유형으로 나눌 수 있다:
...
PEP (Python Enhancement Proposal) 파이썬 언어의 새로운 기능, 라이브러리 개선, 스타일 가이드 등에 관한 제안을 문서화한 것.
PEP는 파이썬 커뮤니티가 파이썬 언어를 개선하기 위해 아이디어를 공유하고 논의하는 공식적인 수단으로, Python Software Foundation(PSF)에 의해 관리된다.
PEP Types 해당 PEP의 목적과 성격을 나타낸다.
약어 유형 설명 예시 PEP 번호 및 제목 I Informational 파이썬 생태계와 관련된 배경, 가이드라인 또는 기타 정보를 제공하는 비규범적(non-normative) PEP입니다. PEP 20 - The Zen of Python P Process 파이썬 커뮤니티의 프로세스, 워크플로우 또는 거버넌스에 대한 변경을 설명하거나 제안하는 규범적(normative) PEP입니다. PEP 1 - PEP Purpose and Guidelines S Standards Track 파이썬에 새로운 기능을 추가하거나, CPython의 구현 변경 또는 생태계의 상호운용 표준을 제안하는 규범적 PEP입니다. PEP 484 - Type Hints PEP Status 약어 상태 설명 A Accepted 구현을 위해 수락된 규범적 제안입니다. A Active 현재 유효한 정보 제공 지침이거나 사용 중인 프로세스입니다. D Deferred 현재는 비활성 상태이지만, 추후 다시 논의될 수 있는 초안입니다. Draft 현재 활발히 논의 및 수정 중인 제안입니다. F Final 수락되어 구현이 완료되었거나 더 이상 활성 상태가 아닌 제안입니다. P Provisional 잠정적으로 수락되었지만 추가적인 피드백이 필요한 상태입니다. R Rejected 공식적으로 거부되어 수락되지 않을 제안입니다. S Superseded 다른 후속 PEP에 의해 대체된 제안입니다. W Withdrawn 제안자나 저자에 의해 고려 대상에서 제외된 제안입니다. 주요 PEP 종류 PEP 제목 유형 상태 주요 내용 적용 버전 8 Style Guide for Python Code Style Guide Active Python 코드 스타일 가이드 모든 버전 20 The Zen of Python Informational Active Python 설계 철학 2.0+ 257 Docstring Conventions Informational Active 문서화 문자열 규칙 모든 버전 405 Python Virtual Environments Standards Track Final 가상 환경 생성 및 관리 3.3+ 443 Single-dispatch Generic Functions Standards Track Final 인자 타입별 함수 오버로딩 3.4+ 484 Type Hints Standards Track Final 타입 힌트 문법 3.5+ 3000 Python 3000 Informational Final Python 3.0 개발 가이드라인 3.0 3101 Advanced String Formatting Standards Track Final 새로운 문자열 포매팅 2.6, 3.0+ 3333 Python Web Server Gateway Interface v1.0.1 Informational Final 웹 서버와 애플리케이션 간 인터페이스 3.2+ 492 Coroutines with Async and Await Syntax Standards Track Final async/await 구문 3.5+ 498 Literal String Interpolation Standards Track Final f-문자열 3.6+ 557 Data Classes Standards Track Final @dataclass 데코레이터 3.7+ 572 Assignment Expressions Standards Track Final 할당 표현식 (:=) 3.8+ 649 Deferred Evaluation Of Annotations Using Descriptors Standards Track Accepted 주석의 지연 평가 3.10+ 695 Type Parameter Syntax Standards Track Accepted 제네릭 문법 개선 3.12 (예정) 701 Syntactic Formalization of F-strings Standards Track Accepted f-문자열 문법 개선 3.12 (예정) 702 Marking Deprecations Using the Type System Standards Track Accepted deprecation 마킹 3.13 (예정) 703 Making the Global Interpreter Lock Optional in CPython Standards Track Accepted 선택적 GIL 3.13 (예정) 749 Implementing PEP 649 Standards Track Draft PEP 649 구현 보완 3.14 (예정) 750 Tag Strings Standards Track Draft 태그 문자열 3.14 (예정) 참고 및 출처