이해하기 쉬운 Python 3.6 - 4회차

2017. 5. 5. 17:31언어별 정리 자료/Python

이해하기 쉬운 Python 3.6 - 4회차


지난 시간에 Boolean 은 True 와 False 의 값을 가질 수 있는 변수의 한 종류라고 하였습니다.


이 때, 이런 Boolean 변수 / 값 을 만들기 위해서 직접 대입하는 방법과 >, <=, != 같은 비교 구문으로 비교하여 결과를 만드는 것을 알아 보았습니다.


또한 이런 비교가 String 과 숫자 등, 여러 변수에서 쓰이는 것 또한 알 수 있었습니다.


이번 시간에는 이러한 Boolean 값들이 어떻게 사용 되는지 알아보겠습니다.



< 주의! 이번 강좌에 나오는 코드는 실행이 잘 되지 않는 Pseudo Code ( 슈도 코드 / 의사 코드, 이해를 돕기 위한 실제 실행 가능하진 않지만, 코드의 논리적인 모양은 띄고 있는 설명을 위한 코드 ) 일 수 있습니다. 자세한 사항은 코드 아래에 첨부하였습니다. >




예약어


예약어는 Python 에서 코딩을 할 때 코딩에 쓰기 위해서 미리 예약 해 둔, Programmer들 간의 약속된 명령어 입니다. 


변수는 예약어와 같으면 안됩니다.


예약어의 예로, import, if, else, elif, and, or, not 등... 우리가 code 를 만드는데 사용하는 여러 단어를 의미합니다.



변수의 이름 작명법


지난 시간에도 했었듯, 변수는 최대한 명사로 시작해서 명사로 끝나는 단어를 짓도록 합시다. 


예약어를 변수 이름으로 써서는 안됩니다. 이는 예약어에서도 말한, Python 을 사용하는 사람들 간의 약속 입니다.


또한 너무 길거나 ( meaning_vacation_and_when_to_refresh_and_so_on... ) 너무 짧은 ( a, b, c, i, j ) 변수의 이름은 좋지 않습니다.


또한 여러 단어로 되어있는 경우, Python 에서는 띄어쓰기 대신 " _ " 를 사용하도록 합니다.


변수의 이름은 직관적으로 무엇을 하는지 알 수 있어야 합니다.


이런 규칙들을 잘 지켜 변수의 이름을 지어야 합니다.


ex )

__std_value : O

23value : X, 숫자로 시작하면 안됩니다.

X : O

XValue 23 : X, 띄어쓰기가 들어가면 안됩니다.

V@lue : X, _ 이외의 특수문자는 허용되지 않습니다.




if 문

if는 조건에 따른 상황을 다루고 싶을 때 사용하는 문법입니다. 

이는 물론 당연히 예약어입니다. 따라서 변수명을 if 같은 것으론 선언 할 수 없습니다.


Python 에서 if 문은 다음과 같이 사용합니다.


형태 >

if expression :

    statements...

    statements...

    statements...

- expression 은 비교 구문이 있는 곳, ( x < 5 혹은 y == "monday" 같은 것 ) 

- statements 는 어떤 하나의 명령 실행줄 ( if 비교, 대입, 연산 등.. 어떤 Python 명령어도 가능 ) 입니다.


Python 은 C, Java 와 다르게 indentation ( 들여쓰기, tab 혹은 space 4개, space 4번이 기준이다. ) 으로 Code block 을 지정합니다.


Python 은 이와 같이 들여쓰기를 block의 단위로 쓰기 때문에 조심해야 합니다.


탭으로 썼다가 스페이스 4개로 썼다가 하면서 번갈아 사용하게 되면 IDLE 에서는 자동으로 Space 4번으로 교체 해 주기 때문에 상관 없지만, 원칙적으로는 둘을 섞어쓰면 안됩니다.


사람들 간 표준이 space 4번이므로, 이를 맞춰 쓰는 습관을 들이면 좋습니다.


여기서 Code block 이란 하나의 공통적인 속성을 가진 코드가 진행되는, 글로 따지만 문단 같은 것을 의미합니다.





if 10 > 5 : 
    print(“10 is greater than 5”)
# 10 is greater than 5 가 출력 된다.
# if 아래에 줄 하나가 code block. 하나의 문단 같은 느낌을 가진다.

또한 이러한 if 구문들은 중첩될 수 있습니다. ( 구문은 문법, 혹은 if 로 시작하는 Code block 을 의미합니다. )
이러한 if 문을 nested if, n중 if 문 이라고 합니다. 


