본문 바로가기
AI 오케스트레이션 프리코스

SK네트웍스 Family 엔코아 AI 오케스트레이션 프리코스 4|파이썬 반복문·함수·리스트 컴프리헨션·람다

by 랩보다 AI 더 잘해지기 2026. 8. 3.
728x90

 

파이썬 기초 문법을 다루는 네 번째 프리코스에서는 반복되는 작업을 효율적으로 처리하는 방법과 코드를 기능별로 나누어 재사용하는 방법을 배웠다.

이번 학습의 중심은 for문과 while문을 이용한 반복 처리, 함수의 정의와 호출, 파이썬이 기본으로 제공하는 내장 함수였다. 여기에 리스트 컴프리헨션과 람다 표현식까지 살펴보면서 짧고 효율적인 코드를 작성하는 방법도 함께 익혔다.

처음에는 각각 별개의 문법처럼 느껴졌지만, 모두 코드의 중복을 줄이고 유지보수를 쉽게 만든다는 공통점이 있었다.

반복문이 필요한 이유

같은 문장을 1,000번 출력해야 한다면 print()를 1,000줄 작성할 수도 있다. 하지만 출력할 문장을 수정해야 한다면 모든 줄을 하나씩 변경해야 한다.

이처럼 같은 작업을 여러 번 실행해야 할 때 사용하는 것이 반복문이다. 반복문을 활용하면 반복 횟수나 조건만 지정하여 같은 코드 블록을 여러 번 실행할 수 있다.

파이썬에서 대표적으로 사용하는 반복문은 다음 두 가지다.

  • for문: 반복할 대상이나 횟수가 정해져 있을 때 사용
  • while문: 특정 조건이 참인 동안 계속 반복할 때 사용

for문과 range() 함수

for문은 문자열, 리스트, 튜플처럼 여러 요소를 가진 데이터에서 값을 하나씩 꺼내 반복해서 처리한다.

for number in range(5):
    print(number)

실행 결과는 다음과 같다.

0
1
2
3
4

range(5)는 0부터 4까지의 정수를 차례로 만들어 준다. 괄호 안에 작성한 5는 포함되지 않는다는 점이 중요하다.

range()는 다음과 같은 형태로도 사용할 수 있다.

range(시작값, 끝값, 증감값)

예를 들어 2부터 시작해 100보다 작은 짝수를 만들고 싶다면 다음과 같이 작성할 수 있다.

numbers = list(range(2, 100, 2))
print(numbers)

range()의 기본 시작값은 0이고 기본 증감값은 1이다. 끝값은 반드시 작성해야 하며, 작성한 끝값은 결과에 포함되지 않는다.

또한 range 객체는 리스트처럼 연속된 값을 다룰 수 있지만, 처음부터 모든 값을 메모리에 저장하는 리스트와는 차이가 있다. 필요한 시점에 값을 하나씩 만들어 사용하기 때문에 큰 범위를 반복할 때 메모리를 비교적 효율적으로 사용할 수 있다.

이터러블과 이터레이션

for문을 이해하려면 이터러블이라는 개념도 알아야 한다.

이터러블(iterable)은 값을 한 번에 하나씩 꺼낼 수 있는 반복 가능한 객체다. 지금까지 배운 자료형 중에서는 다음과 같은 것들이 해당한다.

  • 문자열
  • 리스트
  • 튜플
  • 딕셔너리
  • 집합
  • range 객체
fruits = ["apple", "banana", "orange"]

for fruit in fruits:
    print(fruit)

for문은 fruits에서 값을 하나씩 꺼내 fruit 변수에 저장한다. 그리고 값을 하나 꺼낼 때마다 들여쓰기 된 코드 블록을 한 번씩 실행한다.

이처럼 반복 가능한 객체에서 값을 하나씩 꺼내 처리하는 과정을 이터레이션이라고 한다.

while문과 조건 반복

while문은 오른쪽에 작성한 조건식이 True인 동안 코드 블록을 계속 실행한다.

count = 0

while count < 5:
    print(count)
    count += 1

실행 순서는 다음과 같다.

  1. count < 5가 참인지 확인한다.
  2. 조건이 참이면 들여쓰기 된 코드를 실행한다.
  3. 코드 실행이 끝나면 다시 조건식으로 돌아간다.
  4. 조건이 거짓이 되면 반복을 종료한다.

