프로젝트를 진행하니깐 list comprehension이 필요하게 되었다.
numbers = []
for n in range(1, 10+1):
numbers.append(n)
====================
# list comprehension 이용한 모습
[x for x in range(10)]
리스트를 생성할때는 [ ] 를 사용하고, 딕셔너리 컴프리헨션 또는 셋 컴프리헨션 문법을 사용할때는 대괄호 { }를 사용
list comprehension에는 if를 사용할 수 있다.
if
키워드는 for문 뒤에 사용한다.
[ 2*x for x in range(1, 10+1) ]
#[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[x for x in range(1, 10+1) if x % 2 == 0]
#[2, 4, 6, 8, 10]
[ (x, y) for x in ['쌈밥', '치킨', '피자'] for y in ['사과', '아이스크림', '커피']]
'''
[('쌈밥', '사과'),
('쌈밥', '아이스크림'),
('쌈밥', '커피'),
('치킨', '사과'),
('치킨', '아이스크림'),
('치킨', '커피'),
('피자', '사과'),
('피자', '아이스크림'),
('피자', '커피')]
'''
students = ['철수', '영희', '길동', '순희']
=========================================
# value 선언해줌..
{ student: 0 for student in students }
{'철수': 0, '영희': 0, '길동': 0, '순희': 0}
class CategoryFilterView(View):
def get(self, request, category_id=None):
products = Product.objects.filter(sub_category__category__id=category_id)
for product in products:
product_images = product.productimage_set.all()
for product_image in product_images:
result.append(
{
'id': product.id,
'name': product.name,
'image_url': product_image.image_url,
'price': product.get_price()['real_price'],
'discount_rate': product.discount_rate,
'original_price': product.original_price,
}
)
return JsonResponse({'MESSAGE': result}, status=201)
지금은 list comprehension을 사용하지 않았을때 for을 중첩으로 돌려서 가독성이 떨어진다.
class CategoryFilterView(View):
def get(self, request, category_id=None):
products = Product.objects.filter(sub_category__category__id=category_id)
for product in products:
product_images = product.productimage_set.all()
result = [{
'id': product.id,
'name': product.name,
'image_url': [product_image.url for product_image in product_images],
'price': product.get_price()['real_price'],
'discount_rate': product.discount_rate,
'original_price': product.original_price,
} for product in products]
return JsonResponse({'MESSAGE': result}, status=201)
이번엔 list comprehension을 사용해서 코드도 훨씬 간단해지고, 가독성도 좋아졌다.