🔍QA & TEST/🧑🏻‍💻Python

[Python] 제어문 : if문 (조건문)

siwoobyeol 2024. 7. 15. 22:24

if 문은 왜 필요할까?

'돈이 있으면 택시를 타고 가고, 돈이 없으면 걸어간다.'

프로그래밍도 사람이 하는 것이므로 위 문장처럼 주어진 조건을 판단한 후 그 상황에 맞게 처리해야 할 경우가 생긴다.

이렇듯 프로그래밍에서 조건을 판단하여 해당 조건에 맞는 상황을 수행하는 데 쓰는 것이 바로 if 문이다.

 

# money에 true를 대입했으므로 money는 참이다.
# 따라서 if 문 다음 문장이 수행된다.
>>> money = True
>>> if money:
...     print("택시를 타고 가라")
... else:
...     print("걸어 가라")
...
택시를 타고 가라

 

위 코드가 실행된고 "택시를 타고 가라" 라는 문장이 출력되는 과정을 아래 순서도가 보여준다.

이렇게 프로그램 실행 과정을 순서도로 그려 보면 훨씬 이해하기 쉽다.

출처 : 위키독스 "점프 투 파이썬"


IDLE 셀을 쓴다면 주의하세요.
프롬프트(>>>)가 보이는 이 책의 예제는 반드시 IDLE 셀이 아닌 파이썬 셀에서 실행하도록 하자.
IDLE 셀에서는 줄 바꿈 표시(...)가 보이지 않아 들여쓰기 오류를 범할 가능성이 크다.

하지만, 파이썬 3.10부터는 IDLE 셀의 프롬프트(>>>)와 줄 바꿈 표시(...)가
왼쪽의 분리된 영역에 나타나도록 개선되었다.

따라서 파이썬 3.10 이상의 버전을 사용한다면 이 책의 예제를 IDLE 셀에서 실행해도 괜찮다.

 

if 문의 기본 구조

if와 else를 사용한 조건문의 기본 구조이다.

# 조건문을 테스트해서 참이면 if 문 바로 다음 문장 (if 블록)들을 수행하고
# 조건문이 거짓이면 else 문 다음 문장(else 블록)들을 수행하게 된다.
# 따라서 else 문은 if 문 없이 독립적으로 사용할 수 없다.
if 조건문:
    수행할_문장1
    수행할_문장2
    ...
else:
    수행할_문장A
    수행할_문장B
    ...

들여쓰기 방법 알아보기

if 문을 만들 때는 if 조건문: 바로 다음 문장부터 if 문에 속하는 모든 문장에 들여쓰기(indentation)를 해야 한다.

# 다음 예를 보면 조건문이 참일 경우 '수행할_문장1'을 들여쓰기했고
# '수행할_문장2'와 '수행할_문장3'도 들여쓰기 했다.
# 다른 프로그래밍 언어를 사용해 온 사람들은 파이썬에서 
# '수행할_문장'을 들여쓰기 하는 것을 무시하는 경우가 많으므로 더 주의해야 한다.
if 조건문:
    수행할_문장1
    수행할_문장2
    수행할_문장3

# 다음처럼 작성하면 오류가 발생한다. '수행할_문장2'를 들여쓰기하지 않았기 때문이다.
if 조건문:
    수행할_문장1
수행할_문장2
    수행할_문장3

# IDLE 에디터에서 다음과 같이 작성하여 실행해 보자.
# 여기에서는 오류가 발생하는지 확인만 하면 되므로 IDLE 에디터 창에 코드를 작성하고 [F5]를 눌러 바로 실행하자.
# indent_error.py
money = True
if money:
    print("택시를")
print("타고")
    print("가라")

출처 : 위키독스 "점프 투 파이썬"

들여쓰기 오류가 발생하는 것을 확인할 수 있다.
# 다음과 같은 경우에도 오류가 발생한다.
# '수행할_문장3'을 들여쓰기했지만, '수행할_문장1'이나 '수행할_문장2'와 들여쓰기 깊이가 다르다.
# 즉, 들여쓰기는 언제나 같은 깊이로 해야 한다.
if 조건문:
    수행할_문장1
    수행할_문장2
        수행할_문장3

# IDLE 에디터에서 다음과 같이 작성하여 실행해 보자.
# indent_error2.py
money = True
if money:
    print("택시를")
    print("타고")
        print("가라")

출처 : 위키독스 "점프 투 파이썬"

마찬가지로 들여쓰기 오류가 발생하는 것을 확인할 수 있다.

 

그렇다면 들여쓰기는 공백 문자 ([Spacebar])로 하는 것이 좋을까, 탭 문자 ([Tab])로 하는 것이 좋을까?

이에 대한 논란은 파이썬을 사용하는 사람들 사이에서 아직도 계속되고 있다.

 

