문장(Statement)부터 함수(Function), 콜 스택, 범용 반복 함수까지 총정리
앞서 파이썬의 4대 컬렉션 자료형(리스트, 튜플, 집합, 딕셔너리)을 통해 데이터를 효율적으로 조직하는 방법을 배웠습니다. 이번 글에서는 파이썬 프로그램을 구성하는 기본 뼈대인 문장과 함수의 개념, 함수가 메모리에서 실행되는 원리인 콜 스택(Call Stack), 그리고 데이터 처리를 극대화하는 범용 반복 내장 함수까지 완벽하게 정복해 보겠습니다.
1. 문장 (Statement)의 개념과 구성
문장(Statement)은 파이썬 인터프리터가 실행할 수 있는 하나의 완전한 명령을 의미합니다. 파이썬 프로그램은 위에서부터 아래로 순차적으로 실행되는 문장들의 집합입니다.
-
변수 할당문:
x = 5 -
조건문:
if x > 0: print("양수") -
반복문:
for i in range(5): print(i) -
함수 호출문:
print("Hello")
여러 문장 표현과 줄바꿈
세미콜론(;)을 사용해 한 줄에 여러 문장을 적을 수 있으며, 역슬래시(\)나 괄호((), [], {})를 이용해 긴 문장을 여러 줄로 안전하게 나누어 쓸 수 있습니다.
# 긴 문장 줄바꿈 예시
total_sum = (1 + 2 + 3 +
4 + 5 + 6 +
7 + 8 + 9)
2. 함수 (Function)의 정의와 활용
함수(Function)란 특정한 작업을 수행하는 문장들을 하나의 단위로 묶어 놓은 코드 블록으로, 재사용성을 높이고 코드의 중복을 줄여줍니다.
2.1 함수 정의 기본 구조
def 함수이름(매개변수):
"""문서 문자열 (Docstring - help()나 __doc__으로 확인 가능)"""
# 실행할 코드 블록
return 반환값
2.2 다양한 인수(Arguments) 처리 방식
파이썬은 함수에 인수를 전달할 때 매우 유연한 문법을 제공합니다.
-
기본값 매개변수: 인수가 전달되지 않을 때 사용할 기본값을 지정합니다. (
def greet(name, message="Hello"):) -
가변 인수 (
*args): 개수가 정해지지 않은 여러 개의 인수를 튜플 형태로 받습니다. (가변 인수는 통상 하나만 지정할 수 있습니다.) -
키워드 가변 인수 (
**kwargs): 키=값 형태의 인수를 딕셔너리 형태로 무제한 받습니다.
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=25) # 출력: name: Alice, age: 25
3. 함수 호출과 콜 스택 (Call Stack)의 원리
프로그램이 실행될 때 함수가 어떤 순서로 호출되고 종료되는지 관리하는 핵심 메모리 구조가 바로 콜 스택(Call Stack)입니다.
-
LIFO (Last-In, First-Out, 후입선출) 원리:
-
푸시 (Push): 새로운 함수가 호출되면 해당 함수의 정보(복귀 주소, 지역 변수, 매개변수 등이 담긴 스택 프레임)가 스택의 가장 위에 쌓입니다.
-
팝 (Pop): 함수가 실행을 마치고
return되면 스택에서 제거되며, 이전 복귀 지점으로 돌아갑니다.
-
def function_a():
print("Start A")
function_b()
print("End A")
def function_b():
print("Start B")
# 콜 스택 구조: [function_a -> function_b] 순으로 적재됨
디버깅 과정에서 에러가 발생했을 때 출력되는 Traceback(콜 스택 추적 경로)을 통해 어느 함수의 어느 위치에서 문제가 생겼는지 정확히 파악할 수 있습니다.
4. 함수의 종류 및 표준 라이브러리 활용
4.1 소속 및 정의 방식에 따른 분류
-
사용자 정의 함수:
def키워드로 직접 만드는 함수 -
람다 함수 (Lambda):
lambda x, y: x + y형태의 한 줄짜리 익명 함수 -
제너레이터 함수:
yield키워드를 사용하여 값을 한 번에 반환하지 않고 필요할 때마다 하나씩 생성(지연 평가)하는 메모리 효율적인 함수 -
내장 함수 (Built-in):
print(),len(),type(),range()등 기본 제공 함수 -
메소드 (Methods): 특정 객체(문자열, 리스트 등)에 종속된 함수 (
my_list.append()) -
모듈 함수: 외부 라이브러리나 내장 모듈을
import하여 사용하는 함수
4.2 유용한 파이썬 표준 라이브러리 모듈
-
math: 수학 연산 (math.sqrt(),math.pi) -
random: 난수 생성 및 무작위 선택 (random.randint(),random.choice()) -
datetime: 날짜 및 시간 관리 (datetime.datetime.now()) -
os/sys: 운영체제 제어 및 인터프리터 정보 확인 (os.getcwd(),sys.version)
5. 데이터 처리를 위한 범용 반복 함수
컬렉션 데이터를 다룰 때 for 루프와 함께 사용하면 코드의 생산성을 극대화해 주는 강력한 내장 유틸리티 함수들입니다.
| 함수 | 설명 | 활용 예시 |
enumerate() |
반복 시 인덱스와 요소를 쌍으로 반환 | for i, name in enumerate(names): |
range() |
연속된 정수 시퀀스 생성 (메모리 효율적) | for i in range(10): |
zip() |
여러 이터러블을 병렬로 묶어 순회 | for k, v in zip(keys, values): |
map() |
각 요소에 동일한 함수 일괄 적용 | list(map(int, string_list)) |
filter() |
조건이 참인 항목만 필터링 | list(filter(lambda x: x > 0, nums)) |
# enumerate 예시: 순위 매기기
names = ['Kim', 'Lee', 'Park']
for rank, name in enumerate(names, start=1):
print(f"{rank}등: {name}")
# zip 예시: 두 리스트 병렬 처리
scores = [90, 85, 92]
for name, score in zip(names, scores):
print(f"{name의 점수: {score}점}")