python을 더 pythonic하게

so_doit·2022년 3월 3일
0

TIL

목록 보기
14/26

pythonic❔

pythonic하게 코드짠다는 것은 어떤 말인걸까?

Pythonic Code는 간단하게, 다른 사람의 코드를 잘 이해하기 위해서 파이썬 특유의 문법을 활용하여 효율적으로 코드를 표현하는 기법을 말한다.

이렇게 말했을 때 그렇게 와닿지 않는다. 아래의 예시를 통해 어떤게 pythonic한 코드인지 확인해보자.

코드 예시

다음 코드는 colors 배열에 있는 값들을 한 줄로 이어붙여 출력하는 행동을 수행한다.

colors = ["a", "b", "c", "d", "e"]
result = ""

for s in colors:
    result += s

print(result)

위의 코드는 pythonic하게 바꾼다면 어떻게 될까?

colors = ["red", "blue", "green", "yellow"]
result = "".join(colors)

print(result)

List Comprehension

List Comprehension은 리스트 데이터를 주무를 때 굉장히 매력적인 방법이다.

이 방법을 알기전엔 list를 만들 때 반복문을 돌려 .append, .extend를 사용해서 생성했지만 list comprehension을 사용하면 코드를 짧고 효율적이게 짤 수 있으며, 속도 측면에서도 이점을 가져올 수 있다.

그럼 리스트에 0~9까지 집어넣는 코드를 작성을 해보자.

# list comprehension 하지 않은 코드
result = []

for i in range(10):
    result.append(i)

print(result)

# list comprehension
result = [i for i in range(10)]
print(result)

위에 코드를 비교했을 때 일단 위의 코드보다 아래의 코드가 굉장히 쉽고 간편한 것을 알 수 있다. 그리고 이부분에 관련한 속도도 효율적인 것을 확인 가능하다.

List Comprehension은 이 외에도 다양한 방식으로 이용할 수 있다. 그러나 한번에 적용해서 활용하기 힘들기 때문에 관련된 공부가 필요하고 생각한다.

Lambda

lambda는 함수의 이름 없이, 함수처럼 쓸 수 있는 익명 함수이다.
알아본 바로 lambda는 python3에서는 사용을 권장하지 않지만 굉장히 매력적인 함수여서 사용했다.
하지만 머신러닝에서는 여전히 많이 쓰인다고 한다.

# lambda를 사용하지 않은 함수
def f(x, y):
    return x + y
    
print(f(1, 4))

# lambda
f = lambda x, y: x + y
print(f(1, 4))

Map

sequence 자료형 각 element에 동일한 function을 적용한다.
python3 는 iteration을 생성한다 -> list을 붙여줘야 list 사용 가능하다.

# map 사용법
map(function_name, list_data)

# 사용 예시
ex = [1,2,3,4,5]
f = lambda x: x ** 2
print(list(map(f, ex))) # 1, 4, 9, 16, 25

# 두 개 이상의 list에도 적용 가능하다
ex = [1,2,3,4,5]
ex1 = [1,2,3,4,5]
f = lambda x, y: x + y
print(list(map(f, ex, ex1))) # 2, 4, 6, 8, 10

# if filter도 사용 가능하다
list(map(lambda x: x ** 2 if x % 2 == 0 else x, ex))

# 실행시점의 값을 생성하기 때문에 메모리 효율적으로 사용 가능하다
ex = [1,2,3,4,5]
print(list(map(lambda x: x+x, ex)))
print((map(lambda x: x+x, ex)))

f = lambda x: x ** 2
print(map(f, ex))
for i in map(f, ex):
print(i)

Reduce

Map과 다르게 list에 똑같은 함수를 적용해서 통합한다.
lambda와 마찬가지로 코드의 직관성이 떨어져서 python3에서는 사용을 권장하지 않는다.

from functools import reduce
print(reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])) # 15

Zip

# for loop + zip
alist = ['a1', 'a2', 'a3']
blist = ['b1', 'b2', 'b3']

for a, b in zip(alist, blist):
    print(a, b)

# list comprehension + zip
a, b, c = zip((1, 2, 3), (10, 20, 30), (100, 200, 300))
print(a, b, c)

print([sum(x) for x in zip((1, 2, 3), (10, 20, 30), (100, 200, 300))])

# enumerate + zip
alist = ['a1', 'a2', 'a3']
blist = ['b1', 'b2', 'b3']

for i, (a, b) in enumerate(zip(alist, blist)):
    print(i, a, b)

회고

지금까지 pythonic한 코드 작성법에 대해서 알아봤다. 내가 오늘 정리한 내용 이외에도 더 다양한 코드 작성법이 있다. 그 부분에 대해서 궁금증이 생긴 사람들은 각자 찾아보면서 공부하는 것도 좋을 것 같다.

마지막으로 이 글을 읽는 사람이 있다면 한 번은 어떻게 하면 pythonic하게 코드를 작성할 수 있을지 고민해 보는 것도 좋을 것 같다는 의견을 남기면서 오늘은 여기서 마무리 해야겠다.

profile
백엔드 개발자

0개의 댓글