
1. 개요
Python은 강력한 데이터 처리 기능과 다양한 라이브러리를 제공하여 효율적인 프로그래밍을 가능하게 합니다. 본 글에서는 실행 시간 측정 데코레이터, 피보나치 수열 계산, 리스트 필터링, 문자열 단어 개수 카운팅, 행렬 전치, 소수 판별, 최소/최대값 찾기 등 다양한 기능을 Python 코드로 구현하는 방법을 설명합니다.
2. 실행 시간 측정 데코레이터 (@timer)
프로그램의 성능을 분석할 때 특정 함수의 실행 시간을 측정하는 것은 중요합니다. Python의 functools.wraps와 time 모듈을 활용하여 실행 시간을 출력하는 데코레이터를 만들어 봅시다.
import time
import functools
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function '{func.__name__}' executed in {end_time - start_time:.4f} seconds")
return result
return wrapper
• 이 데코레이터는 함수를 실행하기 전 start_time을 기록하고, 실행 후 end_time과 비교하여 실행 시간을 출력합니다.
• @functools.wraps(func)를 사용하여 함수의 메타데이터를 유지합니다.
3. 피보나치 수열 계산 (메모이제이션 적용)
피보나치 수열은 재귀로 구현할 수 있지만, 중복 계산이 많아 성능이 저하될 수 있습니다. 이를 해결하기 위해 functools.lru_cache를 사용하여 메모이제이션을 적용합니다.
@functools.lru_cache(maxsize=None)
def fibonacci(n: int) -> int:
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
• @functools.lru_cache(maxsize=None)를 사용하면 이전 계산 값을 저장하여 성능을 최적화할 수 있습니다.
• fibonacci(30)을 실행하면 30번째 피보나치 수를 빠르게 계산할 수 있습니다.
4. 리스트에서 짝수만 필터링하는 함수
리스트에서 짝수만 추출하는 기능을 구현해 보겠습니다.
from typing import List
def filter_even_numbers(numbers: List[int]) -> List[int]:
return list(filter(lambda x: x % 2 == 0, numbers))
• filter()와 lambda를 활용하여 리스트에서 짝수만 추출합니다.
• 예제 실행:
numbers = list(range(1, 21))
print("짝수 필터링 결과:", filter_even_numbers(numbers))
출력결과
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
5. 문자열을 단어 단위로 카운팅하는 함수
텍스트 내 단어 빈도를 계산하는 기능을 구현해 보겠습니다.
from typing import Dict
def word_count(text: str) -> Dict[str, int]:
words = text.lower().split()
word_freq = {}
for word in words:
word_freq[word] = word_freq.get(word, 0) + 1
return word_freq
• 입력된 문자열을 소문자로 변환한 후, 단어별 등장 횟수를 저장하는 딕셔너리를 생성합니다.
• 예제 실행:
text = "Python is fun and Python is powerful"
print("단어 개수 결과:", word_count(text))
출력결과
{'python': 2, 'is': 2, 'fun': 1, 'and': 1, 'powerful': 1}
6. 2차원 리스트(행렬) 전치 함수
행렬을 전치(transpose)하는 방법을 알아보겠습니다.
from typing import List
def transpose_matrix(matrix: List[List[int]]) -> List[List[int]]:
return list(map(list, zip(*matrix)))
• zip(*matrix)를 이용하여 행과 열을 변환한 후 리스트로 변환합니다.
• 예제 실행:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("전치 행렬 결과:", transpose_matrix(matrix))
출력결과
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
7. 소수 판별 함수
소수(prime number) 여부를 판별하는 함수입니다.
def is_prime(n: int) -> bool:
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
• 2부터 √n까지 나누어지는지 확인하여 소수를 판별합니다.
• 예제 실행:
primes = [n for n in range(1, 50) if is_prime(n)]
print("소수 리스트:", primes)
출력결과
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
8. 여러 개의 숫자를 받아서 최대값과 최소값 반환하는 함수
여러 개의 숫자를 입력받아 최소값과 최대값을 반환하는 함수를 작성합니다.
from typing import Tuple
def find_min_max(*args: int) -> Tuple[int, int]:
return min(args), max(args)
• 가변 인자(*args)를 받아 최소값과 최대값을 반환합니다.
• 예제 실행:
min_val, max_val = find_min_max(10, 5, 20, 3, 8)
print(f"최소값: {min_val}, 최대값: {max_val}")
출력결과
최소값: 3, 최대값: 20
9. 코드 실행 테스트
이제 모든 기능을 실행해 보겠습니다.
if __name__ == "__main__":
numbers = list(range(1, 21))
print("짝수 필터링 결과:", filter_even_numbers(numbers))
text = "Python is fun and Python is powerful"
print("단어 개수 결과:", word_count(text))
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("전치 행렬 결과:", transpose_matrix(matrix))
primes = [n for n in range(1, 50) if is_prime(n)]
print("소수 리스트:", primes)
min_val, max_val = find_min_max(10, 5, 20, 3, 8)
print(f"최소값: {min_val}, 최대값: {max_val}")
print("Fibonacci(30):", fibonacci(30))
10. 모든 코드 확인
import time
import functools
from typing import List, Dict, Tuple
# 실행 시간 측정 데코레이터
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function '{func.__name__}' executed in {end_time - start_time:.4f} seconds")
return result
return wrapper
# 피보나치 수열 계산 (메모이제이션 적용)
@functools.lru_cache(maxsize=None)
def fibonacci(n: int) -> int:
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
# 리스트에서 짝수만 필터링하는 함수
def filter_even_numbers(numbers: List[int]) -> List[int]:
return list(filter(lambda x: x % 2 == 0, numbers))
# 문자열을 단어 단위로 카운팅하는 함수
def word_count(text: str) -> Dict[str, int]:
words = text.lower().split()
word_freq = {}
for word in words:
word_freq[word] = word_freq.get(word, 0) + 1
return word_freq
# 2차원 리스트(행렬) 전치 함수
def transpose_matrix(matrix: List[List[int]]) -> List[List[int]]:
return list(map(list, zip(*matrix)))
# 소수 판별 함수
def is_prime(n: int) -> bool:
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
# 여러 개의 숫자를 받아서 최대값과 최소값 반환하는 함수
def find_min_max(*args: int) -> Tuple[int, int]:
return min(args), max(args)
# 실행 테스트
if __name__ == "__main__":
numbers = list(range(1, 21))
print("짝수 필터링 결과:", filter_even_numbers(numbers))
text = "Python is fun and Python is powerful"
print("단어 개수 결과:", word_count(text))
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("전치 행렬 결과:", transpose_matrix(matrix))
primes = [n for n in range(1, 50) if is_prime(n)]
print("소수 리스트:", primes)
min_val, max_val = find_min_max(10, 5, 20, 3, 8)
print(f"최소값: {min_val}, 최대값: {max_val}")
print("Fibonacci(30):", fibonacci(30))
출력결과
짝수 필터링 결과: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
단어 개수 결과: {'python': 2, 'is': 2, 'fun': 1, 'and': 1, 'powerful': 1}
전치 행렬 결과: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
소수 리스트: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
최소값: 3, 최대값: 20
Fibonacci(30): 832040
'코딩교육 > Python 초등교육에서 전문가까지' 카테고리의 다른 글
2단계 : 5. 리스트와 반복문 (리스트와 관련된 주요 메서드 - append(), remove(), sort() 등) (0) | 2025.03.23 |
---|---|
2단계 : 5. 리스트와 반복문 (리스트의 기본 개념과 생성) (0) | 2025.03.22 |
2단계 : 4. 함수 (함수의 가독성과 모듈화 - 왜 함수를 사용하는가 ?) (0) | 2025.03.20 |
2단계 : 4. 함수 (기본 매개변수와 키워드 매개변수) (0) | 2025.03.19 |
2단계 : 4. 함수 (매개변수와 반환값의 사용법) (0) | 2025.03.18 |