본문 바로가기

컴린이 탈출기/Python

[Python] Pythonic한 code 짜기

반응형

<부스트캠프 AI Tech> 최성철 교수님의 Python 강의를 정리한 내용입니다.



Pythonic한 code

- 파이썬 특유의 문법을 활용해 효율적으로 코드를 짜는 방식. (하지만 요즘은 파이썬 특유라고 보긴 어렵다.)

- 많은 개발자들이 이러한 스타일로 코딩하기 때문에 다른 사람 코드를 잘 읽고, 나 또한 효율적으로 코드를 작성하기 위해 익혀두면 좋다.

 

1) Split / Join

- string을 다루는 방법

- split : 어떤 값을 기준으로 변수를 unpacking 해줌. 

items = "one two three"
items.split(" ")
# >> ['one', 'two', 'three']

- join

colors = ["red", "blue", "green"]
"-".join(colors)
# >> 'red-blue-green'

 

2) List comprehension

- 기존 list를 사용하여 간단히 다른 list를 만드는 방법

- (for + append)보다 속도가 빠름

result = [i for i in range(10)]
# >> [0,1,2,3,4,5,6,7,8,9]

result = [i for i in range if i % 2 ==0]
# >> [0,2,4,6,8]

+ pprint 라이브러리 사용하면 데이터 확인할 때 줄바꿈 되어서 예쁘게 확인할 수 있음.

 

3) enumerate & zip

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

- zip : 두 개 이상의 list의 값을 병렬적으로 추출

 

4) lambda / map / reduce

- lambda : 익명의 함수

(lambda x, y : x+y)(10,50)
# >> 60

+ PEP 8에서는  def statement를 쓰길 권장, lambda 사용을 권장하지는 않음.

 

- map: sequence형 데이터가 있을 때, 각각의 element에 함수 적용

def f(x):
	return x + 5
    
ex = [1,2,3,4,5]

list(map(f, ex))
# >> [6,7,8,9,10]

+ list comprehension 등으로 대체할 수 있기 때문에 최근 점점 권장되지 않음.

 

- reduce: map function과 달리 list에 똑같은 함수를 적용해서 통합함

from functools import reduce

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

 

5) iterable objects

- Sequence 자료형에서 데이터를 순서대로 추출하는 object

- 내부적으로 __iter__와 __next__가 구현되어 있음.

- 현재 차례의 데이터와 함께 다음 데이터의 메모리 주소 저장되어 있음.

 

6) Generator

def generator_list(value):
	result = []
    for i in range(value):
    	yield i
        
for a in generator_list(10):
	print(a)

- 미리 값 다 생성해서 메모리에 올려놓는 것이 아니라 함수를 호출할 때마다 yield. > 메모리 적게 사용함

- 따라서 대용량의 데이터 사용할 때는 메모리 문제 때문에 generator 사용하는 것 권장됨!

+ generator comprehension

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

 

7) function passing arguments

- 함수에 입력되는 arguments에는 다양한 형태가 있음

  • Keyword arguments
  • Default arguments
  • Variable-length arguments

 

(1) Keyword arguments

: 함수에 입력되는 parameter의 변수명을 사용해 arguments를 넘김

def print_info(my_name, your_name):
	print(my_name, your_name)
    
print_info(my_name = 'hyelin', your_name = 'jaein')
print_info(your_name = 'hyelin', my_name = 'jaein') # 순서대로 쓰지 않아도 된다

 

(2) Default arguments

: parameter의 기본 값을 사용, 입력하지 않을 경우 기본값 출력

def print_info(my_name = 'hyelin', your_name):
	print(my_name, your_name)
    
print_info(your_name = 'jaein')
print_info(your_name = 'hyelin', my_name = 'jiho') # 순서대로 쓰지 않아도 된다

 

(3) Variable length asterisk

: 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법, Asterisk(*) 기호 사용

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

- 기존 parameter 이후에 나오는 값을 tuple로 저장

 

(4) Keyword variable length

: Parameter 이름을 따로 지정하지 않고 입력하는 방법, Asterisk(*) 두개를 사용

def kwargs_test(**kwargs):
	print(kwargs)
    print(type(kwargs))
    
kwargs_test(a=3, b=4, c=5)
# >> {'a':3, 'b':4, 'c':5}
# >> dict

 

 

+ keyword arguments, 가변인자, 키워드 가변인자 순으로 받음.

def kwargs_test(one, two=3, *args, **kwargs):
	~
    
kwargs_test(10,30, 3,5,6, first=3, second=12)
# >> 작동!

kwargs_test(10,30, 3,5,6, first=3, second=12, 5)
# >> SyntaxError: positional argument follows keyword argument

kwargs_test(one = 10, two=30, 3,5,6, first=3, second=12, 5)
# >> SyntaxError: positional argument follows keyword argument

 

+asterisk - unpacking a container

: tuple, dict 등 자료형에 들어가 있는 값을 unpacking 해줌

 

반응형