본문 바로가기
AI Basic/Python

[Python] 06 Pythonic Code

by iamzieun 2023. 3. 7.

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의 지원 미비
    • 코드 해석의 어려움
    → 위와 같은 이유로 PEP 8에서는 lambda의 사용을 권장하지 않지만, 여전히 많이 사용되고 있음

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 하기 위해 사용

댓글