Num = 12
If num > 5
    print(“Bigger than 5”)
    # Code block 1
    if num == 12
        print(“num is 12”)
        # Code block 2
    # Code block 1
# Bigger than 5 가 출력.
# Num is 12 가 출력
# Code block 내부에 block 이 또 있을 수 있다.






else 문


그러나 True 가 아니면 반드시 False 인 경우인데도 불구하고, if 문을 2번이나, rainy 라는 변수를 True / False 변수와 2번 비교하게 된다면 큰 성능 저하를 일으 킬 수 있습니다.


큰 프로젝트와 같은 경우, 이런 단순한 if 문이 100,000개는 넘게 존재합니다. ( 사실 숫자로 세어 따지는 것이 의미가 없을만큼 많이 사용됩니다. )


이런 무수히 많은 if 문을 지나며, if 문 한개 한개는 짧은 시간이 걸리지만, 이러한 것이 모이게 되어 오랜 시간이 걸리게 됩니다.


따라서 한번의 비교로 조건을 수행하는 "만약 ~가 아니라면" 이라는 의미로 else 라는 예약어를 사용합니다.


  • else : if의 조건이 False 일 때 실행하고 싶은 사항을 두는 곳.


< 형태 >

if expression :

   statements

else :

   statements 

# 역시 들여쓰기가 Code Block을 결정합니다.

이 때, else 는 반드시 if 와 쌍으로 쓰여야 합니다. 

즉, 항상 if 는 홀로 쓰일 수 있지만, else 는 반드시 짝이 되는 if 가 존재해야 합니다.




elif 문

그러나 조건이 딱 반으로 나누어 떨어지지 않는 경우도 있습니다.


예를들어 "오늘 날짜가 월요일이면 학교를 가고, 만약 목요일이면 도서관을 가고, 일요일이면 운동장을 가고, 아니면 집에 있어라." 라는 구문이 되겠습니다.


굳이 말로 표현하자면, "만약 ~가 아니고, ~도 아닌데, ~한 상황 이라면" 이 될 수 있습니다.


따라서 elif 는 다음과 같습니다.


  • elif : else if의 뜻으로, if의 조건을 만족하진 않지만, if는 아닌 다른 조건을 실행하고 싶은 사항을 두는 곳입니다.


형태 >

if expression : 

   statements

elif expression :

   statements 

// 역시 들여쓰기가 Code Block을 결정합니다.


예를들어 

"오늘 날짜가 월요일이면 학교를 가고, 만약 목요일이면 도서관을 가고, 일요일이면 운동장을 가고, 아니면 집에 있어라.

라는 것을 Python 으로 수행하기 위해서는



day = "saturday"

if day == "monday" :
    #학교를 간다.
elif day == "thursday" :
    # 도서관을 간다.
elif day == "sunday" :
    # 운동장을 간다.
else :
    # 집을 간다.


같이 쓰일 수 있습니다.


이 때, 첫 if day == "monday" : 에서 day == "monday" 가 False 라면, 두번째 줄 elif 를 수행합니다.


즉, 이는 day == "thursday" 인지를 체크함과 동시에, 첫째 줄 if 문에서 거짓이라고 판명된 < day != "monday" > 를 암시적으로 체크 / 비교하는 것입니다.


이는 아래에서도 동일하며, 따라서 else 에서는 "monday", "thursday", "sunday" 가 전부 아닐 때 실행하게 됩니다.



그러나 

"오늘 날짜가 월, 화, 수이면 학교를 가고, 만약 목,금이면 도서관을 가고, 일요일이면 운동장을 가고, 아니면 집에 있어라." 

같은 명령이 있을 수 있습니다.


이러한 구문을 Python 으로 수행하기 위해서는


day = "saturday" if day == "monday" : # 학교를 간다. elif day == "tuesday" : # 학교를 간다. elif day == "wednesday" : #학교를 간다. elif day == "thursday" : # 도서관을 간다. elif day == "friday" : # 도서관을 간다. elif day == "sunday" : # 운동장을 간다. else : # 집을 간다.


과 같이 나타낼 수 있습니다. 



그런데, 이러한 if - else 구문을 쓰면서 expression 을 한 개씩만 쓰는 것은 효율적이지 않을 수 있습니다.


이렇게 나타내는 것 또한 나쁘다고는 볼 수 없지만, 반복 되는 부분들이 많이 들어가 있습니다.


"# 학교를 간다"이나 "# 도서관을 간다" 같은 것이 연속해서 써져있습니다. 


이렇게 코드를 길게 쓰게 된다면, 가독성적인 측면과 이해의 측면, 그리고 유지 보수의 측면 등, 여러 방면에서 좋지 않은 영향을 줍니다.


