파이썬을 배워보자 8일차 - 조건문(if-elif-else)

0

Python

목록 보기
8/18

점프 투 파이썬 : https://wikidocs.net/book/1
파이썬 기본을 갈고 닦자 : https://wikidocs.net/16031

if문

파이썬의 조건문으로 다른 언어와 크게 다를 바는 없다. 그러나 재밌는 것은 {}로 조건문의 본문이 시작되지 않고 오직 들여쓰기 4칸 공백으로만 본문이 표시된다는 것이다. 또한, 조건문의 부분을 ()으로 감쌀 필요없이 :으로 본문과 나눌 수 있다.

1. if 기본구조

if문은 다음과 같은 기본 구조를 갖는다.

  1. if 다음에 나오는 조건절에 () 붙이지 않아도 된다. 붙인다고 문제될 것은 없다.
  2. :으로 조건절과 본문을 나눈다.
  3. 본문은 들여쓰기(tab 또는 4칸 공백)으로 구분한다.
  4. return으로 반환할 값을 쓸 수 있다. return할 값이 없다면 안써도 된다.
if 조건:
    본문
    본문
    return

아주 조심해야할 것은 바로 들여쓰기이다. 괜히 4칸 공백 또는 tab을 누르라는 것이 아니다. 요즘은 인터프리터가 잘 캐치해내어서 실수를 많이 보완하지만 코드가 복잡해질수록 들여쓰기 실수는 찾기힘든 문제로 덧나갈 수 있다.

2. 비교 연산자

if문의 조건절에는 비교연산자를 사용하여 조건을 형성할 수 있다. 비교 연산자는 다음이 있다.

비교연산자설명
x < yx가 y보다 작다.
x > yx가 y보다 크다.
x == yx와 y가 같다.
x != yx와 y가 다르다.
x <= yx가 y보다 작거나 같다.
x >= yx가 y보다 크거나 같다.

굉장히 간단한 비교연산자이다.

value = 2

if value <= 2:
    print("hello")

if value != 1:
    print("world")

if value > 3:
    print("no!")

#hello
#world

"no"는 나오지 않는 것을 확인할 수 있다. 이러한 비교연산자는 사실 bool형의 값을 리턴하기 때문에 조건절에 사용할 수 있는 것이다.

즉, 조건절은 bool형이 오면 뭐든 사용할 수 있다는 것이다.

x = 2
y = 3
print( x< y ) # True
print( x == y) # False

따라서 if x < y:if True:로 되어 본문으로 넘어갈 수 있게 되는 것이다. 반면 if x == y:if False:로 되어 본문으로 넘어갈 수 없게 될 것이다.

그런데 하나의 조건절에 조건을 여러개 달고 싶으면 어떻게 해야할까??

2.1 and, or, not

조건을 여러개 달기위해서는 and, or, not을 사용하면 된다.

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

이를 이용해서 다음의 조건문을 만들어보자

학생이면서 교통카드를 사용하면 900으로 결제하도록 한다.

people = "student"
card = True

if people == "student" and card == True:
    print("900 pay")  # 900 pay

학생교통카드 조건을 모두 성립하려면 and을 사용하여 조건들을 연결하면 된다.

학생이거나 card을 쓰면 900원을 결제하도록 한다.

다음의 조건은 or을 사용하면 된다.

people = "business man"
card = True

if people == "student" or card:
    print("900 pay") # 900 pay

3. x in s, x not in s

x in s은 x가 s안에 있는 가 없는 가에 대한 조건이다. 이를 통해 조건문을 만들 수 있다.

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

이 처럼, in을 사용하여 특정 원소가 리스트, 튜플, 문자열에 있는 지 없는 지 판별할 수 있다.

a = [1,2,3,4,5,6]
b = (1,2,3,4,5,6)
c = "hello world"

if 2 in a:
    print("list check") # list check

if 3 in b:
    print("tuple check") # tuple check

if 10 not in a:
    print("there is no element 10") # there is no element 10

if 'w' in c:
    print("w!") # w!

if 'llo' in c:
    print('llo') # llo

특정 원소가 있는 지 없는 지 찾기 매우 편한 방법이다. 특히 문자열에 부분 문자열을 찾는 방법이 매우 좋은데, 이는 문제를 풀 때 다양한 방식으로 사용할 수 있어 좋다.

4. 다양한 조건을 판단하는 elif, else

