IT in General/Python 6

Immutable vs mutable

파이썬을 처음 접할때 Immutable과 mutable 객체가 있다는 것을 배운다. 그리고 그에 해당하는 것을 기억하면서, 무슨 자료형은 '바꿀 수 없다'고 기억한다. 예를 들어 string은 immutable, list는 mutable 이런 식이다. 그런데 그 효과를 정확히 알지 않으면 상당한 시간을 디버깅 하느라 낭비할 수 있다. 정리해본다. 만약에 "".join(L1) 이렇게 한다고 할 때와 L1.extend(L2) 할 때 큰 차이가 무엇일까. 전자는 새 string 객체가 리턴되지만, 후자는 None이 리턴된다. 따라서, 저 결과를 무언가에 append 하고 싶다면 전자는 그냥 저 식을 argument로 넣지만(오히려 .copy() 가 안됨), 후자는 저 식을 실행한 후의 L1을 argument ..

Iterator와 Generator 사용방법

Heron의 방법으로 제곱근을 구하는 수치해석 로직을 통해 Iterator와 Generator의 쓰임에 대해 설명하는 예제를 준비해보았다. 아래 코드는 [1] 에서 참조했다 (책에 존재하던 코드의 오류는 필자가 본 페이지와 같이 수정해서 원 저자의 레포에 커밋하고 머지되었다). 아래 sqrt1 함수는 제곱근을 구할 대상이 될 숫자인 a를 입력받아, a의 제곱근에 대한 추정치를 Heron의 알고리즘으로 반복해서 구하게 된다. 동 알고리즘은 매 횟수마다 이전보다 더 정밀한 추정치를 구하게 되며, 이전 단계에서 구한 추정치와 이번 단계에서 구한 추정치의 차이가 0.001보다 적게 되면 반복을 멈추고 결과를 돌려주며 종료된다.def sqrt1(a: float) -> float: x = a / 2 # initia..

any와 all, 그리고 return

any와 all은 Python 기본함수로서 여러가지 경우에 대해 참/거짓 값을 종합적으로 판단할 때 긴 for 루프를 줄이고 간단하게 만들게 되어 전체 코드가 한 눈에 들어올 수 있도록 도와주고 코드 길이도 줄여주면서 구현도 간편하게 해줄 수 있다. DP, graph, 각종 구현 등 쓰이는 곳이 많은 팔방미인이다. 그러나 그 정의를 정확히 알지 않으면 기대한 것과 전혀 다른 엉뚱한 결과가 나와 머리를 부여잡고 몇 시간 고민해도 답을 못 얻는 경우가 있는데 바로 이 두 함수가 대표적인 사례이다. 확실히 알고 향후 오류를 방지해보자. 리턴(return)의 신중함 먼저 필자가 겪은 오류의 사례를 보자. return any(color != black and is_cycle(u) for u in graph[v])..

데코레이터와 피보나치

Python의 decorator에 대한 설명으로 대표적인 것이 이름을 출력하는 예제일 것이다. 그러나 실제로 그런 일을 할 일이 별로 없기 때문에 마음에 와닿지가 않아 이해도 잘 되지 않았다. 가장 실용적인 사례로서 DP(dynamic programming)을 위한 memoization의 경우에 활용되는 @cache()라는 decorator를 피보나치 수를 구하는 예제에 적용하여 그 내부 동작을 살펴본다. 먼저 팩토리얼을 구하는 코드를 소개한다. 아래 데코레이터는 @cache로서, DP의 top-down시 많이 활용하는 lru_cache(maxsize=None)과 동일한 결과를 돌려주는 것으로 3.9에서 추가된 함수이다. @cache def factorial(n): return n * factorial(..

itertools.islice, tee, groupby, product

islice 형태: itertools.islice(seq, [start,] stop [,step]) 역할: 주어진 sequence를 start:stop:step으로 잘라서 그 원소를 돌려주는 역할을 한다. 예 import itertools for c in itertools.islice('ABCDEFG', 2): print(c, end=" ") print() for c in itertools.islice('ABCDEFG', 2, None): print(c, end=" ") 결과는 다음과 같다. A B C D E F G 즉, 인수 2개만 주면, seq, stop으로 해석하므로, [:2] 까지의 원소를 돌려준다. 그러나 islice만으로는 어떠한 결과를 보여주지 않고 그저 iterator만을 돌려줄 뿐이다. ..

functools.reduce

functools는 잘 이용하면 코테나 인터뷰 뿐 아니라 실무에서도 많은 작업을 간편하게 할 수 있도록 도와준다. 구문: functools.reduce(function, iterable[, initializer]) 역할: list와 같은 iterable의 값을 앞에서부터 하나씩 function에 넣어 계산하고, 그 결과를 다시 function의 입력값으로 넣어 계산하는 과정을 반복하여 최종적인 값을 돌려준다. 예1. 리스트에 있는 값을 누적해서 계산 import functools functools.reduce(lambda x, y: x+y, [2,3,4,5], 1) # ((((1+2)+3)+4)+5)​ 예2. pandas Dataframe에 저장된 값을 통해 기하평균을 구함 data['returns_GA..