논리 연산자

따라서 이 때 필요한 것이 and 와 or, not의 논리 연산자 입니다.


  • and 는 두 조건 모두 True 일 때 True 가 됩니다.

즉, A and B 에서 A, B 조건 모두 True 가 아니면 False의 결과를 반환합니다.


  • or 은 두 조건중 하나라도 True 일 때 True 가 됩니다.

즉, A or B 에서 A, B 조건 모두 False 가 아니면 True의 결과를 반환합니다.


  • not 은 조건이 True면 False로, False면 True 로 바꾸어 줍니다.

즉, not A 에서 A 가 True 면 False의 결과를 반환합니다.


또한 이런 논리 연산자는 앞에서부터 계산하나 뒤에서 부터 계산하나 연산 결과엔 상관은 없습니다만, 보통 앞에서 부터 계산합니다.



1 == 1 and 2 == 2	
# True // Python은 && || 대신 and or을 사용한다.

1 != 1 or 2 != 3
# True

not 1 == 1	
# False


표로 나타내게 된다면 다음과 같습니다.



- and 는 A 와 B 조건 모두를 만족시키는 경우, 즉 2 < x < 5 같은 것을 쓸 때 사용 됩니다.



- or 는 A 와 B 조건 중 하나를 만족시키는 경우, 즉 2 > x, x > 5 같은 것을 쓸 때 사용 됩니다.



따라서 

"오늘 날짜가 월,화, 수이면 학교를 가고, 만약 목,금이면 도서관을 가고, 일요일이면 운동장을 가고, 아니면 집에 있어라.

라는 구문을 Python 으로 수행하기 위해서는


day = "saturday"

if day == "monday" or day == "tuesday" or day == "wednesday" :
    # 학교를 간다
elif day == "thursday" or day == "friday" :
    # 도서관을 간다
elif day == "sunday" :
    # 운동장을 간다
else :
    # 집을 간다



과 같이 쓸 수 있습니다.


이는 다음 그림처럼 이해 가능합니다.












while

그렇다면 위의 월 ~ 일 의 일정을 6번 반복하고 싶을 경우는 6번 반복해서 작성해야만 할까요?


이럴 때 쓰이는 것이 바로 for 와 while의 '반복문' 이라고 불리는 것 입니다.

Python 에서 for 구문은 좀 더 심화적인 내용까지 담고 있으므로, 다음 시간에 배우도록 합니다.



  • while : 한 번 이상의 실행 횟수를 가지는 문법 장치.


형태 >

while expression : // expression이 참일 때 실행된다.

   statements 

// 역시 들여쓰기가 Code block 을 결정, While 내부에 while 이 존재 하여도 된다.


while 구문은 어떤 특정한 조건이 True일 때, while block 내부의 코드를 계속 반복합니다.


while 구문 내부에 while 이 또 와도 되고, if - elif - else 구문이 와도 됩니다.

들여쓰기가 Code block 을 결정하게 되니 조심해서 쓰도록 합니다.


위에서의 월 ~ 일 일정을 6번 반복 하는 경우는, 일단 count 변수를 두어 0으로 초기화합니다.


그 후, 한번의 일정이 끝날 때 마다 count 를 1씩 증가시킵니다. ( Statements )


그런 다음, while 문의 expression, 조건에서 count 라는 변수가 6보다 작을 경우에만 while 을 수행하게 한다면 6번 반복을 한 뒤 끝나게 됩니다.


다음은 while 구문 코드 예시입니다.


While i < 5 :
   print( i )
5	4	3	2	1
While 1 == 1 :
   //무한 루프



Break

이 때, while 문으로 돌던 도중, 중간에 빠져 나오게 해 주는 예약어가 있습니다.


  • break : while 구문 안에서 특정한 조건을 주고 바로 그 상위의 Loop를 탈출 가능한 문법 장치.


이러한 break 구문은 while 같은 어떤 반복문에서 특정 조건을 만족시켰을 때, 더 이상 반복이 필요 없거나, 반복을 하면 안되는 상황에서 쓰입니다.


예를 들어 아까 했던 월~일 의 일정은 방학 전 시간표이고, 방학 후에는 while 문을 나와서 다른 code block 을 수행해야 한다고 합시다.


그러나 방학이 언제 시작하는지 모르기 때문에, 매 주말마다 방학인지 check 해야 한다고 합시다.


또한 다음주가 방학이면 이번 주 일정이 모두 끝난 뒤 break 하도록 합시다.


그렇다면, 


day = "saturday"