if만 사용하여 조건을 판별하는 것은 코드가 매우 복잡해지고 눈이 피로해진다. 그래서 if조건이 실패할 경우, 다른 조건문으로 빠지도록 만들 수 있는데 거기에 사요오디는 것이 elif, else이다.

학생이면 900원을 결제, 아니면 1000원 결제하도록 하자
이걸 if문으로만 구현한다고하면, 학생이 아닌 경우를 어떻게 해야할지 난감하다.

a = "student"
b = "business"
c = "docker"
d = "soldier"

if a in "student":
    print("pay 900")

if a in "business" and a in "docker" and a in "soldier":
    print("pay 1000")

다음의 경우를 보자, 지금이야 "business", "docker", "solider"만 있어서 다행이지만 추가되면 추가될 수록 복잡해지고 유지보수도 쉽지 않다.

그래서 if문이 실패하면 나머지인 경우를 처리하도록 하는 조건문인 else를 사용해보자. else에는 조건이 들어가지 않는다. 오직 if가 실패하면 else로 빠지기 때문이다.

a = "student"
b = "business"
c = "docker"
d = "soldier"

if b in "student":
    print("pay 900")

else:
    print("pay 1000") # pay 1000

코드가 훨씬 간단해졌다. 보기도 쉬워졌고 유지보수도 쉬워졌다. 이렇게 elseif조건을 통과하지못한 나머지를 받기 위해 사용한다.

그런데, if조건은 통과하지 못했지만 특정 조건을 달고 싶으면 어떻게 해야할까? 가령 solider은 950원으로 하고 싶다고하면 이렇게 해야할 것이다.

a = "student"
b = "business"
c = "docker"
d = "soldier"

if d in "student":
    print("pay 900")

else:
    if d in "soldier":
        print("pay 950") # pay 950
    else:
        print("pay 1000")

if-else만으로도 충분히 구현가능하지만 조건문 안에 조건문이 들어가는 nested 구조가 되어버렸다. 이러한 구조는 가독성을 해치는 문제가 있다. 이를 해결하기 위해 elif가 있는 것이다. 참고로 elifelse if의 약자이다.

elif는 조건을 갖는다. 즉, if 조건을 통과하진 못했지만 else로는 가지않아야할 조건을 elif에 담는 것이다.

a = "student"
b = "business"
c = "docker"
d = "soldier"

if d in "student":
    print("pay 900")
elif d in "soldier":
    print("pay 950") # pay 950
else:
    print("pay 1000")

다음과 같이 if조건에 통과히지못하면 elif 조건에 간다. 지금은 elif조건을 통과했는데, 만약 통과하지 못하면 else로 가게 된다.

따라서, else는 자신과 엮은 조건들의 나머지인 것이다. 따라서 elseif로 시작하는 조건문의 가장 마지막이며 단 하나만 사용될 수 있다.

반면 elifif조건을 통과하지 못하는 조건들을 처리하고 else로는 빠지지 말아야 할 것들이다. 이를 위해 ``elif```는 여러 개가 있을 수 있다.

a = "student"
b = "business"
c = "docker"
d = "soldier"

if  c in "student":
    print("pay 900")
elif c in "soldier":
    print("pay 950")

elif c in "docker":
    print("pay 990") # pay 990

else:
    print("pay 1000")

다음과 같이 쓸 수 있다. 이렇게 if-elif-else 세트를 사용할 수 있다.

참고로 만약 if문에 쓸게 없으면 ``pass를 쓰면된다. python도 그렇고 go도 if문이 있는데 본문 내용이 없으면 에러를 뱉는다. 따라서 pass```로 처리해주는 것이다.

if True:
    pass

5. 조건부 표현식과 ? 연산자

다음의 조건문을 보자

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

print(message) # failure

본문이 한 줄이라면 조건문과 함께 나란히 한 줄로 쓸 수 있다.

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

print(message) # failure

그럼 if-else문을 하나로 만들 수는 없을까??

조건부 표현식(conditional expression)을 사용하면 조건식을 간단히 표현할 수 있다.

score = 50
message = "success" if score > 60 else "failure"
print(message) # failure

조건부 표현식은 다음과 같은 공식이다.

변수 = 조건성공값 if 조건 else 조건실패값

사실 조건부 표현식은 다른 언어의 삼항 연산자(?)와 같은 공식이고 같은 기능이다. 다만 python에는 삼항 연산자가 없으니 조건부 표현식을 사용하도록 하자.

0개의 댓글