Post

Pythonic

Pythonic

“Pythonic”이라는 용어는 파이썬의 철학과 스타일을 따르는 방식으로 코드를 작성하는 것을 의미한다. 파이썬 커뮤니티 내에서는 이 용어를 종종 파이썬다운 방식으로 번역하기도 한다. 파이썬의 창시자인 귀도 반 로섬(Guido van Rossum)과 파이썬 커뮤니티는 파이썬 코드 작성에 있어 가독성, 명료성, 그리고 간결함을 중시한다.

Pythonic한 코드는 이러한 원칙을 따르며, 파이썬 고유의 기능과 구문을 효율적으로 활용해 문제를 해결한다. 😉

Pythonic 코드의 특징

  • 가독성이 높고 명료함: 코드는 명확하고 간결해야 하며, 다른 사람이 읽고 이해하기 쉬워야 한다.
  • 파이썬의 기능 활용: 리스트 컴프리헨션, 제너레이터 표현식, 데코레이터와 같은 파이썬 고유의 기능을 적극적으로 사용
  • 표준 라이브러리 사용: 파이썬은 많은 표준 라이브러리를 제공한다. Pythonic한 코드는 이러한 라이브러리를 적극적으로 활용한다.
  • 파이썬 커뮤니티의 관례 따름: PEP 8(파이썬 코드 스타일 가이드)과 같은 파이썬 개선 제안서의 권장 사항을 따른다.
  • 덕 타이핑(duck typing) 활용: 객체의 타입보다는 객체가 가진 메소드와 속성이 중요하다는 관점을 가지고, 유연한 코드를 작성한다.

파이썬의 기능 활용

  • 리스트 컴프리헨션 (List Comprehension): 기존 리스트를 기반으로 새 리스트를 만들어내는 간결하고 효율적인 방법이다. 이 방식은 반복문과 조건문을 한 줄의 코드로 표현할 수 있게 해주며, 코드의 가독성을 높이고 더 짧은 코드로 같은 작업을 할 수 있게 한다.
1
2
3
4
5
6
7
8
# 짝수만 포함하는 리스트를 만드는 기존 방식
even_numbers = []
for x in range(10):
    if x % 2 == 0:
        even_numbers.append(x)

# 리스트 컴프리헨션을 사용한 방식
even_numbers = [x for x in range(10) if x % 2 == 0]
  • 제너레이터 표현식 (Generator Expressions): 리스트 컴프리헨션과 유사하지만, 리스트 대신에 제너레이터를 생성한다. 제너레이터는 모든 데이터를 메모리에 미리 로딩하지 않고, 반복될 때마다 하나씩 데이터를 생성하여 메모리를 효율적으로 사용할 수 있게 한다. 큰 데이터를 다룰 때 유용하게 사용된다.
1
2
3
4
5
6
7
8
9
10
11
12
# 홀수만 생성하는 기존 방식 (리스트 사용)
odd_numbers = []
for x in range(10):
    if x % 2 != 0:
        odd_numbers.append(x)
for num in odd_numbers:
    print(num)

# 제너레이터 표현식을 사용한 방식
odd_numbers_gen = (x for x in range(10) if x % 2 != 0)
for num in odd_numbers_gen:
    print(num)
  • 데코레이터 (Decorators): 다른 함수를 인자로 받아서, 그 함수의 동작을 변경하거나 확장하고 반환하는 함수이다. 데코레이터는 “@” 기호를 사용하여 적용된다. 로깅, 접근 제어, 측정 등의 기능을 추가할 때 유용하게 사용된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 데코레이터 정의
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()  # 원래 함수 호출
        print("Something is happening after the function is called.")
    return wrapper

# 데코레이터 사용
@my_decorator
def say_hello():
    print("Hello!")

# 함수 호출
say_hello()

""" Output
Something is happening before the function is called.
Hello!
Something is happening after the function is called.
"""

덕 타이핑(Duck Typing)

객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 방식을 말한다. 이 용어는 “만약 어떤 새가 오리처럼 걷고, 오리처럼 꽥꽥거린다면, 그 새를 오리라고 부를 것”이라는 오래된 말에서 유래됐다. 즉, 객체의 타입보다는 객체가 어떤 행동을 하는지, 어떤 메소드를 지원하는지가 더 중요하다는 개념이다.

덕 타이핑은 객체의 실제 타입이 아니라, 해당 객체가 필요한 메소드나 속성을 가지고 있느냐를 기준으로 객체를 사용한다. 이를 통해 유연성과 재사용성을 높일 수 있으며, 다형성을 좀 더 쉽게 구현할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Duck:
    def quack(self):
        print("Quack, quack!")

    def walk(self):
        print("Walks like a duck.")

class Person:
    def quack(self):
        print("The person imitates a duck quacking.")

    def walk(self):
        print("The person walks like a duck.")

def in_the_forest(duck):
    duck.quack()
    duck.walk()

donald = Duck()
john = Person()

# 덕 타이핑을 활용하여 두 객체 모두 `in_the_forest` 함수에서 사용
in_the_forest(donald)  # Duck 객체 사용
in_the_forest(john)    # Person 객체 사용
This post is licensed under CC BY 4.0 by the author.