Machine Learning/Tensorflow

07. 제어문(if, while, for) 사용

728x90

01. 제어문 - 분기문 if

     - 조건에따라 판단을하여 코드를 실행합니다.
     - 
조건에 따라 분기를   있습니다
     - if 
조건식:
         
참일 경우 실행
       else:
         
거짓일 경우 실행
     - 
중괄호 블럭안은 경계를 위해 들여쓰기를 2(2~4)정도해야합니다.  
      . 
콜론 다음 라인부터 시작하는 코드는 들여쓰기 간격이 모두 동일해야합니다.
      . 
들여쓰기 간격이 일정하지 않으면 ERROR 발생(JAVA는 상관 없음)
     - 
블럭 지정후 'TAB' 키를 누르면 모두 들여쓰기가 됨.
     - 
블럭 지정후 'Shift+TAB' 키를 누르면 모두 내어쓰기가 됨.  

1. If문의 기본 형태

참일 경우만 실행하는 단순 if 

 

- 참과 거짓일 경우 각각 다르게 실행되는 if

- 여러개의 if 조건을 나열하고 해당하는 조건에 참인 if 문을 실행하고 if 문 전체를 종료합니다.

 - if문은 if문을 포함 할 수 있습니다.

 - or: OR 
연산자, 조건중 하나라도 참이면  처리, '또는'의 의미
  
) if su % 2 == 0 or su % 3 == 0:

 - and: AND 
연산자, 모든 조건을 만족해야 참으로 처리, '그리고'의 의미
  
) if su % 2 == 0 and su % 3 == 0: 

2. IF문의 기본 구조

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

if 조건문:
    수행할 문장1
    수행할 문장2
    ...
else:
    수행할 문장A
    수행할 문장B
    ...

조건문을 테스트해서 참이면 if문 바로 다음 문장(if 블록)들을 수행하고, 조건문이 거짓이면 else문 다음 문장(else 블록)들을 수행하게 된다. 그러므로 else문은 if문 없이 독립적으로 사용할 수 없다.

 

3. IF문의 다양한 사용 예

 /python/notebook/basic/IfTest.ipynb

age = 19
vote = '투표 가능' if age >= 19 else '투표 불가능' # 3항 연산자
print(vote)

.....
su = 1
if su == 1:
    print('January')
elif su == 2:
    print('February')
elif su == 3:
    print('March')
else:
    print('1~3을 입력하세요.')

.....
test = 85
if (test >= 60):
    print('채용 합격')
    if test >= 85:
        print('-> 프로젝트 참여') # 85 ~
    else:
        print('-> 추가교육 1개월') # 60 ~ 84
else:
    print('다음 기회에 시도해주세요.')

.....
score = 70
str1=''
if score >= 90:
    str1 = 'A'
elif score >= 80 and score <= 89:
    str1 = 'B'
elif score >= 70 and score <= 79:
    str1 = 'C'
elif score >= 60 and score <= 69:
    str1 = 'D'    
else:
    str = 'F'
print('등급: ' + str1)    

.....
month = 12
if (month == 12 or month == 1 or month == 2):
    print('겨울입니다.') 

 

money = True
if money:
     print("택시를 타고 가라")
else:
     print("걸어 가라")

 

4. 콘솔 파라미터 입력

import sys

var0 = sys.argv[0] <- 파일명
var1 = sys.argv[1]
var2 = int(sys.argv[1])

 /python/notebook/basic > python 파일명.py 인수1 인수2... 

[실습 1] 하나의 수를 입력받아 2, 3, 4, 5의 배수인지 판단하는 프로그램을 제작하세요

 

02 들여쓰기 

if문을 만들 때는 if 조건문: 바로 아래 문장부터 if문에 속하는 모든 문장에 들여쓰기(indentation)를 해주어야 한다. 오른쪽에서 보는 것과 같이 조건문이 참일 경우 "수행할 문장1"을 들여쓰기했고 "수행할 문장2"와 "수행할 문장3"도 들여쓰기 해 주었다. 다른 프로그래밍 언어를 사용해 온 사람들은 파이썬에서 "수행할 문장"을 들여쓰기하는 것을 무시하는 경우가 많으니 더 주의해야 한다.

