제로베이스 데이터 파트타임 스쿨 학습 일지 [25.03.21]

[강의 요약]

[Ch 01. 파이썬 기초] 강의 수강

27_양자택일 조건문(if~else문)부터 31_중첩 조건문까지 강의 수강하였음

 

 

[양자택일 조건문(if-else문)]

  • if-else문
    • 조건식 결과에 따라 둘 중에 하나가 실행된다
    • 특정 조건이 참(True) 일 때와 거짓(False) 일 때를 구분해서 각기 다른 코드를 실행하는 조건문
# if~else문의 기본 구조
if 조건:
    실행문1  # 조건이 True일 때 실행한다
else:
    실행문2  # 조건이 False일 때 실행한다
passScore = 80

myScore = int(input('점수 입력 : '))

# if문만 사용한 경우
if myScore >= passScore:
    print('PASS!!')

if myScore < passScore:
    print('FAIL!!')


# if~else문을 사용한 경우
if myScore >= passScore:
    print('PASS!!')
else:
    print('FAIL!!')

★코드 설명★

input에서 점수 입력을 90을 했다면, 90 > passScore이므로 PASS!! 가 출력된다.

input에서 점수 입력을 70을 했다면, 70 < passScore이므로 FAIL!! 이 출력된다.

들여 쓰기를 하고 코드블록을 만들어야 오류가 생기지 않으니 주의할 것

양자택일의 상황에서 if문만 사용하기보다 if~else문을 사용하는게 효율적이다.

 

 

  • pass 키워드
    • 나중에 코딩하겠다는 의미
messageString = input('문자 메시지 입력 : ')

# len()은 문자열의 길이를 알려준다.
if len(messageString) >= 500:
    pass
else:
    pass

★코드 설명★

len()으로 문자열의 길이를 알 수 있다.

참고로 공백도 길이에 포함이 된다.

 

 

 

[if~else문과 조건식]

  • 조건식(삼항연산자)의 두가지 사용법
    • 조건식 결과에 따른 실행만 하는 경우
    • 조건식 결과를 변수에 할당하는 경우
minAblePoint = 1000

userPoint = int(input('고객 포인트 입력 : '))

# 조건식 결과에 따른 실행만 하는 경우
print('포인트 사용 가능') if userPoint >= minAblePoint else print('포인트 사용 불가능')

# 조건식 결과를 변수에 할당하는 경우
result = '가능' if userPoint >= minAblePoint else '불가능'
print('포인트 사용 가능 여부 : {}'.format(result))

★코드 설명★

두 코드의 차이가 뭘까?

결과에 따른 실행은 조건에 따라 print를 하고 있고

결과를 변수에 할당하는 경우는 조건에 따라 result라는 변수에 '가능' 또는 '불가능' 문자열을 할당한 뒤에

마지막에 print 하는 코드이다.

나라면 아래의 방식으로 코드를 작성할 것 같다.

 

 

  • 조건식 vs if~else문

조건식 → if~else문 : 모든 조건식(삼항연산자)은 if~else문으로 변경할 수 있다.

무슨 말인지 아래 코드 예시를 통해 이해해 보자

# 조건식(삼항 연산자) 예시
print("포인트 사용 가능") if userPoint >= minAblePoint else print("포인트 사용 불가능")


# 동일한 로직, if~else 문으로 표현
if userPoint >= minAblePoint:
    print("포인트 사용 가능")
else:
    print("포인트 사용 불가능")

★코드 설명★

조건식 한 줄로 표현된 코드를 여러 줄의 if~else 블록으로 변경했다.

변경한 코드가 가시성이 더 좋다. (조건이 True, False일 때 실행되니까)

 

# 조건식(삼항 연산자) 예시
result = "가능" if userPoint >= minAblePoint else "불가능"
print("포인트 사용 가능 여부:", result)


# 동일한 로직, if~else 문으로 표현
if userPoint >= minAblePoint:
    result = "가능"
else:
    result = "불가능"

print("포인트 사용 가능 여부:", result)

★코드 설명★

