문장(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}점}")

답글 남기기