AI Basic/Python
[Python] 06 Pythonic Code
iamzieun
2023. 3. 7. 21:46
00 Overview
- Pythonic code
- 파이썬 스타일의 코딩 기법
- 파이썬 특유의 문법을 활용하여 코드를 효율적으로 작성하는 방법
- but, 많은 언어들이 서로의 장점을 채용하며 발전해온 결과, 위에서 언급한 ‘파이썬 특유의 문법’은 더 이상 파이썬의 고유한 문법은 아니게 됨
01 split & join
- split(): string type의 값을 ‘기준값’으로 나눠서 list 형태로 변환
- join(): string으로 구성된 list를 합쳐 하나의 string으로 변환
colors = ["red", "orange", "yellow", "green"]
result1 = ", ".join(colors)
print("result1:", result1)
result2 = result1.split(", ")
print("result2:", result2)
02 list comprehension
- list comprehension
- 기존 list를 사용하여 간단하게 다른 list를 만드는 기법
- Two dimensional vs One dimensional
case_1 = ["A", "B", "C"]
case_2 = ["D", "E", "F"]
## One dimensional
# general
s = []
for i in case_1:
for j in case_2:
s.append(i+j)
print("One dimensional-General:", s)
# list comprehension
s = [i+j for i in case_1 for j in case_2]
print("One dimensional-list comprehension:", s)
## Two dimensional
# general
s = []
for j in case_2:
line = []
for i in case_1:
line.append(i+j)
s.append(line)
print("Two dimensional-General:", s)
# list comprehension
s = [[i+j for i in case_1] for j in case_2]
print("Two dimensional-list comprehension:", s)
#One dimensional-General: ['AD', 'AE', 'AF', 'BD', 'BE', 'BF', 'CD', 'CE', 'CF']
#One dimensional-list comprehension: ['AD', 'AE', 'AF', 'BD', 'BE', 'BF', 'CD', 'CE', 'CF']
#Two dimensional-General: [['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AF', 'BF', 'CF']]
#Two dimensional-list comprehension: [['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AF', 'BF', 'CF']]
03 enumerate & zip
- enumerate
- list의 element를 추출할 때 번호를 붙여서 추출
- zip
- 여러 개의 list의 값들을 병렬적으로 추출
alist = ["a1", "a2", "a3"]
blist = ["b1", "b2", "b3"]
for i, (a, b) in enumerate(zip(alist, blist)):
print(i, a, b)
# 0 a1 b1
# 1 a2 b2
# 2 a3 b3
04 lambda & map & reduce
04-1 lambda
- lambda
- 함수의 이름 없이 함수처럼 쓸 수 있는 익명 함수
# general function def f(x, y): return x + y print("general function:", f(1, 4)) # lambda function f = lambda x, y: x + y print("lambda function:", f(1, 4))
- lambda의 문제점
- 문법이 어려움
- 테스트의 어려움
- 문서화 docstring의 지원 미비
- 코드 해석의 어려움
04-2 map
- map
- list의 요소들을 지정된 함수에 적용(mapping)
ex = [1, 2, 3, 4, 5] print(map(lambda x: x+x, ex)) # <map object at 0x7fdabf071040> print(list(map(lambda x: x+x, ex))) # [2, 4, 6, 8, 10] f = lambda x: x ** 2 print(map(f, ex)) # map object for i in map(f, ex): print(i) # 실행 시점에 값을 생성
04-3 reduce
- reduce
- 반복 가능한 객체(iterable object) 내 각 요소를 연산한 뒤 이전 연산 결과들에 누적해서 반환해 주는 함수
from functools import reduce print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])) # 1 + 2 + 3 + 4 + 5 = 15
05 iterable object
- iterable object
- 시퀀스 자료형에서 데이터를 순서대로 추출하는 object
colors = ["red", "orange", "yellow"] iter_obj = iter(colors) print(next(iter_obj)) # red print(next(iter_obj)) # orange print(next(iter_obj)) # yellow
06 generator
- generator
- iterable object를 특수한 형태로 사용하는 함수
- element가 사용되는 시점에 값을 메모리에 return
- yield를 사용하여 한 번에 하나의 element만 반환
- generator comprehension
- list comprehension과 유사한 형태로 generator 형태의 list를 생성
- [ ] 대신 ( ) 사용
g = (n*n for n in range(500)) print(type(g)) # <class 'generator'>
07 function passing arguments
- keyword argument 키워드 인자
- 함수에 입력되는 parameter의 변수명을 사용하여 argument를 전달
- default arguments 기본값 인자
- parameter의 기본값을 지정하여, parameter 값을 지정하지 않은 경우 기본값 사용
- Variable-length arguments 가변인자
- 개수가 정해지지 않은 함수의 parameter
- 일반적으로 *args를 변수명으로 사용
- 가변인자 앞 parameter들 이후의 값을 tuple로 저장
- keyword variable-length arguments 키워드 가변인자
- parameter 이름을 미리 지정하지 않고 parameter을 입력하는 방법
- 일반적으로 **kwargs를 변수명으로 사용
- 키워드 가변인자 앞 parameter들 이후의 값을 dict로 저장
- parameter의 순서
- 위치인자 → 기본값 인자 → 가변인자 → 키워드 인자 → 키워드 가변인자
08 asterisk
- *을 의미
- 곱셈, 제곱, 가변인자 등에서 다양하게 활용됨
- unpacking a container
- tuple, dict 등의 자료형으로 묶여있는 값들을 unpacking
def asterisk_test(a, *args): # *: 가변인자를 나타내기 위해 사용
print(a, args)
print(type(args))
asterisk_test(1, *(2,3,4,5,6)) # *: 튜플을 unpacking 하기 위해 사용