while문을 사용할 때 가장 주의해야 할 것은 무한 반복이다. 반복문 안에서 조건에 사용하는 값을 변경하지 않으면 조건이 계속 참으로 남을 수 있다.

count = 0

while count < 5:
    print(count)

위 코드에서는 count가 계속 0이므로 반복이 끝나지 않는다. 따라서 반복문 안에서 count += 1과 같이 조건이 언젠가 거짓이 되도록 값을 변경해야 한다.

break와 continue

반복문 안에서는 break와 continue를 사용해 반복의 흐름을 조절할 수 있다.

break는 현재 반복문을 즉시 종료한다.

for number in range(10):
    if number == 5:
        break

    print(number)

위 코드는 숫자가 5가 되는 순간 반복문을 종료하기 때문에 0부터 4까지만 출력한다.

continue는 현재 반복만 건너뛰고 다음 반복으로 이동한다.

for number in range(5):
    if number == 2:
        continue

    print(number)

이 경우 2를 출력하는 과정만 건너뛰기 때문에 0, 1, 3, 4가 출력된다.

반복문에서 아무 작업도 작성하지 않고 문법의 형태만 먼저 만들어 두고 싶다면 pass를 사용할 수도 있다.

for number in range(5):
    pass

함수가 필요한 이유

함수는 특정 작업을 수행하는 코드를 하나의 이름으로 묶어 놓은 것이다. 반복되는 코드를 함수로 만들면 필요할 때마다 함수의 이름을 호출하여 같은 작업을 다시 실행할 수 있다.

함수는 다음과 같은 장점이 있다.

  • 반복되는 코드를 줄일 수 있다.
  • 기능별로 코드를 나눌 수 있다.
  • 수정해야 할 부분을 쉽게 찾을 수 있다.
  • 같은 기능을 여러 곳에서 재사용할 수 있다.
  • 프로그램의 유지보수가 편해진다.

파이썬에서는 def 키워드로 함수를 정의한다.

def add(a, b):
    return a + b

위 코드에서 각 부분의 역할은 다음과 같다.

  • def: 함수를 정의하는 키워드
  • add: 함수 이름
  • a, b: 함수가 값을 전달받는 매개변수
  • return: 연산 결과를 함수 바깥으로 반환하는 키워드

정의한 함수는 함수 이름 뒤에 소괄호를 붙여 호출한다.

result = add(5, 3)
print(result)

5는 a에 전달되고 3은 b에 전달된다. 함수 내부에서 a + b가 계산되고, 그 결과인 8이 return을 통해 함수가 호출된 자리로 돌아온다.

사칙연산 함수 만들기

강의에서는 함수의 정의와 호출 과정을 이해하기 위해 덧셈, 뺄셈, 곱셈, 나눗셈 함수를 예제로 살펴봤다.

def add(a, b):
    """두 개의 숫자를 더한 값을 반환합니다."""
    return a + b


def subtract(a, b):
    """두 개의 숫자를 뺀 값을 반환합니다."""
    return a - b


def multiply(a, b):
    """두 개의 숫자를 곱한 값을 반환합니다."""
    return a * b


def divide(a, b):
    """두 개의 숫자를 나눈 값을 반환합니다."""
    return a / b

함수는 정의만 해서는 실행되지 않는다. 필요한 값을 전달하면서 직접 호출해야 한다.

add_result = add(5, 3)
subtract_result = subtract(5, 3)
multiply_result = multiply(a=5, b=3)
divide_result = divide(10, b=2)

함수에 값을 전달하는 방법은 크게 두 가지다.

  • 위치 인자: 작성된 순서에 따라 값을 전달
  • 키워드 인자: 매개변수의 이름을 지정하여 값을 전달

두 방식을 함께 사용한다면 위치 인자를 먼저 작성하고, 그다음에 키워드 인자를 작성해야 한다.

독스트링과 help() 함수

함수 안의 첫 번째 줄에 삼중 따옴표를 사용하면 함수에 대한 설명을 작성할 수 있다. 이를 독스트링(docstring)이라고 한다.

def add(a, b):
    """두 개의 숫자를 더한 값을 반환합니다."""
    return a + b

