프로그램의 구조를 쌓는 제어문

제어문에는 if, while, for등의 제어문이 있다!

if 문

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

>>> money = 1
>>> if money:
... 	print("택시를 타고 가라")
... else:
... 	print("걸어 가라")
...
택시를 타고 가라
  • money에 입력된 1은 참이다. 따라서 if문 다음의 문장이 수행되어 ‘택시를 타고 가라’가 출력 된다.

if 문의 기본 구조

  • 다음은 if와 else를 이용한 조건문의 기본 구조이다.
if 조건문:
	수행할 문장1
	수행할 문장2
	...
else:
	수행할 문장A
	수행할 문장B
	...
  • 조건문을 테스트해서 참이면 if문 바로 다음의 문장(if 블록)들을 수행하고, 조건문이 거짓이면 else문 다음의 문장(else 블록)들을 수행하게 된다. 그러므로 else문은 if문 없이 독립적으로 사용할 수 없다.

들여쓰기

if문을 만들 때는 if조건문: 바로 아래 문장부터 if문에 속하는 모든 문장에 들여쓰기를 해주어야 한다. 다음과 같이 조건문이 참일 경우 “수행할 문장1”을 들여쓰기 했고, “수행할 문장2”와 “수행할 문장3”도 들여쓰기를 해주었다.

if 조건문:
	수행할 문장1
	수행할 문장2
	수행할 문장3
  • 다음과 같이 작성하면 오류가 발생한다. “수행할 문장2”를 들여쓰기 하지 않았기 때문이다.
if 조건문:
	수행할 문장1
수행할 문장2
	수행할 문장3

조건문이란 무엇인가?

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

자료형 거짓
숫자 0이 아닌 숫자 0
문자열 “abc” ””
리스트 [1,2,3] []
튜플 (1,2,3) ()
딕셔너리 {“a”:”b”} {}

비교 연산자

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

and, or, not

  • 조건을 판단하기 위해 사용하는 다른 연산자로는 and, or, not가 있다. 각각의 연산자는 다음처럼 동작한다
연산자 설명
x or y x와 y 둘중에 하나만 참이면 참이다
x and y x와 y모두 참이어야 한다
not x x가 거짓이면 참이다
>>> money = 2000
>>> card = 1
>>> if money >= 3000 or card:
... 	print("택시를 타고 가라")
... else:
... 	print("걸어가라")
...
택시를 타고 가라
  • money는 2000이지만 card가 1이기 때문에 money >= 3000 or card이라는 조건문이 참이 된다. 따라서 if문 다음의 “택시를 타고 가라” 문장이 수행된다!

x in s, x not in s

in not in
x in 리스트 x not in 리스트
x in 튜플 x not in 튜플
x in 문자열 x not in 문자열
>>> pocket = ['paper', 'cellphone', 'money']
>>> if 'money' in pocket:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
택시를 타고 가라
>>>
  • [‘paper’, ‘cellphone’, ‘money’]라는 리스트 안에 ‘money’가 있으므로 ‘money’ in pocket은 참이 된다. 따라서 if문 다음의 문장이 수행된다.

다양한 조건을 판단하는 elif

-if와 else만으로는 다양한 조건을 판단하기 어렵다. 다음과 같은 예를 보더라도 if와 else만으로는 조건을 판단하는 데 어려움을 겪게 된다.

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

  • 위의 문장을 보면 조건을 판단하는 부분이 두 군데가 있다. 먼저 주머니에 돈이 있는지를 판단해야 하고 주머니에 돈이 없으면 다시 카드가 있는지 판단해야 한다.

    • if와 else만으로 위의 문장을 표현하려면 다음과 같이 할 수 있다.
      >>> pocket = ['paper', 'handphone']
      >>> card = 1
      >>> if 'money' in pocket:
      ...     print("택시를 타고가라")
      ... else:
      ...     if card:
      ...         print("택시를 타고가라")
      ...     else:
      ...         print("걸어가라")
      ...
      택시를 타고가라
      >>>
    
    • 위의 예제는 산만한 느낌이지만 elif를 사용하면 다음과 같이 수정가능하다.
      >>> pocket = ['paper', 'cellphone']
      >>> card = 1
      >>> if 'money' in pocket:
      ...      print("택시를 타고가라")
      ... elif card: 
      ...      print("택시를 타고가라")
      ... else:
      ...      print("걸어가라")
      ...
      택시를 타고가라
    

while문

while문의 기본 구조

반복해서 문장을 수행해야 할 경우 while문을 사용한다.

  • 다음은 while문의 기본구조이다
