Better Way 12~17

장재성·2021년 6월 29일
0

Better Way

목록 보기
3/4

Better Way 12

스트라이드와 슬라이드를 한 식에 함께 사용하지 말 것

  • stride : 리스트의 특정 위치의 element 만을 가져오는 식
a = [1,2,3,4,5]
print(a[::2]) # index 0 부터 2 칸씩 건너 뛰며 값을 가져온다
>>> [1,3,5]
  • stride + slice 의 예 (가독성이 좋지않다)
x = [1,2,3,4,5,6,7]
print(x[2::2])
>>> [3,5,7]
print(x[-1:2:-2])
>>> [7,5]
  • stride -> slice 의 예 (가독성이 좋아진다)
x = [1,2,3,4,5,6,7]
y = x[::2]
print(y)
>>> [1,3,5,7]
z = y[1:-1]
print(z)
>>> [3,5]

결론적으로, 'stride + slice'의 방식보다는 'stride -> slice'의 방식을 사용할 것을 권장한다.

Ref) itertools 의 islice 사용가능 (Better way 36)

Better Way 13

slicing 보다 unpacking을 사용하자

  • slicing 사용의 예
car_ages = [0,9,4,8,7,20,19,1,6,15]
car_ages_descending = sorted()

oldest = car_age_descending[0]
second_oldest = car_age_descending[1]
others = car_age_descending[2:]
  • unpacking 사용의 예
car_ages = [0,9,4,8,7,20,19,1,6,15]
car_ages_descending = sorted()

oldest, second_oldest, *others = car_ages_descending

코드가 훨씬 간결해지고 index를 이용한 접근이 불필요해진다 (index error 방지)

  • unpacking 사용시 주의점
    1) '별표식' 외 다른 변수가 반드사 함께 사용되어야 한다.
    2) '별표식' 두개를 동시에 사용할 수 없다.
    3) '별표식'은 항상 list type을 가진다.
    4) iterator 를 이용해 '별표식'을 unpacking 할 경우 반복 횟수 만큼 메모리가 사용되므로 사용가능 메모리량에 주의해야한다.

Better Way 14

복잡한 기능을 사용해 정렬할 때는 key 파라미터를 사용하라

  • list는 내장함수인 sort()를 이용해 정렬이 가능하다.
  • 하지만 복잡한 식에서는 단순히 sort() 만으로는 정렬이 불가능하다.
  • 이럴 때 기준이 되는 key 값을 parameter로 넘겨 줌으로 써 정렬이 가능해진다.
class Tool:
    def __init__(self, name, num):
    def __repr__(self):

tools = [
    Tool('a', 3.5),
    Tool('c', 1.25),
    Tool('b', 0.5),
    Tool('e', 0.25),
]
tools.sort(key=lambda x: x.name) # 이름기준
tools.sort(key=lambda x: x.num) # 숫자기준

Better Way 15

딕셔너리 삽입 순서에 의존할 때는 조심하라

  • 파이썬 3.7 이전 과 이후 버전에서의 딕셔너리 순서 처리 방식이 변화 되었다.
name = {
    'ABC': 'abc',
    'EFG': 'efg',
}
print(name)
# 파이썬 3.5 -> {'EFG': 'efg', 'ABC': 'abc'} 출력
# 파이썬 3.7 이후 -> {'ABC': 'abc', 'EFG': 'efg'} 출력
  • 하지만 여기에도 예외는 존재한다.
    • 사용자가 dict와 같은 표준 프로토콜을 직접 작성하여 사용하는 경우, 입력값과 출력값의 순서에 차이가 생길 수 있다.
  • 이런 현상을 덕타이핑(duck typing)이라고 하며, 그때 그때 객체가 어떤 메소드를 통해 작동하는지에 따라 객체의 타입이 달라지고 그에 따른 결과값이 달라 질 수 있기에 유의해야 한다.
profile
초심자

0개의 댓글