작성한 독스트링은 help()를 이용해 확인할 수 있다.

help(add)

__doc__ 속성으로도 독스트링만 직접 조회할 수 있다.

print(add.__doc__)

직접 만든 함수뿐 아니라 파이썬 내장 함수의 사용법도 같은 방식으로 확인할 수 있다.

help(len)
help(print)
help(max)

함수의 사용법이 기억나지 않을 때마다 인터넷에서 검색하기보다 help()를 먼저 활용하는 습관을 들이면 좋을 것 같다.

파이썬 내장 함수

내장 함수는 파이썬 인터프리터에 기본으로 포함되어 있어 별도의 모듈을 불러오지 않아도 바로 사용할 수 있는 함수다.

지금까지 사용했던 print(), input(), len()도 모두 내장 함수에 해당한다.

이번 강의에서 살펴본 주요 내장 함수는 다음과 같다.

내장 함수역할

int() 값을 정수형으로 변환
str() 값을 문자열로 변환
list() 값을 리스트로 변환
tuple() 값을 튜플로 변환
set() 값을 집합으로 변환
bool() 값을 불리언으로 변환
max() 가장 큰 값을 반환
min() 가장 작은 값을 반환
abs() 절댓값을 반환
sum() 여러 숫자의 합계를 반환
len() 객체의 길이 또는 요소 개수를 반환
type() 값의 자료형을 반환
range() 일정한 범위의 정수를 생성
round() 숫자를 반올림
print() 값을 화면에 출력
input() 사용자에게 값을 입력받음
help() 함수나 객체의 사용법을 확인
map() 각 요소에 같은 함수를 적용
filter() 조건에 맞는 요소만 선택

이러한 내장 함수를 잘 활용하면 직접 모든 기능을 처음부터 만들지 않아도 되기 때문에 코드를 더욱 빠르고 간결하게 작성할 수 있다.

리스트 컴프리헨션

리스트 컴프리헨션은 반복 가능한 객체에서 값을 하나씩 꺼내 새로운 리스트를 만드는 문법이다.

일반적인 for문으로 리스트를 만들면 다음과 같이 작성할 수 있다.

numbers = []

for number in range(1, 10):
    numbers.append(number)

리스트 컴프리헨션을 사용하면 같은 작업을 한 줄로 표현할 수 있다.

numbers = [number for number in range(1, 10)]

기본 구조는 다음과 같다.

[표현식 for 변수 in 반복할_객체]

반복문에서 값을 하나씩 꺼낸 다음, 앞쪽의 표현식을 계산한 결과가 새로운 리스트의 요소로 들어간다.

조건식을 추가하면 필요한 값만 선택할 수도 있다.

even_numbers = [
    number
    for number in range(10)
    if number % 2 == 0
]

위 코드는 0부터 9까지의 숫자 중 짝수만 리스트에 담는다.

표현식에서 값을 가공하는 것도 가능하다.

squared_even_numbers = [
    number ** 2
    for number in range(10)
    if number % 2 == 0
]

실행 결과는 다음과 같다.

[0, 4, 16, 36, 64]

리스트 컴프리헨션은 리스트를 간결하게 생성할 때 유용하지만, 반복문과 조건이 여러 번 중첩되면 오히려 읽기 어려워질 수 있다. 코드가 복잡해진다면 한 줄로 줄이는 것보다 일반적인 for문을 사용하는 편이 가독성에 더 좋다.

또한 리스트를 만드는 것이 목적일 때 사용하는 문법이므로, 단순히 값을 출력하려고 표현식 자리에 print()를 작성하는 것은 적절하지 않다. print()는 결과로 None을 반환하기 때문에 None만 담긴 리스트가 만들어질 수 있다.

람다 표현식

람다는 이름 없이 한 줄로 작성하는 간단한 함수다. 그래서 익명 함수라고도 부른다.

기본 구조는 다음과 같다.

lambda 매개변수: 표현식

숫자를 두 배로 만드는 람다 표현식은 다음과 같이 작성할 수 있다.

lambda number: number * 2

람다 표현식을 변수에 저장하면 일반 함수처럼 호출할 수 있다.

twice = lambda number: number * 2

print(twice(10))

