Python & Django : views.py 에서 반복문 속 삼항연산자 사용하기

채록·2021년 2월 19일
0

Python & Django

목록 보기
26/34
post-thumbnail

이걸 이제 알다니!!

감사합니다 소헌님...

Q ) 내 벨로그에서 가장 많이 등장하는 분은? ^__^....




삼항 연산자

삼항이냐? 항이 3개!

Python뿐만이 아니라 다른 언어에서도 존재하는 개념이다!! 다만 언어마다 그 형태가 다를 뿐이다. python에서구조는 다음과 같다.

value1 if 조건 else value2

조건이면value1을, 조건거짓이면 value2의 값을 의미한다.


예제로 알아보기


입력한 숫자 num이 짝수면 "짝수" 홀수면 "홀수" 를 출력하기

# -*- coding: utf-8 -*- 
num = int(input('>>> '))
print("짝수" if num%2==0 else "홀수")

# -- coding: utf-8 --
vscode에서 한글을 인식하지 못하고 에러를 보냈다. SyntaxError: Non-ASCII character '\xec' in file ...(생략) ("짝수"라는 한글이 /xec 형태인가보다)
그래서 한글을 encoding하도록 위의 명령어를 입력해 주었다.

위 코드를 실행하면 다음과 같다

# by vscode
❯ python pj_test.py
>>> 3
홀수
❯ python pj_test.py
>>> 4
짝수



반복문 속 삼항 연산자를 사용하기 전 형태

프로젝트관련 로직을 짜다가 조건에 따라 가져오는 값이 다른 로직이 필요했다.

한 게시물에 대한 댓글이 있으면 그 댓글들 중 가장 첫번째 댓글만 불러오고, 댓글이 하나도 없으면 "None" 내용을 갖도록 한다.

근데 이러한 형태의 field가 3개였다.

처음 작성한 코드는 다음과 같다.

# in posting/views.py
for posting in postings:
    if not posting.comment.exists():
        comment_user_image  = "None"
        comment_user_name   = "None"
        comment_content     = "None"
    else:
        comment_user_image  = posting.comment.get(id=1).user.image_url
        comment_user_name   = posting.comment.get(id=1).user.name
        comment_content     = posting.comment.get(id=1).content

보이는가. 화려한 6줄의 코드들.
보이는가. else 문으로 굳이 indent를 준 형태가.



반복문 속 삼항연산자 사용


코드 수정 : 1st ver.

처음엔 단순하게 생각해 저 형태를 모조리 삼항연사자 그대로 바꾸는줄 알았다.

  for posting in postings:
      (comment_user_image = "None" if not posting.comment.exists() else comment_user_image = posting.comment.get(id=1).user.image_url)
      (comment_user_name = "None" if not posting.comment.exists() else comment_user_name = posting.comment.get(id=1).user.name)
      (comment_content = "None" if not posting.comment.exists() else comment_content = posting.comment.get(id=1).content)

이렇게 하니 runserver 화면에서 다음과 같은 에러가 발생했다.
SyntaxError: cannot assign to conditional expression

코드 수정 : 2nd ver.

"conditional"형태는 안된다니? value에 말그대로 value가 들어가야지. 무언가 "conditional"형태는 안되는가 싶어 수정했다.

for posting in postings:
    comment_user_image = ("None" if not posting.comment.exists() else posting.comment.get(id=1).user.image_url)
    comment_user_name = ("None" if not posting.comment.exists() else posting.comment.get(id=1).user.name)
    comment_content = ("None" if not posting.comment.exists() else posting.comment.get(id=1).content)

잘 동작한다!!




삼항연산자를 통해 보기좋고 깔끔하게 코드를 정리할 수 있었다! 굿굿

profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글