삼항 연산자에서 즉시 변수에 할당하던 방식을 if~else에서 할당 후 출력하도록 변경했다.

result가 무엇이 될지를 조건에 따라 결정한다는 점은 동일하다.

 

 

 

▶  if ~ else문 → 조건식 : 모든 if ~ else문을 조건식(삼항연산자)으로 변경할 수 있는 것은 아님

if userPoint >= minAblePoint:
    result = '가능'
else:
    result = '불가능'
    lackPoint = minAblePoint - userPoint
    print('포인트가 {}부족합니다.'.format(lackPoint))

print('포인트 사용 가능 여부 : {}'.format(result))

★코드 설명★

실행문이 3개나 있음(else 블록에서 여러 줄 실행)

일부 if ~ else문을 조건식(삼항연산자)으로 변경할 수 없을까?

삼항 연산자는 한 줄로 True/False 결과만 반환하므로 복잡한 로직을 처리하려면 가독성이 떨어지고 표현이 어렵다.

A if 조건 else B 형태로 한 가지 결과만 반환하니까 단순한 할당이나 출력에만 유용하다.

요약하면 다양한 실행문이 연쇄적으로 필요한 경우, 변수 여러 개를 수정하고 여러 줄에 걸친 로직 처리,

블록 구조로 작성하여 가독성과 조건별 처리 흐름을 명확히 하고 싶은 경우는 if ~ else문을 사용하는 게 유리하다☆

 

이런 경우를 우리가 자체적으로 판단하고 적절하게 사용해서 코드를 작성하는 자세가 중요하다고 생각한다.

짧은 코드에서도 최적화를 잘하자!

 

 

 

[다자택일 조건문(if~elif문)]

  • if ~ elif문 : 여러 가지 조건식 결과에 따라 실행문이 결정된다
  • 한마디로 여러 가지 조건에서 하나의 조건만 뽑아서 사용한다는 것
exampleScore = int(input('시험 성적 입력 : '))
grades = ''

if exampleScore >= 90:
    grades = 'A'
elif exampleScore >= 80:
    grades = 'B'
elif exampleScore >= 70:
    grades = 'C'
elif exampleScore >= 60:
    grades = 'D'
else:
    grades = 'F'

print('성적: {} \t 학점: {}'.format(exampleScore, grades))

★코드 설명★

  • 시험 성적 입력(input)에 따라 grade가 달라진다
    • 입력 : 90
      • 성적 : 90  학점 : A
    • 입력 : 85
      • 성적 : 85  학점 : B
    • 입력 : 45
      • 성적 : 45  학점 : F

 

 

 

[다자택일 조건문 사용 시 주의할 점]

  • 조건식 순서가 중요하다.
# 조건식 순서가 올바른 코드(정상 동작)
if exampleScore >= 90:
    grades = 'A'
elif exampleScore >= 80:
    grades = 'B'
elif exampleScore >= 70:
    grades = 'C'
elif exampleScore >= 60:
    grades = 'D'
else:
    grades = 'F'
# 조건식 순서가 올바르지 않은 코드(잘못된 예시)
if exampleScore >= 70:
    grades = 'C'
elif exampleScore >= 90:
    grades = 'A'
elif exampleScore >= 80:
    grades = 'B'
elif exampleScore >= 60:
    grades = 'D'
else:
    grades = 'F'

★코드 설명★

  • 조건식 순서가 올바른 코드(정상동작)
    • 점수가 90점 이상이면 A, 그 아래 80점 이상이면 B... 이런 식으로 높은 조건부터 차례대로 검사함
    • 첫 조건이 참(True)이면 A로 결정하고 나머지는 건너뛴다
    • 순서가 올바르므로 점수 영역별로 정확한 판정이 가능하다
  • 조건식 순서가 올바르지 않은 코드(잘못된 예시)
    • 첫 조건이 70점 이상이므로 70점보다 높은 점수도 모두 70점 이상에 해당이 된다.
    • 따라서 첫 조건이 만족되면 C로 고정이 되어버리고 뒤의 조건들은 아예 검사되지 않는다
    • 즉, 90점 이상의 고득점도 C로 판정되는 오류가 발생한다

 

 

  • 조건 범위명시해야한다.