람다는 한 줄의 표현식으로 작성할 수 있는 간단한 작업에 적합하다. 여러 줄의 코드가 필요하거나 중간 변수를 만들어야 한다면 def를 사용해 일반 함수로 작성하는 편이 좋다.

map()과 람다 활용하기

map()은 반복 가능한 객체의 각 요소에 같은 함수를 적용한다.

numbers = [1, 2, 3, 4, 5]

result = map(
    lambda number: number * 2,
    numbers,
)

print(list(result))

실행 결과는 다음과 같다.

[2, 4, 6, 8, 10]

map()은 결과를 리스트가 아닌 map 객체로 반환한다. 따라서 결과를 리스트 형태로 확인하려면 list()로 변환해야 한다.

두 개 이상의 반복 가능한 객체를 함께 전달할 수도 있다.

a = [0, 1, 2, 3, 4, 5]
b = [0, 2, 4, 6, 8, 10]

result = map(
    lambda x, y: x + y,
    a,
    b,
)

print(list(result))

각 리스트의 같은 위치에 있는 값이 차례로 x와 y에 전달되고, 두 값을 더한 결과가 새로운 요소로 만들어진다.

filter()와 람다 활용하기

filter()는 반복 가능한 객체에서 조건을 만족하는 요소만 골라낸다. 첫 번째 인자로 전달하는 함수는 각 요소를 검사한 후 True 또는 False를 반환해야 한다.

numbers = [3, 8, 20, 10, 7, 0, 9]

result = filter(
    lambda number: 0 < number < 10 and number % 3 == 0,
    numbers,
)

print(list(result))

위 코드는 0보다 크고 10보다 작으면서 3으로 나누어떨어지는 숫자만 선택한다.

map()은 각 요소를 변환할 때 사용하고, filter()는 조건에 맞는 요소를 선택할 때 사용한다는 차이가 있다.

짧은 코드보다 읽기 쉬운 코드

이번 강의에서는 여러 작업을 한 줄로 줄이는 문법을 배웠지만, 무조건 짧은 코드가 좋은 코드는 아니라는 점도 중요했다.

리스트 컴프리헨션이나 람다 표현식은 간단한 작업에서는 편리하다. 하지만 조건문과 반복문이 여러 번 중첩되면 코드를 이해하기 어려워질 수 있다.

코드를 작성할 때는 다음 기준을 함께 고려해야 한다.

  • 다른 사람이 코드를 쉽게 이해할 수 있는가?
  • 나중에 다시 봐도 동작을 파악할 수 있는가?
  • 수정해야 할 부분을 쉽게 찾을 수 있는가?
  • 같은 코드가 불필요하게 반복되고 있지는 않은가?

한 줄로 줄이는 것보다 기능을 명확하게 전달하고 유지보수하기 쉬운 코드를 작성하는 것이 더 중요하다는 점을 배울 수 있었다.

이번 학습의 핵심 정리

이번 프리코스에서는 반복문부터 함수, 리스트 컴프리헨션, 람다 표현식까지 파이썬 코드를 효율적으로 작성하는 데 필요한 문법을 폭넓게 배웠다.

for문은 반복 가능한 객체에서 값을 하나씩 꺼내 처리하고, while문은 조건이 참인 동안 작업을 반복한다. 함수는 반복되는 코드를 하나의 기능으로 분리하여 필요할 때마다 재사용하게 해준다.

파이썬이 제공하는 내장 함수를 이용하면 자주 필요한 기능을 직접 만들지 않고 바로 사용할 수 있다. help()와 독스트링을 활용하면 함수의 사용법과 목적도 코드 안에서 확인할 수 있다.

리스트 컴프리헨션과 람다는 간단한 반복 처리와 함수를 짧게 표현할 수 있는 편리한 문법이었다. 다만 코드가 복잡해질 때는 일반적인 반복문과 함수로 풀어 작성하는 것이 더 읽기 쉽다는 점도 함께 기억해야겠다.

지금까지는 문법 하나하나를 익히는 데 집중했다면, 이번 학습부터는 중복을 줄이고 코드를 구조적으로 작성하는 방법을 배우기 시작한 느낌이었다. 앞으로 직접 여러 예제를 작성하면서 반복문의 흐름, 함수의 반환값, 위치·키워드 인자, 리스트 컴프리헨션과 람다의 적절한 사용 시점을 익혀야겠다.

댓글