• 기본 원리 : 조건문을 테스트해서 참이면 if문 바로 다음 문장(if 블록)들을 수행하고, 조건문이 거짓이면 else문 다음 문장(else 블록)들을 수행하게 된다. 그러므로 else문은 if문 없이 독립적으로 사용할 수 없다. 참과 거짓을 판단하는 문장이라는 것에 유념하자.
  • 들여쓰기 할 때 : 탭으로 해도 되고 스페이스 바를 이용해도 된다. 둘 중 어느 것을 사용해야 되는지 논란이 있으나 단 하나 주의해야 할 것은 둘 다 사용해도 되지만 2가지를 혼용해서 쓰지 말자는 것이다 .공백으로 할거면 항상 공백으로 통일하고 탭으로 할 거면 항상 탭으로 통일해서 사용하자는 말이다. 탭이나 공백은 프로그램 소스에서 눈으로 보이는 것이 아니기 때문에 혼용해서 쓰면 오류의 원인이 될 수 있다.
    • 요즘 파이썬 커뮤니티에서는 들여쓰기를 할 때 공백 4개를 사용하는 것을 권장한다고 한다.
  • : 콜론을 잊지 말자
    • if 조건문 뒤에는 반드시 콜론이 붙는다. 어떤 특별한 의미가 있다기보다는 파이썬의 문법구조이다. 앞으로 배울 while이나 for def class에도 역시 문장의 끝에 콜론이 항상 들어간다. 다른 언어에서는 if문은 {}기호로 감싸지만 파이썬에서는 들여쓰기로 해결한다는 점을 기억하자.
  • 조건을 판단하기 위해 사용하는 연산자로 and(둘 다 참), or(둘 중 하나만 참이어도 참), not x(x가 거짓이면 참)
  • 파이썬은 다른 프로그래밍 언어에서 쉽게 볼 수 있는 재미있는 조건문을 제공한다.
    • x in [], x not in []
    • x in (), x not in ()
    • x in '', x not in ''
    • 이 자체가 if 조건문에서 조건문 위치의 참과 거짓을 판별하여 if블록을 수행할지 else 블록을 수행할지 결정하는 것이다.
  • 가끔 조건문의 참,거짓에 따라 실행할 행동을 정의할 때 아무런 일도 하지 않도록 설정하고 싶을 떄가 있다.
    • "주머니에 돈이 있으면 가만히 있고 주머니에 돈이 없으면 카드를 꺼내라"
      pocket = ['paper', 'money', 'cellphone']
      if 'money' in pocket:
      pass 
      else:
      print("카드를 꺼내라")
      
  • 해당 조건문에선 pass가 수행되어 아무 결괏값도 보여주지 않는 것이다.

  • 다양한 조건을 판단할 수 있도록 elif를 사용할 수 있다.
    pocket = ['paper', 'handphone']
    card = True
    if 'money' in pocket:
      print("택시를 타고가라")
    else:
      if card:
          print("택시를 타고가라")
      else:
          print("걸어가라")
    
  • 언뜻 보기에도 이해하기 어렵고 산만한 느낌이 든다. 이런 복잡함을 해결하기 위해 파이썬에서는 다중 조건 판단을 가능하게 하는 elif를 사용할 수 있다.
  • 동일한 조건문을 elif를 이용하여 간결히 표현해보자
    if <조건문>:
      <수행할 문장1> 
      <수행할 문장2>
    elif <조건문>:
      <수행할 문장1>
      <수행할 문장2>
    elif <조건문>:
      <수행할 문장1>
      <수행할 문장2>
    else:
     <수행할 문장1>
     <수행할 문장2>
    
  • 위에서 볼 수 있듯이 elif는 개수에 제한 없이 사용할 수 있다.

  • if문을 한 줄로 작성해보자
    if 'money' in pocket:
      pass
    else:
      print("카드를 꺼내라")
    
  • 이 문장을 간결하게 한 줄로 작성해보자
    if money in pocket: pass
    else: print("카드를 꺼내라")
    
  • 이렇게 if문 다음 수행할 문장을 콜론 바로 뒤에 작성해도 된다. else문도 동일하다.
  • 굳이 다음줄로 넘겨서 수행할 문장을 작성하지 않아도 된다는 것이다.

  • 조건부 표현식을 살펴보자
    if score >= 60:
      message = "success"
    else:
      message = "failure"
    
  • 위 코드는 score가 60 이상일 경우 message에 문자열 "succes"를, 아닐 경우에는 "failure"를 대입하는 코드이다.
  • 파이썬의 조건부 표현식을 이용하면 위 코드를 한 줄로 간결화할 수 있다.
    message = "success" if score >= 60 else "failure"
    
  • list comprehension과 유사하게 생각해도 될 것 같다. 조건부 표현식은 가독성에 유리하고 한 줄로 작성할 수 있어 활용성이 좋다.

  • while문
    • 반복해서 문장을 수행해야 할 경우 while문을 사용한다. 그래서 while문을 반복문이라고도 부른다.
    • while문의 기본 구조에 대해 알아보자
      while <조건문 자리(True of False)>:
      <수행할 문장1>
      <수행할 문장2>
      <수행할 문장3>
      
  • while문은 조건문이 참인 동안에 while문 아래의 문장이 반복해서 수행된다.
  • 10번 찍어 안 넘어가는 나무 없다라는 속담을 구현해보자
