본 포스팅은 책 「두근두근 파이썬」을 참고하여 공부한 내용의 정리본입니다.
이전 게시글
두근두근 파이썬 Chapter 2 변수와 연산자 (fin)
2021/01/09 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 2 변수와 연산자 (fin) (실습 결과 포함)
0. 들어가며
이전 포스팅에서는 다양한 연산자 및 자료형을 응용해보고, 주석문과 input() 메소드의 개념에 대해 다루었다. 이번 포스팅에서는 파이썬의 기본 원칙인 순차적 실행과 순차문 이외의 여러 흐름문에 대해 다룰 것이다. 특히, 여러 흐름문 중에서도 이번에는 프로그램의 흐름을 제어하는 제어문 중 조건문에 대해 중점적으로 다뤄보도록 한다.
1. 순차문 (sequential statement)
파이썬의 흐름문은 기본적으로 먼저 나타나는 코드가 먼저 실행되는 구조의 '순차적 구조'를 따른다. 이에 따라 아래 예제와 같이 순차적으로 변수를 기억하고 덧셈 연산에 응용할 수 있다.
>>> num = 100 >>> print('num =', num) 100 >>> num = num + 100 >>> print('num =', num) num = 200 >>> num = num + 100 >>> print('num =', num) num = 300
반면, 순차문 이외에도 여러 가지 흐름문 (flow-statements)이 존재한다. 가령, 프로그램의 흐름을 제어한다는 의미의 제어문 (control statement)가 있다. 제어문에는 if, if-else문과 같은 조건문 (conditional statement)와 for, while문과 같은 반복문 등이 있다.
2. if 조건문
조건문 (conditional statements)의 작업 흐름을 흐름도로 도식화해보면 아래와 같다. 즉, 실행을 달리하는 여러 개의 실행문이 존재하고, 특정한 조건에 따라 실행 여부가 결정된다. 이때 조건식은 True 혹은 False 값을 반환하며, 궁극적으로 True 일때의 실행문이 실행된다.
조건문을 사용하는 경우는 프로그램을 통해 해결하고자 하는 문제에 다음과 같이 몇 가지 조건이 붙는 상황이 될 것이다.
- 상황 1: 나이가 20세 미만이면 '청소년 할인'을 출력하는 기능
- 상황 2: 1000 걸음 이상을 걸으면 '목표 달성'을 출력하는 기능
- 상황 3: 시간이 12시가 안 되면 '오전입니다', 12시 이후이면 '오후입니다'를 출력하는 기능
if 조건문의 사용법
이와 같은 기능을 구현하기 위해서는 if 조건문을 사용할 수 있다. 이때, if 조건문은 다음과 같이 구성된다. 파이썬은 괄호 등 복잡한 구문을 간소화한 대신, 들여쓰기를 잘 지켜줘야 한다.
이에 따라 상황1과 상황2를 코드로 구현해보자. 각각 조건을 만족하는 경우에는 실행 결과가 출력되지만, 조건을 만족하지 않는 경우 어떤 결과도 출력되지 않고 종료된다.
# 상황 1 >>> age = 18 # True >>> if age < 20: print('청소년 할인') 청소년 할인 >>> age = 24 # False >>> if age < 20: print('청소년 할인') # 상황 2 >>> walk_count = 1200 # True >>> if walk_count >= 1000: print('목표 달성') 목표 달성 >>> walk_count = 800 # False >>> if walk_count >= 1000: print('목표 달성')
LAB 3-1: if 문의 사용법
# 문항 1 >>> game_score = 800 >>> if game_score >= 1000: print('당신은 고수입니다.') >>> game_score = 1300 >>> if game_score >= 1000: print('당신은 고수입니다.') 당신은 고수입니다. # 문항 2 >>> num_a, num_b = 100, 200 >>> if num_a == num_b: print('두 값이 일치합니다.') >>> num_a, num_b = 300, 300 >>> if num_a == num_b: print('두 값이 일치합니다.') 두 값이 일치합니다.
3. 조건문과 블록
조건문에서 블록(block)이란 조건을 만족하는 경우에 실행될 실행문을 말한다. 이때, 파이썬은 블록 앞에 들여쓰기(indentation) 하는 것을 원칙으로 한다. 이러한 들여쓰기 코드 블록은 if문 외에도 else, elif, for, while, def, class 등에서도 적용된다.
# 들여쓰기 없는 if문 >>> age = 18 >>> if age < 20: print('청소년 할인') IndentationError: expected an indented block
이전 포스팅에서 다룬 것과 같이 파이썬은 기타 전통적인 프로그래밍 언어들과는 달리, 들여쓰기가 매우 중요한 의미를 가진다.
>>> age = 18 # True >>> if age < 20: print('청소년 할인') print('입장을 환영합니다.) # if문 내부, 외부 print문이 모두 수행됨''' 청소년 할인 입장을 환영합니다. >>> age = 24 # False >>> if age < 20: print('청소년 할인') print('입장을 환영합니다.') # if문의 외부 print문만 수행됨 (조건을 만족하지 못하였으므로) 입장을 환영합니다.
다음은 들여쓰기 칸 수(space 4칸)를 정확히 지켜주지 않은 경우이다. 이 경우 들여쓰기 오류가 발생한다.
>>> age = 18 >>> if age < 20: print('나이', age) print('청소년 환영') print('청소년 할인') IndetationError: unexpected indent
블록의 규칙
코드 블록은 반드시 콜론 다음 줄에 써야 한다. 들여쓰기 칸 수는 정해져 있지 않지만, 4칸이 권장되며 대부분의 파이썬 통합 개발환경(IDE)에서는 자동 들여쓰기를 권장한다. 블록은 여러 줄로 작성 가능하지만, 이 경우 들여쓰기 칸 수가 모두 동일해야 한다. (일관성이 있는 코딩을 위함)
3의 배수 판단
>>> number = int(input('정수를 입력하세요:')) # 입력값을 정수형으로 변환 정수를 입력하세요: 15 >>> if number % 3 == 0: print(number, '은(는) 3의 배수입니다.') #True 15 은(는) 3의 배수입니다. >>> number = int(input('정수를 입력하세요:')) # 입력값을 정수형으로 변환 정수를 입력하세요: 16 >>> if number % 3 == 0: print(number, '은(는) 3의 배수입니다.') # False
3과 5의 배수 판단
>>> number = int(input('정수를 입력하세요:')) 정수를 입력하세요: 15 # 논리 연산자 and 활용 >>> if number % 3 == 0 and (number % 5) == 0: print(number, '은(는) 3과 5의 공배수입니다.') 15 은(는) 3과 5의 공배수입니다.
LAB 3-2: 변수와 if 조건식 사용하기
# 문항 1 >>> n = int(input('정수 n의 값을 입력하세요:')) 정수 n의 값을 입력하세요: 50 # True >>> print('n =', n) >>> if n % 2 == 0: print(n, '은(는) 짝수입니다.') n = 50 50 은(는) 짝수입니다. >>> n = int(input('정수 n의 값을 입력하세요:')) 정수 n의 값을 입력하세요: 75 # False >>> print('n =', n) >>> if n % 2 == 0: print(n, '은(는) 짝수입니다.') n = 75 #문항 2 >>> x = int(input('정수 x를 입력하세요:')) 정수 x를 입력하세요: 50 # True >>> print('x =', x) >>> if x > 0: print(x, '은(는) 자연수입니다.') x = 50 x 은(는) 자연수입니다. >>> x = int(input('정수 x를 입력하세요:')) 정수 x를 입력하세요: -10 # False >>> print('x =', x) >>> if x > 0: print(x, '은(는) 자연수입니다.') x = -10
4. if-else 조건문
24시 체계를 12시 체계로
다음과 같은 조건문은 12시를 기준으로 배타적인 조건을 가지고 있다. 이 경우, 더 명확한 표현을 위해서는 다음과 같이 조건문 2개를 사용하는 것보다, if-else 문을 사용하는 것이 효과적이다.
# 조건문 2개를 사용하는 경우 >>> hour = 10 # True >>> if hour < 12: print('오전입니다.') 오전입니다. >>> hour = 10 # False >>> if hour >= 12: print('오후입니다.') # if-else문을 사용하는 경우 >>> hour = 10 # True >>> if hour < 12: print('오전입니다.') else: print('오후입니다.')
이에 대해 각각의 경우를 흐름도에 옮겨 표현해보아도 if-else문이 더 명확한 것을 확인할 수 있다.
음수인지 양수인지
이 경우도 마찬가지로 0을 기점으로 두 조건이 완전 배타적인 관계를 갖고 있기 때문에 다음과 같이 if-else문으로 표현할 수 있다.
>>> num = -10 # True >>> if num < 0: print(num, '은(는) 음수입니다.') else: print(num, '은(는) 음수가 아닙니다.') -10 은(는) 음수입니다.
홀수인지 짝수인지
다음 조건문은 2로 나눈 나머지가 0일 때와 그렇지 않을 때 각각의 실행문에 할당된다. 따라서 이러한 배타적 관계의 경우 if-else문으로 간결하게 표현할 수 있다.
>>> num = 10 # True >>> if num % 2 == 0: print(num, '은(는) 짝수입니다.') else: print(num, '은(는) 홀수입니다.) 10 은(는) 짝수입니다.
if문으로 구성된 블록 내 또 다른 조건문 사용
다음 구문에서는 외부 if-else 문과, 내부 if-else문이 등장한다. 이때, 외부 조건문 블록에서는 num이 음수일 때 if문이 실행되고, 음수가 아닐 때 else문이 실행된다. 반면, 내부 if-else문은 외부 조건문에서 else 구문이 실행되는 경우 (음수가 아닌 경우)에만 판별되며, num이 짝수일 때는 if문 블록이, 홀수일 때는 else문 블록이 실행된다.
>>> num = 100 # False >>> if num < 0: print(num, '은(는) 음수입니다.') else: print(num, '은(는) 음수가 아닙니다.') # 블록 내 구문은 num이 음수가 아닐 때만 판별함 if num % 2 == 0: # True print(num, '은(는) 짝수입니다.') else: print(num, '은(는) 홀수입니다.') 100 은(는) 음수가 아닙니다. 100 은(는) 짝수입니다.
LAB 3-3: if 조건문의 응용
# 문항 1 >>> game_score = int(input('게임점수를 입력하시오: ')) 게임점수를 입력하시오: 800 # False >>> print('game_score =', game_score) >>> if game_score >= 1000: print('고수입니다.') else: print('입문자입니다.') game_score = 800 입문자입니다. # 문항 2 >>> num_a = int(input('한 정수를 입력하시오:')) >>> num_b = int(input('다른 정수를 입력하시오:')) 한 정수를 입력하시오: 100 다른 정수를 입력하시오: 200 # False >>> if num_a == num_b: print('두 값이 일치합니다.') else: print('두 값이 일치하지 않습니다.') 두 값이 일치하지 않습니다. # 문항 3-(1) >>> adult_or_not = int(input('당신은 성인인가요(성인이면 1, 미성년이면 0):')) 당신은 성인인가요(성인이면 1, 미성년이면 0): 0 # True >>> if adult_or_not == 0: print('당신은 미성년자입니다.') 당신은 미성년자입니다. # 문항 3-(2) >>> adult_or_not = int(input('당신은 성인인가요(성인이면 1, 미성년이면 0):')) 당신은 성인인가요(성인이면 1, 미성년이면 0): 1 # True >>> if adult_or_not == 1: married_or_not = int(input('결혼을 하셨나요(기혼이면 1, 미혼이면 0):')) if married_or_not == 1: print('당신은 결혼한 성인입니다.') else: print('당신은 결혼하지 않은 성인입니다.') 결혼을 하셨나요(기혼이면 1, 미혼이면 0): 1 # True 당신은 결혼한 성인입니다.
5. 복합 조건식
복합 조건식은 기존 조건식에 더 정교한 조건을 걸어주기 위해 조건 연산자와 논리 연산자를 조합하여 표현한 식을 말한다. 해당 조건식은 모두 True, False의 부울 값을 반환한다는 공통점이 있다.
>>> 0 < 10 True >>> 4 > 10 False >>> 3 <= 10 True >>> 15 >= 10 True >>> 1 == 2 False >>> True or False True >>> True and False False
논리 연산 and
논리 연산자 중 and 연산은 모든 값이 True일 때만 True를 반환하므로, 입력 값 중 False 상태에 영향을 받는 특징이 있다. 이를 직렬 회로도로 간접적으로 표현하면 다음과 같다.
논리 연산 or
다음으로 논리 연산 or은 입력 값 중 하나라도 True인 값이 있으면 True를 반환한다. 따라서 True 상태에 영향을 크게 받는다. 마찬가지로, 이를 회로도로 표현해본다면 다음과 같다.
이때, 논리 연산자 and와 or을 다음과 같이 응용해볼 수 있겠다. 여기서 a와 b는 모두 짝수이므로 두 조건식 모두 참값을 반환 (print문이 실행)한다. 만일 b = 13으로 수정된다면 and 조건의 내부 print 문은 실행되지 못할 것이다.
>>> a = 10 # True >>> b = 14 # True >>> if (a % 2 == 0) and (b % 2 == 0): print('두 수 모두 짝수입니다.') 두 수 모두 짝수입니다. >>> if (a % 2 ==0) or (b % 2 == 0): print('두 수 중 하나 이상이 짝수입니다.') 두 수 중 하나 이상이 짝수입니다.
LAB 3-4: 복합 조건식의 이해
# 문항 1 >>> num = 2 # True >>> answer = (num > 1) and (num < 10) >>> print(answer) True # 문항 2 >>> age = 10 >>> if (age > 10) and (age < 19): print('청소년입니다.') >>> age = 12 >>> if (age > 10) and (age < 19): print('청소년입니다.') 청소년입니다.
윤년(leap year) 검사하기
윤년(leap year)에는 다음의 몇 가지 규칙이 존재한다.
- 연수가 4로 나누어 떨어지는 해는 윤년으로 한다. (예를 들어 1992년, 2004년 등)
- 연수가 1의 조건에 만족함에도 100으로 나누어 떨어지는 해는 평년으로 한다. (예를 들어 1900년, 2100년, 2200년, 2300년 등)
- 연수가 1의 조건을 만족해도 400으로 나누어 떨어지는 해는 윤년으로 한다. (예를 들어 2000년, 2400년 등)
>>> year = int(input('연도를 입력하세요:')) 연도를 입력하세요: 2000 >>> is_leap_year = ((year % 4 == 0) and (year % 100 != 0) or (year % 400 == 0)) >>> print(year, '년은 윤년입니까?', is_leap_year) 2000 년은 윤년입니까? True
6. if-elif-else 문
elif문은 else + if 의 기능을 하는 구문으로, 다음 예제와 같이 여러 개의 if문을 중첩해서 조건을 표현해야 하는 경우에 적용할 수 있다.
위의 학점 산출기를 if문만을 사용해 표현해보면 다음과 같다. 이 경우, 코드가 복잡하고 읽기 어려워졌으며 모든 조건의 의미를 일일이 파악해야 하므로, 논리 오류가 발생하기 쉽다.
>>> score = int(input('점수를 입력하세요: ')) 점수를 입력하세요: 70 >>> if score >= 90: grade = 'A' >>> if score < 90 and score >= 80: grade = 'B' >>> if score < 80 and score >= 70: grade = 'C' >>> if scroe < 70 and score >= 60: grade = 'D' >>> if score < 60: grade = 'F' >>> print('당신의 등급은:', grade) 당신의 등급은: C
이러한 문제를 해결하기 위해 if-else문을 적용해보자. 위의 예제에서 if문만으로 구성했던 것보다는 읽기가 편해졌지만 if-else문 만으로는 여전히 조건 2개밖에 나타낼 수 없기 때문에 여전히 한계가 존재한다.
>>> score = int(input('점수를 입력하세요:')) 점수를 입력하세요: 70 >>> if score >= 90: grade = 'A' else: if score >= 80: grade = 'B' else: if score >= 70: grade = 'C' else: if score >= 60: grade = 'D' else: grade = 'F' >>> print('당신의 등급은:', grade) 당신의 등급은: C
여러 조건을 합리적으로 표현해주기 위해 else문까지 가기 전 여러 조건을 처리해줄 수 있는 elif문을 사용해보자. 아래 예시와 같이 elif문은 else와 if문을 결합한 기능으로 더 간단하게 코드를 짤 수 있기에 가독성이 높아진다. (들여쓰기도 줄어듦)
이러한 if-elif-else문의 실행 흐름도를 살펴보면 쉽게 이해할 수 있다.
>>> score = int(input('점수를 입력하세요:')) 점수를 입력하세요: 88 >>> if score >= 90: grade = 'A' elif score >= 80: grade = 'B' elif score >= 70: grade = 'C' elif score >= 60: grade = 'D' else: grade = 'F' >>> print('당신의 등급은:', grade) 당신의 등급은 B
LAB 3-5: if-elif-else 문을 사용한 다중 조건식
# 문항 1 >>> speed = int(input('자동차의 속도를 입력하세요(단위: km/h):')) 자동차의 속도를 입력하세요(단위: km/h): 13 >>> if speed >= 100: print('고속') elif speed >= 60: print('중속') else: print('저속') 저속 >>> speed = int(input('자동차의 속도를 입력하세요(단위: km/h):')) 자동차의 속도를 입력하세요(단위: km/h): 130 >>> if speed >= 100: print('고속') elif speed >= 60: print('중속') else: print('저속') 고속
다음 게시글
두근두근 파이썬 Chapter 3 제어문 (2)
2021/01/11 - [Programming/#Python] - [Python] 두근두근 파이썬 Chapter 3 제어문 (2) (실습 결과 포함)
I'm a Senior Student in Data Science !
데이터 사이언스를 공부하고 있는 4학년 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)
'Programming > #Python' 카테고리의 다른 글
[Python] 제어문 (fin) (실습 결과 포함) (0) | 2021.01.12 |
---|---|
[Python] 제어문 (2) (실습 결과 포함) (0) | 2021.01.11 |
[Python] 변수와 연산자 (fin) (실습 결과 포함) (0) | 2021.01.09 |
[Python] 변수와 연산자 (2) (실습 결과 포함) (0) | 2021.01.08 |
[Python] 변수와 연산자 (1) (실습 결과 포함) (0) | 2021.01.07 |