if 조건문:
    수행할 문장1
    수행할 문장2
    수행할 문장3

다음처럼 작성하면 오류가 발생한다. "수행할 문장2"를 들여쓰기하지 않았기 때문이다.

if 조건문:
    수행할 문장1
수행할 문장2
    수행할 문장3

IDLE 에디터에서 다음과 같이 작성하여 실행해 보자. 여기에서는 오류가 뜨는지 확인만 하면 되니 IDLE 에디터 창에서 바로 실행하자(단축키:F5).

money = True
if money:
    print("택시를")
print("타고")
    print("가라")

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

다음과 같은 경우에도 오류가 발생한다. "수행할 문장3"을 들여쓰기했지만 "수행할 문장1"이나 "수행할 문장2"와 들여쓰기의 너비가 다르다. 즉 들여쓰기는 언제나 같은 너비로 해야 한다.

if 조건문:
    수행할 문장1
    수행할 문장2
        수행할 문장3

IDLE 에디터에서 다음과 같이 작성하여 실행해 보자.

money = True
if money:
    print("택시를")
    print("타고")
        print("가라")

 

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

그렇다면 들여쓰기는 공백(Spacebar)으로 하는 것이 좋을까? 아니면 탭(Tab)으로 하는 것이 좋을까? 이에 대한 논란은 파이썬을 사용하는 사람들 사이에서 아직도 계속되고 있다. 탭으로 하자는 쪽과 공백으로 하자는 쪽 모두가 동의하는 내용은 단 하나, 2가지를 혼용해서 쓰지는 말자는 것이다. 공백으로 할 거면 항상 공백으로 통일하고, 탭으로 할 거면 항상 탭으로 통일해서 사용하자는 말이다. 탭이나 공백은 프로그램 소스에서 눈으로 보이는 것이 아니기 때문에 혼용해서 쓰면 오류의 원인이 되니 주의하자.

※ 요즘 파이썬 커뮤니티에서는 들여쓰기를 할 때 공백(Spacebar) 4개를 사용하는 것을 권장한다.

[조건문 다음에 콜론(:)을 잊지 말자!]

if 조건문 뒤에는 반드시 콜론(:)이 붙는다. 어떤 특별한 의미가 있다기보다는 파이썬의 문법 구조이다. 왜 하필 콜론(:)인지 궁금하다면 파이썬을 만든 귀도에게 직접 물어보아야 할 것이다. 앞으로 배울 while이나 for, def, class문에도 역시 문장의 끝에 콜론(:)이 항상 들어간다. 초보자들은 이 콜론(:)을 빠뜨리는 경우가 많으니 특히 주의하자.

파이썬이 다른 언어보다 보기 쉽고 소스 코드가 간결한 이유는 바로 콜론(:)을 사용하여 들여쓰기(indentation)를 하도록 만들었기 때문이다. 하지만 이는 숙련된 프로그래머들이 파이썬을 처음 접할 때 제일 혼란스러워하는 부분이기도 하다. 다른 언어에서는 if문을 { } 기호로 감싸지만 파이썬에서는 들여쓰기로 해결한다는 점을 기억하자.

 

03 제어문 - 반복문 While, for  

1. 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문의 조건문은 treeHit < 10이다. 즉 treeHit가 10보다 작은 동안에 while문 안의 문장을 계속 수행한다. whlie문 안의 문장을 보면 제일 먼저 treeHit = treeHit + 1로 treeHit 값이 계속 1씩 증가한다. 그리고 나무를 treeHit번만큼 찍었음을 알리는 문장을 출력하고 treeHit가 10이 되면 "나무 넘어갑니다."라는 문장을 출력한다. 그러고 나면 treeHit < 10 조건문이 거짓이 되므로 while문을 빠져나가게 된다.