treeHit = 0
while treeHit < 10:
    treeHit = treeHit +1
    print("나무를 %d번 찍었습니다." % treeHit)
    if treeHit == 10:
        print("나무 넘어갑니다.")
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 3번 찍었습니다.
나무를 4번 찍었습니다.
나무를 5번 찍었습니다.
나무를 6번 찍었습니다.
나무를 7번 찍었습니다.
나무를 8번 찍었습니다.
나무를 9번 찍었습니다.
나무를 10번 찍었습니다.
나무 넘어갑니다.
treeHit = 0
while treeHit < 10:
    treeHit = treeHit +1
    print("나무를 %d번 찍었습니다." % treeHit)
    if treeHit == 10:
        break
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 3번 찍었습니다.
나무를 4번 찍었습니다.
나무를 5번 찍었습니다.
나무를 6번 찍었습니다.
나무를 7번 찍었습니다.
나무를 8번 찍었습니다.
나무를 9번 찍었습니다.
나무를 10번 찍었습니다.
treeHit = 0
while treeHit < 10:
    treeHit +=1
    print("나무를 {}번 찍었습니다.".format(treeHit))
    if treeHit == 10:
        break
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 3번 찍었습니다.
나무를 4번 찍었습니다.
나무를 5번 찍었습니다.
나무를 6번 찍었습니다.
나무를 7번 찍었습니다.
나무를 8번 찍었습니다.
나무를 9번 찍었습니다.
나무를 10번 찍었습니다.
  • 이렇게 treeHit이 10이면 break를 수행할 수도 혹은 또 다른 명령문을 수행할 수도 있겠다.
  • 위 예에서 while문의 조건문은 treeHit < 10이다. 즉 treeHit가 10보다 작은 동안에 while문 안의 문장을 계속 수행한다. whlie문 안의 문장을 보면 제일 먼저 treeHit = treeHit + 1로 treeHit 값이 계속 1씩 증가한다. 그리고 나무를 treeHit번만큼 찍었음을 알리는 문장을 출력하고 treeHit가 10이 되면 "나무 넘어갑니다."라는 문장을 출력한다. 그러고 나면 treeHit < 10 조건문이 거짓이 되므로 while문을 빠져나가게 된다.
    • 결론 : while 조건문에서 조건문이 참이면 while안의 명령문을 계속 반복 수행하고 거짓이면 while에서 벗어나서 다음 줄로 넘어가게 된다.

  • 이번에는 여러 가지 선택지 중 하나를 선택해서 입력받는 예제를 만들어보자, 먼저 다음과 같이 여러 줄짜리 문자열을 만들어보자
prompt = """
1. Add
2. Del
3. List
4. Quit
Enter number: """
  • 이어서 number 변수에 0을 먼저 대입한다. 이렇게 변수를 먼저 설정해 놓지 않으면 다음에 나올 while문의 조건문인 number != 4에서 변수가 존재하지 않는다는 오류가 발생한다.
number = 0
while number != 4:
    print(prompt)
    number = int(input())
1. Add
2. Del
3. List
4. Quit
Enter number: 
1. Add
2. Del
3. List
4. Quit
Enter number: 
1. Add
2. Del
3. List
4. Quit
Enter number: 
  • 이런식으로 4를 입력하면 조건문이 거짓이 되어 while문을 빠져나가게 된다.

  • while문에서 강제로 빠져나가보자
  • while문은 조건문이 참인 동안 계속해서 while문 안의 내용을 반복적으로 수행한다. 하지만 강제로 while문을 빠져나가고 싶을 때가 있다. 예를 들어 커피 자판기를 생각해 보자. 자판기 안에 커피가 충분히 있을 때에는 동전을 넣으면 커피가 나온다. 그런데 자판기가 제대로 작동하려면 커피가 얼마나 남았는지 항상 검사해야 한다. 만약 커피가 떨어졌다면 판매를 중단하고 "판매 중지" 문구를 사용자에게 보여주어야 한다. 이렇게 판매를 강제로 멈추게 하는 것이 바로 break문이다.
  • image.png
