본문 바로가기

Python6

reduce를 언제 사용할 수 있을까 Python의 functools.reduce는 Iterable 데이터에 2개의 인자를 갖는 함수를 누적하여 적용해서 결과를 하나로 만드는 함수이다.reduce는 Java, Javascript, Elixir 와 같은 고수준 언어에서 제공되는 functional 함수/메서드이다.이 글은 단지 Python의 reduce를 기준으로 설명하지만 전반적인 지식은 Python에만 국한되지 않는다. 간단한 예제로 두 수를 받아 그 합을 리턴하는 함수 add가 있다고 했을 때 int list에 대해 add 함수를 누적해서 적용하는 코드를 아래와 같이 reduce를 사용하여 만들 수 있다.from functools import reducedef add(a: int, b: int): print(a, b) ret.. 2024. 6. 5.
2차원 List 에서 distinct 처리하기 List에서 element를 distinct 처리하기 위해서 set()을 쓰곤 한다. 하지만 List를 element로 갖는 2차원 List에서 distinct 처리를 하기 위해 set()을 사용하는 경우 아래와 같이 TypeError가 난다. data = [ [1, 1], # duplicated [2, 2], # unique [1, 1], # duplicated ] set(data) # Exception has occurred: TypeError # unhashable type: 'list' List는 mutable 이기 때문에 hash를 지원하지 않기 때문에 List element를 tuple로 변환한 뒤 set()을 사용해야 한다. (참고: In Python, why is a tuple hashab.. 2024. 2. 12.
Model Bakery 사용 시 주의점 Django application 테스트 시 Django Model에 대한 Test fixture를 일일이 만들기 번거로울 때 주로 Model Bakery를 사용하여 model fixture를 만든다. 이 포스팅은 Model Bakery를 사용하면서 부딪힌 겪은 문제를 통해 알게 된 것들을 정리한 것이다. (포스팅에 나오는 코드는 여기에서 확인 가능하다.) 다음과 같은 단순한 형태의 Board, Reply Django model을 기반으로 진행하도록 하겠다. from django.db import models as m class Board(m.Model): content = m.CharField(null=False, max_length=100) class Reply(m.Model): board = m.F.. 2020. 12. 28.
== 와 is 비교 값이 같은지를 확인할 때 == 를 주로 사용한다. 그리고 값이 None 인지를 확인할 때는 is 를 사용한다. 그럼 == 와 is 의 차이는 무엇일까? == : value equality, 값이 같은지를 확인한다. is : reference equality, 참조가 같은지를 확인한다. l1 = [] l2 = [] print(l1 == l2) # True print(l1 is l2) # False 위 결과 l1 == l2 는 True이고 l1 is l2 는 False이다. 리스트를 선언하여 변수에 할당할 때, 새로운 list object가 생성되어 변수에 할당되기 때문에 l1과 l2는 서로 다른 list object를 참조하게된다. 그렇기 때문에 l1, l2 모두 빈 list이기 때문에 값은 같지만 (==.. 2020. 12. 28.
function의 default parameter 사용 시 주의점 파이썬은 함수를 정의할 때 default parameter(기본값)을 같이 정의할 수 있다. 편리한 기능이지만 아래와 같이 list나 dictionary와 같은 object를 사용할 경우 버그가 날 확률이 높다. (물론 의도적이라면 예외이다.) def list_func(li=[]): li.append('test') print('li:', li) print('#############') list_func() # li: ['test'] list_func() # li: ['test', 'test'] list_func() # li: ['test', 'test', 'test'] list_func() # li: ['test', 'test', 'test', 'test'] 아무 parameter도 전달하지 않았을 경우.. 2020. 12. 28.
*args, **kwargs에 대해서 우선 _args와 *_kwargs에 대해 알아보기 전에, python에는 Packing과 Unpacking이라는 것이 있다. Packing 여러개의 데이터를 list, tuple 등의 컬렉션으로 감싸는 것 (묶는 것) greetings = ('hello', 'konnichiwa', 'annyneong',) Unpacking 컬렉션의 element들을 여러 변수에 푸는 것 en, jp, ko = greetings 이제 함수를 보자 def args_func(*args): print(args) print(type(args)) # args_func(1, 2, 3) # (1, 2, 3) args_func((1, 2, 3)) # ((1, 2, 3),) # (1, 2, 3) 이 tuple의 element로 들어간다... 2020. 12. 28.