# 조건식 범위가 잘못된 코드
if exampleScore >= 70:
    grades = 'C'
elif exampleScore >= 90:
    grades = 'A'
elif exampleScore >= 80:
    grades = 'B'
elif exampleScore >= 60:
    grades = 'D'
else:
    grades = 'F'
# 조건식 범위가 올바른 코드
if exampleScore >= 70 and exampleScore < 80:
    grades = 'C'
elif exampleScore >= 90:
    grades = 'A'
elif exampleScore >= 80 and exampleScore < 90:
    grades = 'B'
elif exampleScore >= 60 and exampleScore < 70:
    grades = 'D'
else:
    grades = 'F'

★코드 설명★

  • 조건식 범위가 잘못된 코드
    • 첫 조건이 70점 이므로 80점 이상의 득점을 하더라도 C 학점을 받는 대형사고
    • elif 코드 부분들이 아예 실행되지 않음
    • 잘못된 범위 설정으로 인해 조건 순서가 역전되어 의도치 않은 결과가 나옴
  • 조건식 범위가 올바른 코드
    • 사실 첫 줄에 70점 이상 80점 미만이면 C가 출력되는 코드를 적은 게 불편하긴 하지만 로직에는 문제가 없음
    • 로직에 문제가 없다는 말 → 범위가 겹치지 않으므로 조건 충돌이 발생하지 않음
    • 각 범위가 명확하게 지정이 되어있음

 

 

 

[중첩 조건문]

중첩 조건문 : 조건문 안에 또 다른 조건문을 포함하는 구조

꿈속에 꿈처럼 조건문 안에 또 다른 조건문이 있을 수 있다!

3~4번 정도의 중첩 조건문은 잘 사용하지 않는다. 오류 발생의 이유 때문

  • 장점
    • 코드 흐름단계적으로 명확히 보여줌
    • 1차 조건이 True일 때만 2차 조건을 검사하므로 불필요한 로직을 축소할 수 있음
  • 단점
    • 중첩이 많아지면 들여쓰기가 늘어 가독성이 떨어짐
    • 지나치게 복잡해지면 유지보수가 어려움
# 중첩 조건문 기본 구조
if 조건A:
    # 조건A가 참일 때 실행
    if 조건B:
        # 조건B도 참이면 실행
    else:
        # 조건B가 거짓이면 실행
else:
    # 조건A가 거짓이면 실행
exampleScore = int(input('점수 입력: '))

if exampleScore < 60:
    print("재시험 대상입니다.")
else:
    if exampleScore >= 90:
        print("A")
    elif exampleScore >= 80:
        print("B")
    elif exampleScore >= 70:
        print("C")
    elif exampleScore >= 60:
        print("D")

★코드 설명★

  • 코드 실행 흐름
    • 참(True)이면 재시험 메시지 출력 후 끝
    • 거짓(False)이면 else 블록으로 넘어감
  • else 블록 내부
    • 점수가 90 이상인지 확인 → A
    • 80 이상 → B
    • 70 이상 → C
    • 60 이상 → D

 

 

▶ 어디에 사용할까?

  • 조건에 따라 크게 분기가 갈린 뒤, 그 안에서 다시 세분화해야 할 때
    • 위 코드처럼 재시험 여부나 학점 분류할 때
  • 1차 조건이 충족될 때만 2차 조건을 검사하는 로직
    • 사용자가 로그인했을 때만 관리자인지 확인

 

 

 

 

[나의 생각 정리]

  • 상황에 맞게 조건식과 조건문을 사용하는 게 중요한 것 같다

 

[적용점]

  • 코딩 테스트에서 조건문을 많이 사용한 기억이 있다.
  • 실무에서는 어떻게 사용할지 모르겠지만 나는 코테와 프로젝트에서 일단 잘 사용하는 게 목표다.

 

 

 

“이 글은 제로베이스 데이터 스쿨 주 3일반 강의 자료 일부를 발췌하여 작성되었습니다.”