공백 문자로 하자는 쪽과 탭 문자로 하자는 쪽 모두가 동의하는 내용은 2가지를 혼용해서 쓰지 말자는 것이다.

  • 공백 문자로 할 것이라면 공백으로 통일하고
  • 탭 문자로 할 것이라면 탭으로 통일하자는 말이다.

탭이나 공백은 프로그램 소스에서 눈으로 보이는 것이 아니기 때문에 혼용해서 쓰면 오류의 원인이 되므로 주의하자.

 

요즘 파이썬 커뮤니티에서는 들여쓰기를 할 때 공백 문자 4개를 사용하는 것을 권장한다.
또한 파이썬 에디터는 대부분 탭 문자로 들여쓰기를 하더라도 탭 문자를 공백 문자 4개로 자동 변환하는 기능을 갖추고 있다.

조건문 다음에 콜론(:)을 잊지 말자!
if 조건문 뒤에는 반드시 콜론(:)이 붙는다.
어떤 특별한 의미가 있다기보다는 파이썬의 문법 구조이다.

왜 하필 콜론(:)인지 궁금하다면 파이썬을 만든 귀도에게 직접 물어봐야 할 것이다.
앞으로 배울 while이나 for, def, class도 역시 문장의 끝에 콜론(:)이 항상 들어간다.
초보자들은 이 콜론(:)을 빠뜨리는 경우가 많으므로 특히 주의하자.

파이썬이 다른 언어보다 보기 쉽고 소스 코드가 간결한 이유는
바로 콜론(:)을 사용하여 들여쓰기를 하도록 만들었기 때문이다.

하지만, 이는 숙련된 프로그래머들이 파이썬을 처음 접할 때 제일 혼란스러워하는 부분이기도 하다.
다른 언어에서는 if 문에 속한 문장들을 {}로 감싸지만,
파이썬에서는 들여쓰기로 해결한다는 점을 기억하자.

조건문이란 무엇인가?

if 조건문에서 '조건문'이란 참과 거짓을 파단하는 문장을 말한다.

# 앞에서 살펴본 택시 예제에서 조건문은 money가 된다.
# money는 true이기 때문에 조건이 참이 되어 if 문 다음 문장을 수행한다.
>>> money = True
>>> if money:

비교 연산자

비교 연산자 설명
x < y x가 y보다 작다.
x > y x가 y보다 크다.
x == y x와 y가 같다.
x != y x와 y가 같지 않다.
x >= y x가 y보다 크거나 같다.
x <= y x가 y보다 작거나 같다.
# 연산자를 어떻게 사용하는지 알아보자.

# x에 3, y에 2를 대입한 후 x > y라는 조건문을 수행하면 true를 리턴한다.
# x > y 조건문이 참이기 때문이다.
>>> x = 3
>>> y = 2
>>> x > y
True

# 아래 조건문은 거짓이기 때문에 False를 리턴한다.
>>> x < y
False

# x와 y는 같지 않다. 따라서 조건문은 거짓이므로 False를 리턴한다.
>>> x == y
False

# x와 y는 같지 않다. 아래 조건문은 참이므로 True를 리턴한다.
>>> x != y
True

# 다음처럼 프로그래밍할 수 있다.
# money >= 3000 조건문이 거짓이 되기 때문에 else 문 다음 문장을 수행하게 된다.
>>> money = 2000
>>> if money >= 3000:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
걸어가라

and, or, not

조건을 판단하기 위해 사용하는 다른 연산자로는 and, or, not이 있다.

연산자 설명
x or y x와 y 둘 중 하나만 참이어도 참이다.
x and y x와 y 모두 참이어야 참이다.
not x x가 거짓이면 참이다.

 

다음 예를 통해 or 연산자의 사용법을 알아보자.

돈이 3000원 이상 있거나 카드가 있다면 택시를 타고 가고, 그렇지 않으면 걸어가라.
# money는 2000이지만, card가 true이기 때문에 money >= 3000 or card 조건문이 참이 된다.
# 따라서 if문에 속한 '택시를 타고 가라' 문장이 출력된다.
>>> money = 2000
>>> card = True
>>> if money >= 3000 or card:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
택시를 타고 가라

in, not in

파이썬은 다른 프로그래밍 언어에서 쉽게 볼 수 없는 재미있는 조건문도 제공한다.

in not in
x in 리스트 x not in 리스트
x in 튜플 x not in 튜플
x in 문자열 x not in 문자열

 

영어 단어 in의 뜻이 '~안에'라는 것을 생각해 보면 다음 예가 쉽게 이해될 것이다.

>>> 1 in [1, 2, 3] # '리스트 안에 1이 있는가?' 조건문
True # 1은 [1, 2, 3] 안에 있으므로 참이 되어 True를 리턴한다.

>>> 1 not in [1, 2, 3] # '리스트 안에 1이 없는가?' 조건문
False # 1은 [1, 2, 3] 리스트 안에 있으므로 거짓이 되어 False를 리턴한다.