※ treeHit = treeHit + 1은 프로그래밍을 할 때 매우 자주 사용하는 기법이다. treeHit 값을 1만큼씩 증가시킬 목적으로 사용하며, treeHit += 1 처럼 사용하기도 한다.

다음은 while문이 반복되는 과정을 순서대로 정리한 표이다. 이렇게 긴 과정을 소스 코드 단 5줄로 만들 수 있다니 놀랍지 않은가?

treeHit조건문조건판단수행하는 문장while문

0 0 < 10 나무를 1번 찍었습니다. 반복
1 1 < 10 나무를 2번 찍었습니다. 반복
2 2 < 10 나무를 3번 찍었습니다. 반복
3 3 < 10 나무를 4번 찍었습니다. 반복
4 4 < 10 나무를 5번 찍었습니다. 반복
5 5 < 10 나무를 6번 찍었습니다. 반복
6 6 < 10 나무를 7번 찍었습니다. 반복
7 7 < 10 나무를 8번 찍었습니다. 반복
8 8 < 10 나무를 9번 찍었습니다. 반복
9 9 < 10 나무를 10번 찍었습니다. 나무 넘어갑니다. 반복
10 10 < 10 거짓 종료

2. 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())는 사용자의 숫자 입력을 받아들이는 것이라고만 알아두자. int나 input 함수에 대한 내용은 뒤의 내장 함수 부분에서 자세하게 다룬다.

Enter number:
1

1. Add
2. Del
3. List
4. Quit

4를 입력하면 조건문이 거짓이 되어 while문을 빠져나가게 된다.

Enter number:
4
>>>

3. while문 강제로 빠져나가기

while문은 조건문이 참인 동안 계속해서 while문 안의 내용을 반복적으로 수행한다. 하지만 강제로 while문을 빠져나가고 싶을 때가 있다. 예를 들어 커피 자판기를 생각해 보자. 자판기 안에 커피가 충분히 있을 때에는 동전을 넣으면 커피가 나온다. 그런데 자판기가 제대로 작동하려면 커피가 얼마나 남았는지 항상 검사해야 한다. 만약 커피가 떨어졌다면 판매를 중단하고 "판매 중지" 문구를 사용자에게 보여주어야 한다. 이렇게 판매를 강제로 멈추게 하는 것이 바로 break문이다.

다음 예는 커피 자판기 이야기를 파이썬 프로그램으로 표현해 본 것이다.

>>> coffee = 10
>>> money = 300
>>> while money:
...     print("돈을 받았으니 커피를 줍니다.")
...     coffee = coffee -1
...     print("남은 커피의 양은 %d개입니다." % coffee)
...     if coffee == 0:
...         print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
...         break
...

money가 300으로 고정되어 있으므로 while money:에서 조건문인 money는 0이 아니기 때문에 항상 참이다. 따라서 무한히 반복되는 무한 루프를 돌게 된다. 그리고 while문의 내용을 한 번 수행할 때마다 coffee = coffee - 1에 의해서 coffee의 개수가 1개씩 줄어든다. 만약 coffee가 0이 되면 if coffee == 0: 문장에서 coffee == 0:이 참이 되므로 if문 다음 문장 "커피가 다 떨어졌습니다. 판매를 중지합니다."가 수행되고 break문이 호출되어 while문을 빠져나가게 된다.

하지만 실제 자판기는 위 예처럼 작동하지는 않을 것이다. 다음은 자판기의 실제 작동 과정과 비슷하게 만들어본 예이다. 이해가 안 되더라도 걱정하지 말자. 다음 예는 조금 복잡하니까 대화형 인터프리터를 사용하지 말고 IDLE 에디터를 사용해서 작성해 보자.

※ 대화형 인터프리터가 아닌 IDLE 에디터에서 소스를 입력하는 예제에서는 실제 실습 환경을 반영해 >>>(프롬프트)를 표시하지 않았다. 앞으로 어떤 창에 소스를 입력해야 할지 헷갈릴 때는 이를 참고하자.

# coffee.py