coffee = 10
money = 300
while money:
    print("돈을 받았으니 커피를 줍니다.")
    coffee = coffee -1
    print("남은 커피의 양은 %d 입니다." % coffee)
    if coffee == 0:
        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
        break
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 9 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 8 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 7 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 6 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 5 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 4 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 3 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 2 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 1 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 0 입니다.
커피가 다 떨어졌습니다. 판매를 중지합니다.
coffee = 10
money = 300
while money:
    print("돈을 받았으니 커피를 줍니다.")
    coffee -= 1
    print("남은 커피의 양은 %d 입니다." % coffee)
    if coffee == 0:
        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
        break
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 9 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 8 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 7 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 6 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 5 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 4 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 3 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 2 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 1 입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 0 입니다.
커피가 다 떨어졌습니다. 판매를 중지합니다.
  • money가 300으로 고정되어 있으므로 while money:에서 조건문인 money는 0이 아니기 때문에 항상 참이다. 0일 땐 Fasle이며 그 외의 숫자에선 항상 True이다. 따라서 무한히 반복되는 무한 루프를 돌게 된다. 그리고 while문의 내용을 한 번 수행할 때마다 coffee = coffee - 1 혹은 coffee -= 1에 의해서 coffee의 개수가 1개씩 줄어든다. 만약 coffee가 0이 되면 if coffee == 0: 문장에서 coffee == 0:이 참이 되므로 if문 다음 문장 "커피가 다 떨어졌습니다. 판매를 중지합니다."가 수행되고 break문이 호출되어 while문을 빠져나가게 된다.
coffee = 3
while True:
    money = int(input("돈을 넣어 주세요: "))
    if money == 300:
        print("커피를 줍니다.")
        coffee = coffee -1
        print("커피 이만큼 남음 => {}".format(coffee))
    elif money > 300:
        print("거스름돈 %d를 주고 커피를 줍니다." % (money -300))
        coffee = coffee -1
        print("커피 이만큼 남음 => {}".format(coffee))
    else:
        print("돈을 다시 돌려주고 커피를 주지 않습니다.")
        print("남은 커피의 양은 %d개 입니다." % coffee)
    if coffee == 0:
        print("커피가 다 떨어졌습니다. 판매를 중지 합니다.")
        break
거스름돈 246를 주고 커피를 줍니다.
커피 이만큼 남음 => 2
돈을 다시 돌려주고 커피를 주지 않습니다.
남은 커피의 양은 2개 입니다.
거스름돈 246를 주고 커피를 줍니다.
커피 이만큼 남음 => 1
거스름돈 354를 주고 커피를 줍니다.
커피 이만큼 남음 => 0
커피가 다 떨어졌습니다. 판매를 중지 합니다.

  • while문의 맨 처음으로 돌아가기
    • while문 안의 문장을 수행할 때, 입력 조건을 검사해서 조건에 맞지 않으면 while문을 빠져나간다. 그런데 프로그래밍을 하다 보면 while문을 빠져나가지 않고 while문의 맨 처음(조건문)으로 다시 돌아가게 만들고 싶은 경우가 생길 수 있다. 이때 사용하는 것이 바로 continue이다.
    • 1~10까지의 숫자중에서 홀수만 출력하는 것을 while문을 사용해서 작성한다고 해보자
a = 0
while a<10:
    a += 1
    if a%2 == 0 : continue # 다시 while문의 맨 처음인 조건문으로 돌아가게 된다.
    print(a)
1
3
5
7
9

  • 무한 루프
    • 무한 루프란 무한히 반복한다는 의미이다. 우리가 사용하는 일반 프로그램 중에서 무한 루프 개념을 사용하지 않는 프로그램은 거의 없다. 그만큼 자주 사용하게 될 것이다.
    • 파이썬에서 무한 루프는 while문으로 구현할 수 있다. 다음은 무한 루프의 기본 형태이다.
      while True:
      수행할 문장1
      수행할 문장2
      
  • while문의 조건문이 True이므로 항상 참이 된다. 따라서 while문 안에 있는 문장 2개는 무한히 수행될 것이다.