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. 하나의 문단 같은 느낌을 가진다.
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 을 수행하며, 거짓일 경우 수행하지 않고 바로 넘어갑니다.
조건문과 반복문 모두 조건을 여러 개 선택 가능하며, 반복문의 경우 항상 참인 조건을 넣어 무한하게 반복 시킬 수 있습니다.
'언어별 정리 자료 > Python' 카테고리의 다른 글
[Python] python으로 system 함수 실행하기. (0) | 2017.08.31 |
---|---|
이해하기 쉬운 Python 3.6 - 5회차 (0) | 2017.05.06 |
이해하기 쉬운 Python 3.6 - 3회차 (0) | 2017.04.30 |
이해하기 쉬운 Python 3.6 - 2회차 (0) | 2017.04.30 |
이해하기 쉬운 Python 3.6 - 1회차 (2) | 2017.04.27 |