import bisect
n = int(input())
nlist = list(map(int, input().split()))
nlist.sort()
m = int(input())
mlist = list(map(int, input().split()))
for num in mlist:
i = bisect.bisect_left(nlist, num)
if num == nlist[i]:
print(1)
else:
print(0)
bisect_left(list, x)
정렬된 list에서
x의 인덱스를 반환
해주고bisect_right(list, x)
== bisect(list, x)
바이섹트 자체가 num이 nlist에 없어도 삽입될 위치를 반환해주는데 만약 a에 있는 것보다 큰 수를 삽입하게 되면 인덱스가 넘어가기때문에 i<len(nlist)
가 필요하고 nlist
에 있는 것보다 작은 수를 삽입하게 되면 인덱스를 원래 값의 인덱스들을 하나씩 밀기때문에 num=nlist[i]
인지도 확인을 해줘야한다
Django ORM은 SQL없이 python으로 DML을 수행할 수 있도록 해주는 도구이다.
작성한 모델을 기반으로 테이블을 만들어주고 모델간의 관계에 따라 자동으로 중간 테이블을 만들어주기도 한다.
모델의 실례라고 볼 수 있는 인스턴스는 데이터베이스의 레코드에 해당한다
lazy-loading을 통해 불필요한 쿼리를 줄여준다
장고 ORM을 작성할 때는 모델_클래스.objects.조건
형식으로 하는데
여기서 objects는 Django ORM Manager로 모델과 데이터베이스 간의 인터페이스 역할을 한다
User.objects.all
은 User 모델의 모든 레코드를 다 불러오고
User.objects.filter(is_active=True)
는 is_active 속성이 True값인 것만 필터링해서 불러온다
ORM으로 처리된 로직은 쿼리셋의 형태로 반환되어 변수에 할당할 수 있다
쿼리셋은 iterable해서 이터레이터로 쓸 수 있다
aggregate()
메소드를 통해서 집계 함수를 사용할 수 있다 Sum
, Count
, Avg
, Min
, Max
*집계 함수는 집계에 사용되는 칼럼 값이 null인 경우 집계에서 제외한다
User.objects.aggregate(인원수=Count('id'))
count는 자주 사용되는 함수로 aggregate를 사용하지 않고도 사용할 수 있다
User.objects.count()
https://www.qu3vipon.com/django-orm
select_related()
, prefetch_related()
쿼리 갯수를 줄일 수 있다 하나의 쿼리셋을 가져올 때 related objects까지 모두 불러옴
불러온 데이터들이 캐시에 남아있어 DB에 접근할 필요가 없어 서비스 성능을 향상시켜준다
select_related()
:
OnetoOne, ManytoOne 관게에서 역참조하는 단일 객체를 불러오거나 foriegnkey 필드로 연결된 정참조 객체를 불러올 때 사용
DB에서 INNER JOIN 쿼리가 수행된다
prefetch_related()
:
ManytoMany, ManytoOne 관계에서 정참조하는 다수의 객체를 불러오거나 foriegnkey 필드로 연결된 역참조 객체를 불러올 때 사용
DB에서 관계별로 DB 쿼리를 수행 후 파이선에서 조인
모델의 foriegnkey 필드에 related_name
을 설정하면 해당 이름으로 역참조를 할 수 있고 따로 정하지 않으면 모델클래스_set
으로 역참조가 가능하다
https://velog.io/@miretta96/Django-selectrelated%EC%99%80prefetchrelated
테스트 주도 개발
테스트 케이스를 먼저 작성한 후 실제 개발을 한다
하나의 테스트는 완전하지 않음을 가정하기때문에 테스트케이스는 통과 후 계속해서 확장해나가며 이를 통해 규모의 프로젝트를 완성한다
XP: 애자일 방법론 중 하나로 TDD를 한다
https://namu.wiki/w/%ED%85%8C%EC%8A%A4%ED%8A%B8%20%EC%A3%BC%EB%8F%84%20%EA%B0%9C%EB%B0%9C
import unittest
unittest 모듈을 임포트해서 쓸 수 있는 함수들
테스트케이스 함수는 test_테스트할_메서드_이름
으로 명명한다
setUp()
vs setUpClass()
클래스에 하나 이상의 테스트 메서드가 있는 경우 setUp()
은 매 함수 실행 전에 실행되며 setUpClass()
는 클래스 내의 모든 함수 실행 전에 한 번 실행되고 @classmethod 데코레이터와 cls 인자가 필요하다
tearDown()
tearDownClass()
도 마찬가지
해당 setUp()
메소드가 성공한 경우 호출됨
assertEqual()