프로그래밍을 하다 보면 "어라?" 하는 감탄이 나오는 순간이 있습니다. 복잡한 로직을 놀랍도록 간결하고 우아하게 처리하는 코드, 바로 'Pythonic' 하다고 불리는 코드들입니다.

오늘은 우리가 함께 감동했던, 단순하지만 강력한 3가지 Pythonic 코드 스니펫을 소개합니다.


1. 접두사(Prefix) 슬라이싱: '동적'일 때 빛나는 진가



파일 경로에서 기본 경로를 떼어내고 상대 경로만 얻어야 할 때 len()문자열 슬라이싱(slicing)을 조합합니다.

# 예시 1
prefix = "/var/data/user/files"
p = "/var/data/user/files/report.txt"

if p.startswith(prefix):
    relative_path = p[len(prefix):]
    print(relative_path) 
    # /report.txt

여기까지만 보면 p[22:] (숫자 22를 직접 쓰는 것)와 다를 바 없어 보입니다. 하지만 이 코드의 진정한 가치접두사가 동적으로 바뀔 때 드러납니다.

✅ The Pythonic Way (진가 발휘)

여러 사용자의 데이터 경로를 처리해야 한다고 상상해 보세요.

def get_relative_path(full_path, user_name):
    # ⭐️ 접두사가 user_name에 따라 동적으로 바뀝니다!
    prefix = f"/var/data/{user_name}/files"

    if full_path.startswith(prefix):
        # len()이 매번 정확한 동적 길이를 계산합니다.
        # user1이면 22, long_user면 29...
        return full_path[len(prefix):]

    return full_path

# 'user1' (접두사 길이 22)
path1 = "/var/data/user1/files/report.txt"
print(f"user1: {get_relative_path(path1, 'user1')}")

# 'long_user_name_2' (접두사 길이 29)
path2 = "/var/data/long_user_name_2/files/document.pdf"
print(f"user2: {get_relative_path(path2, 'long_user_name_2')}")

결과:

user1: /report.txt
user2: /document.pdf

😲 감동 포인트

코드는 접두사의 _내용_이나 _고정된 길이_에 의존하지 않습니다. 오직 len()을 통해 실시간으로 계산된 길이를 기준으로 [N:] 슬라이싱을 할 뿐입니다.

이것이 바로 p[22:] 같은 하드코딩과 차원이 다른, 유지보수성이 높고 견고한 코드입니다.


2. 임시 변수 없는 '마법의 스왑'

두 변수의 값을 맞바꿀 때, temp라는 임시 변수가 필요 없습니다.

✅ The Pythonic Way

a = 10
b = 20

# 파이썬 방식의 스왑
a, b = b, a

print(f"a = {a}, b = {b}") 
# a = 20, b = 10

😲 감동 포인트

이것은 튜플 패킹(Packing)과 언패킹(Unpacking)을 이용한 것입니다.

  1. b, a : 등호 우측의 (20, 10) 값이 임시 튜플로 '패킹'됩니다.

  2. a, b = ... : 이 튜플의 값들이 순서대로 좌측의 ab 변수에 '언패킹'(풀어서 할당)됩니다.

'a와 b를 b와 a로 바꾼다'는 의도를 코드에 그대로 담아냈습니다.


3. for 루프를 한 줄로: '컴프리헨션'의 마법



'어떤 데이터를 가지고, 특정 조건에 맞는 요소만 골라내어, 변형한 뒤 새 컬렉션을 만들고 싶다.'

이 긴 문장이 for 루프 4~5줄로 번역되곤 합니다. 파이썬은 이 과정을 한 줄로 압축합니다.

딕셔너리: Key와 Value 뒤집기

변수 스왑의 감동은 딕셔너리에서도 이어집니다. for 루프를 돌며 k:vv:k로 바꾸는 상황이죠.

# 전통적인 방식
my_dict = {'name': 'Alice', 'job': 'Engineer'}
inverted_dict = {}
for k, v in my_dict.items():
    inverted_dict[v] = k

✅ The Pythonic Way (Dictionary Comprehension)

my_dict = {'name': 'Alice', 'job': 'Engineer'}

# "my_dict에서 k,v를 뽑아서, v:k 쌍으로 된 새 dict 만들기"
inverted_dict = {v: k for k, v in my_dict.items()}

print(inverted_dict)
# {'Alice': 'name', 'Engineer': 'job'}

(단, 이 방식은 Value가 고유(Unique)해야 합니다.)

리스트: 조건에 맞는 요소로 새 리스트 만들기

이 마법은 리스트에서 더 자주 쓰입니다. 0~9 중 짝수만 골라 제곱한 리스트를 만들어 볼까요?

# 전통적인 방식
squares_of_evens = []
for i in range(10):
    if i % 2 == 0:
        squares_of_evens.append(i * i)

✅ The Pythonic Way (List Comprehension)

# "i를 0~9까지 돌면서(for), 만약 i가 짝수면(if), i*i를(what) 리스트 만들기"
squares_of_evens = [i * i for i in range(10) if i % 2 == 0]

print(squares_of_evens)
# [0, 4, 16, 36, 64]

😲 감동 포인트

컴프리헨션은 '어떻게' 만들지(how: 빈 리스트 선언, 루프, append...)를 장황하게 설명하는 대신, '무엇을' 원하는지(what) 를 선언하도록 코드를 바꿔줍니다.


결론: 코드가 감동을 줄 때

오늘 살펴본 3가지 스니펫은 단순한 '코딩 팁'이 아닙니다.

이것은 "어떻게 하면 더 명확하게, 더 간결하게, 더 아름답게 나의 의도를 표현할 수 있을까?" 라는 파이썬의 철학(The Zen of Python)을 보여줍니다.

코드가 단지 기계를 위한 명령어를 넘어, 개발자의 생각을 담는 '글' 이 될 수 있음을, 그리고 잘 쓴 글이 감동을 주듯 잘 쓴 코드 역시 우리에게 '어라?' 하는 감동을 줄 수 있음을 깨닫게 합니다.

여러분의 코드에도 이런 'Pythonic한 감동'이 가득하길 바랍니다.