# 다음은 튜플과 문자열에 in과 not in을 적용한 예이다.
>>> 'a' in ('a', 'b', 'c')
True
>>> 'j' not in 'python'
True

# 이번에는 계속 하용해 온 택시 예제에 in을 적용해 보자.
# 만약 주머니에 돈이 있으면 택시를 타고 가고, 없으면 걸어가라.

>>> pocket = ['paper', 'cellphone', 'money']
>>> if 'money' in pocket: # pocket 리스트 안에 money가 있으므로 참이 된다.
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
택시를 타고 가라
조건문에서 아무 일도 하지 않게 설정하고 싶다면?
가끔 조건문의 참, 거짓에 따라 실행할 행동을 정의할 때나 아무런 일도 하지 않도록 설정하고 싶을때가 있다.
주머니에 돈이 있으면 가만히 있고, 주머니에 돈이 없으면 카드를 꺼내라.

이럴 때 사용하는 것이 바로 pass이다.

# pocket 리스트 안에 money 문자열이 있기 때문에 if 문 다음 문장인 pass가 수행되고
# 아무런 결괏값도 보여 주지 않는다.
>>> pocket = ['paper', 'money', 'cellphone']
>>> if 'money' in pocket:
...     pass 
... else:
...     print("카드를 꺼내라")
...

다양한 조건을 판단하는 elif

if와 else만으로는 다양한 조건을 판단하기 어렵다.

다음 예를 보더라도 if와 else만으로는 조건을 판단하는데 어려움을 겪게 된다는 것을 알 수 있다.

주머니에 돈이 있으면 택시를 타고 가고, 주머니에 돈은 없지만 카드가 있으면 택시를 타고 가고, 돈도 없고 카드도 없으면 걸어가라.

 

위 문장을 보면 조건을 판단하는 부분이 두 군데 있다.

먼저 주머니에 돈이 있는지를 판단해야 하고 주머니에 돈이 없으면 다시 카드가 있는지 판단해야 한다.

 

if와 else만으로 위 문장을 표현하려면 다음과 같이 할 수 있다.

>>> pocket = ['paper', 'cellphone']
>>> card = True
>>> if 'money' in pocket:
...     print("택시를 타고가라")
... else:
...     if card:
...         print("택시를 타고가라")
...     else:
...         print("걸어가라")
...
택시를 타고가라
>>>

# 언뜻 보기에도 이해하기 어렵고 산만한 느낌이 든다.
# 이런 복잡합을 해결하기 위해 파이썬에서는 다중 조건 판단을 가능하게 하는 elif를 사용한다.
# 위 예에 elif를 사용하면 다음과 같이 바꿀 수 있다.
>>> pocket = ['paper', 'cellphone']
>>> card = True
>>> if 'money' in pocket:
...      print("택시를 타고가라")
... elif card: 
...      print("택시를 타고가라")
... else:
...      print("걸어가라")
...
택시를 타고가라

# 즉, elif는 이전 조건문이 거짓일 때 수행된다.
# if, elif, else를 모두 사용할 때 기본 구조는 다음과 같다.
if 조건문:
    수행할_문장1 
    수행할_문장2
    ...
elif 조건문:
    수행할_문장1
    수행할_문장2
    ...
elif 조건문:
    수행할_문장1
    수행할_문장2
    ...
...
else:
   수행할_문장1
   수행할_문장2
   ...

 

위에서 볼 수 있듯이 elif는 개수에 제한 없이 사용할 수 있다.

출처 : 위키독스 "점프 투 파이썬"


if 문을 한 줄로 작성하기
앞의 pass를 사용한 예를 보면 if문 다음에 수행할 문장이 한 줄이고
else 문 다음에 수행할 문장도 한 줄밖에 되지 않는다.
# 이렇게 수행할 문장이 한 줄일 때 좀 더 간략하게 코드를 작성하는 방법이 있다.
>>> if 'money' in pocket:
...     pass 
... else:
...     print("카드를 꺼내라")
...

# if 문 다음에 수행할 문장을 콜론(:) 뒤에 바로 적었다.
# else 문 역시 마찬가지이다.
>>> pocket = ['paper', 'money', 'cellphone']
>>> if 'money' in pocket: pass
... else: print("카드를 꺼내라")
...

조건부 표현식

score가 60 이상일 경우 message에 문자열 "success", 아닐 경우에는 문자열 "failure"를 대입하는 코드이다.

if score >= 60:
    message = "success"
else:
    message = "failure"

 

파이썬의 조건부 표현식 (conditional expression)을 사용하면 위 코드를 다음과 같이 간단히 표현할 수 있다.

message = "success" if score >= 60 else "failure"

 

조건부 표현식은 다음과 같이 정의한다.

변수 = 조건문이_참인_경우의_값 if 조건문 else 조건문이_거짓인_경우의_값

 

조건부 표현식은 가독성에 유리하고 한 줄로 작성 할 수 있어 활용성이 좋다.

 

출처 : https://wikidocs.net/20