while <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    <수행할 문장3>
    ...
  • while문은 조건문이 참인 동안에 while문 아래에 속하는 문장들이 반복해서 수행된다!

    • “열 번 찍어 안 넘어 가는 나무 없다”라는 속담을 파이썬 프로그램으로 만든다면 다음과 같이 될 것이다.
      >>> 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번 찍었습니다.
      나무 넘어갑니다.
    

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:
  • while문을 보면 number가 4가 아닌 동안 prompt를 출력하고 사용자로부터 번호를 입력받는다. 다음의 결과 화면처럼 사용자가 4라는 값을 입력하지 않으면 계속해서 prompt를 출력한다.

    • (※ 여기서 number = int(input())는 사용자의 숫자 입력을 받아들이는 것이라고만 알아두자)
      Enter number:
      1
    	
      1. Add
      2. Del
      3. List
      4. Quit
    
    • 4를 입력하면 조건문이 거짓이 되어 while문을 빠져나가게 된다.
      Enter number:
      4
      >>>
    

while문 강제로 빠져나가기

  • while문은 조건문이 참인 동안 계속해서 while문 안의 내용을 반복적으로 수행한다. 하지만 강제로 while문을 빠져나가고 싶을 때가 있다.

    • 예를 들어 커피 자판기를 생각해 봤을 때, 자판기 안에 커피가 충분히 있을 때에는 동전을 넣으면 커피가 나온다. 그런데 자판기가 제대로 작동하려면 커피가 얼마나 남았는지 항상 검사해야 한다! 만약 커피가 떨어졌다면 판매를 중단하고 “판매 중지”라는 문구를 사용자에게 보여주어야 한다. 이렇게 판매를 강제로 멈추게 하는 것이 바로 break문이다.
>>> coffee = 10
>>> money = 300
>>> while money:
...     print("돈을 받았으니 커피를 줍니다.")
...     coffee = coffee -1
...     print("남은 커피의 양은 %d개입니다." % coffee)
...     if not coffee:
...         print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
...         break
...
  • while문의 내용을 한 번 수행할 때마다 coffee = coffee - 1에 의해서 coffee의 개수가 1개씩 줄어든다. 만약 coffee가 0이 되면 if not coffee:라는 문장에서 not coffee가 참이 되므로 if문 다음의 문장인 “커피가 다 떨어졌습니다. 판매를 중지합니다.”가 수행되고 break문이 호출되어 while문을 빠져나가게 된다.

조건에 맞지 않는 경우 맨 처음으로 돌아가기

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

무한 루프

무한 루프란 무한히 반복한다는 의미이다. 우리가 사용하는 일반적인 프로그램 중에서 무한 루프의 개념을 사용하지 않는 프로그램은 거의 없다. 그만큼 자주 사용된다는 뜻이다.

  • 다음은 무한 루프문의 기본적인 형태이다
while True: 
    수행할 문장1 
    수행할 문장2
    ...

for문

for문의 기본 구조

for문의 기본적인 구조는 다음과 같다

for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...
  • 리스트나 튜플, 문자열의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 “수행할 문장1”, “수행할 문장2” 등이 수행된다.
  1. 전형적인 for문
>>> test_list = ['one', 'two', 'three'] 
>>> for i in test_list: 
...     print(i)
... 
one 
two 
three
  1. 다양한 for문의 사용
>>> a = [(1,2), (3,4), (5,6)]
>>> for (first, last) in a:
...     print(first + last)
...
3
7
11
  • 위의 예는 a 리스트의 요소값이 튜플이기 때문에 각각의 요소들이 자동으로 (first, last)라는 변수에 대입된다.

for문과 continue

  • while문에서 살펴보았던 continue를 for문에서도 사용할 수 있다. 즉, for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다.

for와 함께 자주 사용하는 range함수

for문은 숫자 리스트를 자동으로 만들어 주는 range라는 함수와 함께 사용되는 경우가 많다.

>>> a = range(10)
>>> a
range(0, 10)
  • range(10)은 0부터 10 미만의 숫자를 포함하는 range 객체를 만들어 준다.

for와 range를 이용한 구구단의 예

>>> for i in range(2,10): 
...     for j in range(1, 10): 
...         print(i*j, end=" ") 
...     print('') 
... 

리스트 안에 for문 포함하기

리스트 안에 for문을 포함하는 리스트 내포(List comprehension)를 이용하면 좀 더 편리하고 직관적인 프로그램을 만들 수 있다

>>> a = [1,2,3,4]
>>> result = []
>>> for num in a:
...     result.append(num*3)
...
>>> print(result)
[3, 6, 9, 12]
  • 위 예제는 a라는 리스트의 각 항목에 3을 곱한 결과를 result라는 리스트에 담는 예제다
>>> result = [num * 3 for num in a]
>>> print(result)
[3, 6, 9, 12]
  • 리스트 내포를 이용하면 위와 같이 간단히 해결할 수 있다.