Post

파이썬 공부

파이썬 공부

들어가며

지난 글에서는 부모 클래스의 특징을 물려받아 코드를 효율적으로 재사용하는 객체 지향의 핵심, 상속(Inheritance)에 대해 배웠습니다. 이제 우리는 클래스를 설계하고 확장하며 매우 체계적으로 프로그램을 구조화하는 방법을 알게 되었습니다.

지금까지 우리는 파이썬의 핵심 문법부터 시작해 데이터 구조, 함수, 모듈, 클래스, 예외 처리에 이르기까지, 하나의 완성된 프로그램을 만드는 데 필요한 거의 모든 기초 지식을 다루었습니다. 이제부터는 우리가 이미 알고 있는 지식을 더 효율적이고 ‘파이썬답게’ 사용할 수 있도록 도와주는 여러 도구와 기법들을 탐험해 볼 시간입니다.

그 첫걸음으로, 우리가 지금까지 print(), len(), int()처럼 무심코 사용해왔던 내장 함수(Built-in Functions) 중에서, 알아두면 코드를 놀랍게 간결하고 강력하게 만들어주는 몇 가지 유용한 함수들을 집중적으로 알아보겠습니다. 이 함수들은 별도의 import 과정 없이 언제 어디서든 바로 사용할 수 있는 파이썬의 기본 보물 상자와도 같습니다.

숫자 리스트를 다루는 삼총사: sum, max, min

숫자로 이루어진 리스트가 있을 때, 그 합계나 최댓값, 최솟값을 구해야 하는 경우는 매우 흔합니다. 물론 for 반복문을 이용해 직접 계산할 수도 있지만, 파이썬은 훨씬 간단한 방법을 제공합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
scores =

# 리스트의 합계 구하기
total_score = sum(scores)
print(f"총점: {total_score}") # 출력: 총점: 418

# 리스트에서 최댓값 찾기
highest_score = max(scores)
print(f"최고 점수: {highest_score}") # 출력: 최고 점수: 100

# 리스트에서 최솟값 찾기
lowest_score = min(scores)
print(f"최저 점수: {lowest_score}") # 출력: 최저 점수: 65

sum(), max(), min() 함수를 사용하면 단 한 줄의 코드로 복잡한 반복 작업을 대체할 수 있습니다. 코드가 간결해지는 것은 물론, 내부적으로도 매우 효율적으로 동작합니다.

데이터를 정렬하는 세련된 방법: sorted()

리스트의 요소들을 순서대로 정렬해야 할 때 sorted() 함수를 사용할 수 있습니다. 이 함수는 숫자뿐만 아니라 문자열 등 순서를 비교할 수 있는 모든 데이터 타입에 사용 가능합니다.

sorted() 함수의 가장 중요한 특징은 원본 리스트는 그대로 둔 채, 정렬된 새로운 리스트를 반환한다는 점입니다. 이는 원본 데이터를 훼손하지 않는 안전한 방법입니다.

1
2
3
4
5
6
7
8
9
10
11
numbers =

# sorted() 함수를 사용해 정렬
sorted_numbers = sorted(numbers)

print(f"원본 리스트: {numbers}")         # 출력: 원본 리스트:
print(f"정렬된 새 리스트: {sorted_numbers}") # 출력: 정렬된 새 리스트:

# 내림차순으로 정렬하고 싶을 때는 reverse=True 옵션을 사용
desc_numbers = sorted(numbers, reverse=True)
print(f"내림차순 정렬: {desc_numbers}")    # 출력: 내림차순 정렬:

** 잠깐: list.sort()sorted()의 차이점** 리스트에는 .sort() 라는 자체 메소드도 있습니다. sorted()와 달리 .sort()는 새로운 리스트를 반환하지 않고 원본 리스트 자체를 직접 수정합니다. 원본을 유지해야 한다면 sorted()를, 원본을 바꿔도 된다면 .sort()를 사용하는 것이 일반적입니다.

반복문에 날개를 달아주는 enumerate

for 반복문으로 리스트를 순회할 때, 우리는 종종 “현재 몇 번째 요소를 처리하고 있는지” 궁금할 때가 많습니다. 기존에는 range(len(list))와 같은 방식으로 인덱스를 따로 만들어 사용해야 했습니다.

1
2
3
4
# 기존 방식
fruits = ['사과', '바나나', '딸기']
for i in range(len(fruits)):
    print(f"{i}번 인덱스: {fruits[i]}")

enumerate() 함수는 이 과정을 훨씬 우아하게 만들어 줍니다. 이 함수는 리스트(와 같은 반복 가능한 객체)를 입력으로 받아, 인덱스 번호와 해당 요소를 하나의 쌍으로 묶어서 돌려줍니다.

1
2
3
4
# enumerate 사용 방식
fruits = ['사과', '바나나', '딸기']
for index, fruit in enumerate(fruits):
    print(f"{index}번 인덱스: {fruit}")

코드가 훨씬 직관적이고 ‘파이썬답게’ 변했습니다. 인덱스가 필요할 땐 주저 없이 enumerate를 사용하는 것이 좋습니다.

두 개의 리스트를 나란히 묶는 zip

만약 학생들의 이름이 담긴 리스트와, 그 학생들의 점수가 순서대로 담긴 리스트가 따로 있다면 어떨까요? 이 둘을 짝지어 “A학생의 점수는 90점”과 같이 처리하고 싶을 때 zip() 함수가 활약합니다.

zip() 함수는 여러 개의 리스트(나 반복 가능한 객체들)를 받아, 각 리스트의 같은 순서에 있는 요소들을 하나의 튜플로 묶어줍니다. 마치 두 개의 지퍼(zipper)가 맞물리듯 동작합니다.

1
2
3
4
5
names = ['Alice', 'Bob', 'Charlie']
scores =

for name, score in zip(names, scores):
    print(f"{name}의 점수는 {score}점 입니다.")

zip은 길이가 다른 리스트들을 묶을 경우, 더 짧은 리스트의 길이에 맞춰 동작하고 나머지 요소들은 무시합니다.

마무리하며

이번 글에서는 파이썬에 기본적으로 내장되어 있어 언제든 바로 사용할 수 있는 강력하고 유용한 내장 함수들에 대해 알아보았습니다. 숫자 데이터를 위한 sum(), max(), min(), 안전한 정렬을 위한 sorted(), 반복문을 더 편리하게 만들어주는 enumeratezip까지, 이 함수들을 적재적소에 사용하면 코드를 훨씬 간결하고 효율적으로 작성할 수 있습니다.

파이썬이 제공하는 내장 함수들은 이것들 외에도 매우 다양합니다. 하지만 오늘 배운 함수들은 실제 프로그래밍 현장에서 가장 빈번하게 사용되는 것들이므로 확실히 익혀두는 것이 좋습니다.

enumeratezip을 사용하면 반복문을 더 세련되게 만들 수 있었습니다. 그렇다면 혹시, 반복문을 사용하여 새로운 리스트를 만드는 과정 자체를 단 한 줄로, 더 압축적이고 우아하게 표현할 방법은 없을까요?

다음 글에서는 for 반복문과 if 조건문을 한 줄에 녹여내어 리스트를 생성하는, 파이썬의 매우 강력하고 독특한 기능인 리스트 컴프리헨션(List Comprehension)에 대해 알아보겠습니다.

This post is licensed under CC BY 4.0 by the author.