coffee = 10
while True:
    money = int(input("돈을 넣어 주세요: "))
    if money == 300:
        print("커피를 줍니다.")
        coffee = coffee -1
    elif money > 300:
        print("거스름돈 %d를 주고 커피를 줍니다." % (money -300))
        coffee = coffee -1
    else:
        print("돈을 다시 돌려주고 커피를 주지 않습니다.")
        print("남은 커피의 양은 %d개 입니다." % coffee)
    if coffee == 0:
        print("커피가 다 떨어졌습니다. 판매를 중지 합니다.")
        break

위 프로그램 소스를 따로 설명하지는 않겠다. 여러분이 소스를 입력하면서 무슨 내용인지 이해할 수 있다면 지금껏 배운 if문이나 while문을 이해했다고 보면 된다. 만약 money = int(input("돈을 넣어 주세요: ")) 문장이 이해되지 않는다면 이 문장은 사용자로부터 값을 입력받는 부분이고 입력받은 숫자를 money 변수에 대입하는 것이라고만 알아두자.

이제 coffee.py 파일을 저장한 후 명령 프롬프트 창을 열어 프로그램을 직접 실행해 보자.

※ 프로그램 소스를 에디터로 작성해서 실행시키는 방법이 기억나지 않는다면 01-6을 참고하자.

다음과 같은 입력 란이 나타난다.

C:\doit>python coffee.py
돈을 넣어 주세요:

입력 란에 여러 숫자를 입력해 보면서 결과를 확인하자.

돈을 넣어 주세요: 500
거스름돈 200를 주고 커피를 줍니다.
돈을 넣어 주세요: 300
커피를 줍니다.
돈을 넣어 주세요: 100
돈을 다시 돌려주고 커피를 주지 않습니다.
남은 커피의 양은 8개입니다.
돈을 넣어 주세요:

4. while문의 맨 처음으로 돌아가기

while문 안의 문장을 수행할 때 입력 조건을 검사해서 조건에 맞지 않으면 while문을 빠져나간다. 그런데 프로그래밍을 하다 보면 while문을 빠져나가지 않고 while문의 맨 처음(조건문)으로 다시 돌아가게 만들고 싶은 경우가 생기게 된다. 이때 사용하는 것이 바로 continue문이다.

1부터 10까지의 숫자 중에서 홀수만 출력하는 것을 while문을 사용해서 작성한다고 생각해보자. 어떤 방법이 좋을까?

>>> 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만큼씩 계속 증가한다. if a % 2 == 0(a를 2로 나누었을 때 나머지가 0인 경우)이 참이 되는 경우는 a가 짝수일 때이다. 즉 a가 짝수이면 continue 문장을 수행한다. 이 continue문은 while문의 맨 처음(조건문: a<10)으로 돌아가게 하는 명령어이다. 따라서 위 예에서 a가 짝수이면 print(a)는 수행되지 않을 것이다.

5. 무한 루프

이번에는 무한 루프(Loop)에 대해 알아보자. 무한 루프란 무한히 반복한다는 의미이다. 우리가 사용하는 일반 프로그램 중에서 무한 루프 개념을 사용하지 않는 프로그램은 거의 없다. 그만큼 자주 사용한다는 뜻이다.

파이썬에서 무한 루프는 while문으로 구현할 수 있다. 다음은 무한 루프의 기본 형태이다.

while True: 
    수행할 문장1 
    수행할 문장2
    ...

while문의 조건문이 True이므로 항상 참이 된다. 따라서 while문 안에 있는 문장들은 무한하게 수행될 것이다.

다음의 무한 루프 예이다.

>>> while True:
...     print("Ctrl+C를 눌러야 while문을 빠져나갈 수 있습니다.")
...
Ctrl+C를 눌러야 while문을 빠져나갈 수 있습니다.
Ctrl+C를 눌러야 while문을 빠져나갈 수 있습니다.
Ctrl+C를 눌러야 while문을 빠져나갈 수 있습니다.
....

위 문장은 영원히 출력된다. 하지만 이 예처럼 아무 의미 없이 무한 루프를 돌리는 경우는 거의 없을 것이다. [Ctrl+C]를 눌러 빠져나가자.