네이버 부스트캠프 학습 정리/1주차

[Python] Pythonic Code

AI쟁이J 2023. 3. 10. 15:36

Pythonic Code란?

다른 언어와 다르게 파이썬만의 특별한 코딩 스타일로 효율도 좋지만, '간지'가 난다.

주로 알고리즘 문제 사이트에 파이썬의 다른 사람 코드를 보면 단 한 줄의 코딩으로 문제를 푼 사람들이 있는데, 이런 코드의 댓글에는 사람들의 감탄이 주로 보인다. 간지나네요, 우와 파이써닉하네요 등등..

 

Split & Join

알고리즘 문제를 풀 때 엄청나게 썼던 작업.

Split - string type의 값을 "기준값"으로 나눠서 List 형태로 변환

Join - string으로 구성된 리스트를 다시 하나의 string으로 변환

List Comprehension

역시 알고리즘 문제 풀이 때 코드를 짧게 할 수 있는 가장 큰 이유로, 제일 간지라고 생각한다..

보이십니까? 코드 길이의 차이가

 

enumerate & zip

enumerate : list의 element를 추출할 때 번호를 붙여서 추출

zip : 두 list의 값을 병렬적으로 추출

lambda/map/reduce

lambda : 함수 이름 없이, 함수처럼 쓸 수 있는 익명의 함수

두 개 이상의 함수에도 적용 가능하며 if 필터도 사용 가능

 

map : 첫 번째 매개변수로 함수가 오고 두 번째 매개변수로는 반복 가능한 자료형이 오는 함수

map 함수의 반환 값은 map 객체이기 때문에 해당 자료형을 list 혹은 tuple로 형 변환시켜주어야 출력 가능

reduce

- map과 달리 list에 똑같은 함수를 적용해서 통합, functools 내장 모듈에서 임포트를 통해 사용

reduce(집계 함수, 순회 가능한 데이터[, 초기값])

방식으로 사용하며 집계 함수에서 두 개의 인자를 받음.

첫 번째 인자 : 누적자 (함수 실행의 시작부터 끝까지 재사용되는 값)

두 번째 인자 : 현재값 (루프를 돌며 계속 바뀌는 값)

from functools import reduce

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

lambda 함수가 집계함수로 x가 누적자, y가 현재값의 역할을 하며 

x = 1 y = 2 -> x= 3으로 변경,

x = 3 y = 3 -> x = 6으로 변경되며 계속 진행되어 리스트의 합인 15를 출력

 

generator

- iterable object를 특수한 형태로 사용할 수 있게 해주는 함수

def generator_list(value):
    res = []
    for i in range(value):
        yield i
        
generator_list(10)
# <generator object generator_list at 0x000001D0EB4CAE40>

일반적인 방법을 통해 yield를 이용해 한 번에 하나의 element를 반환하는 generator 생성

 

generator comprehension

gen_ex = (x*x for x in range(500))
print(type(gen_ex))
# <class 'generator'>

list comprehension과 달리 (  ) 로 감싸주면 generator 형태의 list를 생성할 수 있다

 

흠. ( ) 는 튜플아닌가..

맞다. 그래서 튜플을 comprehension으로 생성하려면

tuple_ex = tuple(i for i in range(10))
print(type(tuple_ex))
print(tuple_ex)
# <class 'tuple'>
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

로 tuple()을 통해 감싸주면 된다.

 

generator로 list 타입의 데이터를 반환해주는 함수를 만들면 일반적인 list에 비해 메모리를 적게 사용하기 때문에 중간 과정에서 loop이 중단될 수 있는 경우나 큰 데이터를 처리할 때 사용하면 좋다

 

asterisk

개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법으로 asterisk(* 기호) 를 통해 가변인자를 사용할 수 있음

def aster_test(a, b, *args):
    return a + b + sum(args)

print(aster_test(1,2,3,4,5))
# 15

a = 1, b = 2 이후의 3, 4, 5는 sum(3,4,5)를 통해 a + b + sum(3,4,5) = 15 출력

그냥 값을 return 시키면?

def aster_test2(a, b, *args):
    return a,b,args

print(aster_test2(1,2,3,4,5))
# (1, 2, (3, 4, 5))

기존 parameter 이후의 값을 tuple로 반환함

 

keyward variable-length

asterisk(*) 2개를 사용해 함수의 parameter를 표시할 경우 입력된 값을 dict type으로 사용할 수 있음

def kwarg_test(one, two, *args, **kwargs):
    print(one + two + sum(args))
    print(kwargs)
    
kwarg_test(3,4,5,6,7,8,9, first = 1, second = 2, third = 3)
# 42
# {'first': 1, 'second': 2, 'third': 3}

one = 3, two = 4 이후 5,6,7,8,9는 arg 변수로 sum() 되며 이후의 kwargs는 dict type으로 출력됨

 

unpacking 기능

asterisk(*)는 tuple, dict, list 등 자료형에 들어가 있는 값을 unpacking하는 기능 역시 있다. 

a,b,c = ([1,2],[3,4],[5,6])
print(a, b, c)
# [1, 2] [3, 4] [5, 6]

total = ([1,2],[3,4],[5,6])
print(*total)
# [1, 2] [3, 4] [5, 6]

a,b,c 를 따로따로 설정해 출력할 필요 없이 *를 앞에 붙여 tuple 자료형인 total 앞에 붙여 출력하면 print 할 경우 unpacking되어 나온다.

'네이버 부스트캠프 학습 정리 > 1주차' 카테고리의 다른 글

1주차 회고  (1) 2023.03.12
[AI math] 벡터와 행렬  (0) 2023.03.11
[Python] arg/configparser  (0) 2023.03.11
[Python] OOP  (0) 2023.03.10
[Python] Function  (0) 2023.03.10