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 |