if day == "monday" or day == "tuesday" or day == "wednesday" :
    # 학교를 간다
elif day == "thursday" or day == friday" :
    # 도서관을 간다
elif day == "sunday" :
    # 운동장을 간다
else :
    # 집을 간다


와 같은 코드에서 vacation 이라는 변수를 추가해야 할 것입니다. ( 방학인지 확인해야 하기 때문에 )


또한 vacation 이 True 인지 확인하는 if 문도 있어야 할 것이며, 만약 그 if 문 ( vacation == True ) 이 True 라면 break 도 해주어야 하기 때문에 break 문도 추가 해야 할 것입니다.


하나씩 추가 해 보도록 합시다.



따라서 결과는 다음과 같습니다.


day = "saturday"
vacation = False

while(True) :
    if day == "monday" or day == "tuesday" or day == "wednesday" :
        # 학교를 간다
    elif day == "thursday" or day == "friday" :
        # 도서관을 간다
    elif day == "sunday" :
        # 운동장을 간다
    else :
        # 집을 간다

    if vacation == True :
        break
    else :    

만약 break가 다른 위치에 들어간다면 다르게 명령이 수행 될 수 있습니다.


day = "saturday"
vacation = False

while(True) :

    if vacation == True :
        break
    else :  

    if day == "monday" or day == "tuesday" or day == "wednesday" :
        # 학교를 간다
    elif day == "thursday" or day == "friday" :
        # 도서관을 간다
    elif day == "sunday" :
        # 운동장을 간다
    else :
        # 집을 간다


vacation 이 True 인가를 먼저 확인하고 그 주일의 일정을 수행하기 때문에 break 의 위치는 중요합니다.


"또한 다음주가 방학이면 이번 주 일정이 모두 끝난 뒤 break 하도록 합시다." 

의 조건을 만족 시키기 위해서는 break 가 조건문들 아래에 있어야 합니다.


이는 프로그램이 위에서 아래로 한 줄씩 수행 되기 때문입니다.


따라서 문제의 조건을 잘 본 다음, 수행하도록 합시다.




Continue

그러나 항상 break로 반복문을 탈출하는 것이 좋은 것은 아닐 수 있습니다.

어떤 주는 실행 하고 어떤 주는 실행하지 않도록 하는 주간도 있을 것 입니다.


따라서 그 때 쓰는 것이 continue입니다.


  • continue : while 구문 안에서 특정한 조건을 만족할 때, 그 아래의 반복문은 실행하지 않고 넘어가는 예약어. Loop 밖에서 사용한다면 Error가 발생한다.


위의 월~일 의 코드를 가지고 설명하도록 합시다.


다음과 같은 조건을 가지고 수행한다고 합시다.


월~일 의 일정은 그때 그때 같고, 홀수차와 짝수차 주간의 일정은 학교를  가는 날과 도서관을 가는 날이 반대라고 합니다.

즉, 월, 화, 수에는 짝수차 주간에는 학교를, 홀수차 주간에는 도서관을 가는 것 입니다.

또한 매 2, 3 주차는 쉬는 주일로, 아무것도 하지 않고 집에 있도록 합니다.

주일은 5주차 이후는 다시 숫자가 줄어들어 1주차로 시작하도록 합니다.




따라서 결과는 다음과 같습니다.

day = "saturday"
week_count = 1

if week_count == 2 or week_count == 3 :
    week_count += 1
    continue

elif week_count % 2 == 1 :
    if day == "monday" or day == "tuesday" or day == "wednesday" :
        # 도서관을 간다
    elif day == "thursday" or day == "friday" :
        # 학교를 간다
    elif day == "sunday" :
        # 운동장을 간다
    else :
        # 집을 간다
    week_count += 1

else :
    if day == "monday" or day == "tuesday" or day == "wednesday" :
        # 학교를 간다
    elif day == "thursday" or day == "friday" :
        # 도서관을 간다
    elif day == "sunday" :
        # 운동장을 간다
    else :
        # 집을 간다
    week_count += 1


continue 역시 break 와 마찬가지로 다른 위치에 들어간다면 예상치 못한 일을 수행 가능합니다.

따라서 continue의 위치를 조심하도록 합시다.




이번 시간에는 조건문과 반복문에 대해서 알아보았습니다.


조건문과 반복문 모두 조건이 참일 경우 그 Code block 을 수행하며, 거짓일 경우 수행하지 않고 바로 넘어갑니다.


조건문과 반복문 모두 조건을 여러 개 선택 가능하며, 반복문의 경우 상 참인 조건을 넣어 무한하게 반복 시킬 수 있습니다.