프로그램을 만들 때 조건과 반복은 필수 요소입니다. 오늘은 조건문과 반복문에 대해서 배워보도록 하겠습니다.
조건
이 참
이면 명령을 실행
하는 문장
참
이나 거짓
을 값으로 취할 수 있는 변수의 자료형
참
: 0 이외의 모든 숫자와 빈 문자열 외의 모든 문자열은 참으로 인식한다.
거짓
: 숫자 0 또는 빈 문자열이 온다면 거짓으로 인식한다.
해당 코드를 입력한 후 실행해 보세요.
print(True)
print(False)
결과 창에서 괄호안의 논리형을 출력합니다.
참
인지 거짓
인지 판단
하기 위해 사용되는 연산자
참일 경우 True, 거짓일 경우 False 반환한다.
비교 연산자 | 설명 |
---|---|
x > y | x가 y보다 크다. |
x < y | x가 y보다 작다. |
x != y | x와 y가 같지 않다. |
x >= y | x가 y보다 크거나 같다. |
x <= y | x가 y보다 작거나 같다. |
결과 값을 예상하며 해당 코드들을 작성하고 실행해보세요.
print(1 < 2)
print(2 < 1)
print(1 <= 2)
print(2 <= 1)
print(1 == 1)
print(1 != 1)
- 결과값
True
False
True
False
True
False
이제 본격적으로 조건문에 대하여 배워보도록 하겠습니다.
- if문 기본구조
if 조건: 조건이 참일 경우 실행할 문장
위의 기본구조를 활용하여 게임에 승리하면 승리 문구를 띄우는 간단한 예제를 만들어보겠습니다.
win = True if win: print("게임에서 승리했습니다.")
- 결과값
게임에서 승리했습니다.
조건 win
이 참이기 때문에 print
명령이 실행
되었습니다.
###4.1.2 if else문
- if else문 기본구조
if 조건: 조건이 참일 경우 실행할 문장1 else 조건이 거짓일 경우 실행할 문장2
- 위의 기본구조를 활용하여 승패에 따라 문구를 다르게 출력하는 예제를 만들어보겠습니다.
print("You're Win! True or False?") win = bool(input("if you're lose, Just press enterKey ")) if win: print("게임에서 승리했습니다.") else: print("게임에서 패배했습니다.")
- 결과값
어떠한 문자열이라도 입력할 경우,게임에서 승리했습니다.
문구 출력 공백일 경우게임에서 패배했습니다.
출력
- elif문 기본구조
if 조건1: 조건1이 참일 경우 실행할 문장1 else 조건2: 조건1이 거짓이고, 조건2가 참일 경우 실행할 문장2 else: 조건1,2 모두 거짓일 경우 실행할 문장3
- 예제
A,B팀의 스코어를 int 형으로 입력받아 점수가 더 높은 팀이 승리했다는 문구를 띄우는 프로그램을 만들어 봅시다.
(단, 무승부도 존재)a = int(input('A팀 스코어: ')) b = int(input('B팀 스코어: ')) if a > b: print("A팀 승리") elif a < b: print("B팀 승리") else: print("무승부")
- 결과값 (예시)
A팀 스코어: 50 B팀 스코어: 30 A팀 승리
스코어를 자유롭게 변경해보고 결과 값을 확인하세요.
####논리연산자?
조건 여러 개를 결합하여 판정하는 연산자로 AND
, OR
, NOT
의 논리 연산 수행
연산자 | 내용 |
---|---|
AND | a, b 모두 참이여만 참이다. |
OR | a, b 둘중 하나만 참이면 참이다. |
NOT | a가 거짓이면 참이다. |
위의 연산자를 사용하여 예제를 만들어보겠습니다.
- 예제
사용자에게 포켓몬 타입을 입력받고 이에 해당하는 포켓몬을 출력합니다.
단, 올바르지 않은 숫자를 입력할 경우 에러문구를 띄우며 종료합니다.
pokemons = ['파이리', '꼬북이', '이상해씨', '피카츄'] print("여기는 태초마을! 함께 여정을 떠날 첫번재 포켓몬을 선택하자") num = int(input("1.불 2.물 3.풀 4.전기 : ")) if (num <= 0) | (num >= 5): print("숫자를 잘못 입력했습니다.") else: print("당신과 여정을 떠날 포켓몬은 " + pokemons[num-1] +"입니다.")
Line 4에 포켓몬 타입
에 0 미만또는
5이상인 값을 입력하면 에러 문구가 뜨도록 or
를 이용하였습니다.
※ 주의 : if문
에서 들여쓰기
올바르지 않은 경우 결과 값이 예상과 다르게 나올 수 있습니다.
- 결과값(예시)
>여기는 태초마을! 함께 여정을 떠날 첫번재 포켓몬을 선택하자 >1.불 2.물 3.풀 4.전기 : 2 >당신과 여정을 떠날 포켓몬은 꼬북이입니다. >``` 입력값을 바꿔가며 결과 값을 확인하세요.
반복문은 조건문과 마찬가지로 필수적인 문법입니다. 반복되는 부분을 묶어 표현할 수 있으며 긴 코드를 입력해야 하는 귀찮음을 줄여줍니다.
IT 1호관의 엘리베이터 층수 출력을 만든다고 가정해봅시다.
print("IT 1호관 1층입니다.")
print("IT 1호관 2층입니다.")
print("IT 1호관 3층입니다.")
print("IT 1호관 4층입니다.")
print("IT 1호관 5층입니다.")
print("IT 1호관 6층입니다.")
print("IT 1호관 7층입니다.")
print("IT 1호관 8층입니다.")
이런 식으로 나타날 것 입니다. IT 1호관 건물은 8층이라 직접 작성할 수 있었지만 만약 100층이 넘는 건물이었다면 어떡해야 할까요?
위 print문
을 보면 반복적으로 나타나는 부분이 보입니다. 이를 반복문으로 나타내보겠습니다.
for floor in range(8):
print(f"IT 1호관 {floor+1}층입니다.")
원래 8줄이었던 코드가 두 줄로 줄었습니다.
이처럼 사용자가 직접 반복작업을 하지 않고, 컴퓨터가 대신 해주기 때문에 반복문을 이용한 코드가 편리합니다. 다뤄야하는 정보의 양이 많으면 많을 수록 반복문이 사용된 코드의 효율이 더 증가할 것 입니다.
- for 문 기본구조
for 변수 in 반복가능한 객체
실행할 문장
반복 가능한 객체로는 list
, dictionary
, set
, string
, tuple
, bytes
, range
가 있습니다.
- 위에서 설명한 반복 가능한 객체 중
list
를 사용한 예제를 만들어보겠습니다.
pokemons
라는list
생성 후 모든 요소를 출력합니다.pokemons = ['피카츄', '파이리', '꼬북이'] for pokemon in pokemons: print(pokemon)
- 결과값
pokemons
배열 속의 모든 요소들이 출력되었습니다.
피카츄 파이리 꼬북이
- 예제
문자열의 요소들을 모두 출력합니다.
for letter in '잠만보': print(letter)
- 결과
잠 만 보
문자열인 '잠만보'
의 모든 요소들이 순서대로 출력되었습니다.
python
에서 들여쓰기
는 아주 중요합니다. c
나 java
등 보통 다른 컴퓨터 언어에서 코드블록은 {}
중괄호로 표시되는 반면 python
은 이를 들여쓰기
로 표현하기 때문입니다.
들여쓰기
는 tab
키나 spacebar
를 4번 눌러 사용합니다. 이 두 가지를 섞어쓰면 오류가 날 수 있으니 주의합시다!
- 아래의 코드를 입력해보세요.
pokemons = ['피카츄', '파이리', '꼬북이'] for pokemon in pokemons: print(pokemon) print(pokemons)pokemons = ['피카츄', '파이리', '꼬북이'] for pokemon in pokemons: print(pokemon) print(pokemons)위의 두 가지 코드는 마지막 라인 들여쓰기를 제외하고 모두 동일합니다.
다음 두 코드를 실행하여 결과값의 차이를 확인해보세요.
- 결과값
피카츄 파이리 꼬북이 ['피카츄', '파이리', '꼬북이']
피카츄 ['피카츄', '파이리', '꼬북이'] 파이리 ['피카츄', '파이리', '꼬북이'] 꼬북이 ['피카츄', '파이리', '꼬북이']
이를 통해 확인할 수 있듯이 들여쓰기 하나로 완전히 다른 결과 값을 보입니다.
첫번째 코드는 마지막 라인에 들여쓰기를 하지 않음으로써 for문
에 첫번째 print문
만 같은 블록으로 묶여있고 두번째 코드는 두번째 print문
까지 모두 for 문
으로 묶여있음을 확인 할 수 있습니다.
이는 지금 배우고 있는 for문
뿐만 아니라 앞서 배운 if 문
과 while 문
등 에도 해당되는 내용이니 항상 들여쓰기
를 올바르게 할 수 있도록 주의하도록 합시다.
range
은 숫자열
을 나타내는 파이썬 내장 함수
중 하나입니다.
range(start, stop, step)
start
와 step
은 지정하지 않아도 됩니다. 지정하지 않을 시 자동으로 0
과 1
로 설정됩니다.
step
은 몇 칸 넘어갈 지 결정합니다.
- 예시
range(5) -> 0,1,2,3,4 range(1,5) -> 1,2,3,4 range(0,10,2) -> 0,2,4,6,8
for문
과 순서열
을 사용하여 간단한 예제를 만들어 보겠습니다.
- 예제1: 순서열 만들기
for num in range(3): print(f"피카츄 {num}마리")
- 결과값
피카츄 0마리 피카츄 1마리 피카츄 2마리
숫자열의 요소가 모두 출력되었습니다.
피카츄가 1마리부터 표현되게 하려면range
를 수정하거나{num}
을{num + 1}
로 수정하면 되겠죠?
- 예제2: 순서열을 이용하여 내용 수정하기
순서열을 이용하여
pokemons
안의 배열 요소들을 수정해보겠습니다.pokemons = ['파카츄', '파이리', '꼬북이'] for num in range(3): pokemons[num] = "이브이" print(pokemons) print(num)
- 결과값
['이브이', '이브이', '이브이'] 2
pokemons
배열 안에 있던 모든 요소들이 이브이
로 수정된 것을 확인 할 수 있습니다.
또한 for 문
종료시 매개변수 num
의 값은 range
의 끝 값(stop-1)
입니다.
while문
은 조건문과 반복문이 합쳐진 형태입니다.
while문
의 조건문
이 참
일 경우 while문
아래 문장을 반복 실행
합니다.
- 기본구조
while 조건문: 반복 실행할 문장1 반복 실행할 문장2
위의 기본 구조를 활용하여 간단한 예제를 만들어보겠습니다.
- 예제
num = 0 while num < 3: print(f'이상해씨가 {num}일째 씨 뿌리는 중') num = num + 1 print("다 심었다!")
- 결과값
이상해씨가 0일째 씨 뿌리는 중 이상해씨가 1일째 씨 뿌리는 중 이상해씨가 2일째 씨 뿌리는 중 다 심었다!
조건문이 참일 경우 들여쓰기
로 묶인 같은 블럭 문장들이 반복 실행 됨
num=3
이 되면 조건
이 거짓
이 되므로 while문
밖으로 빠져나옵니다.
비슷한 예제를 앞서배운 for문
으로 표현해보겠습니다.
- 예제
for num in range(3): print(f'잠만보가 {num}시간째 자는 중')
- 결과값
잠만보가 0시간째 자는 중 잠만보가 1시간째 자는 중 잠만보가 2시간째 자는 중
while문
은 무한 반복이 가능합니다.
-> 반복 횟수가 불분명할 때 사용for문
은 반복 횟수에 제한이 있으나, 원하는 횟수 만큼 반복하도록 지정하기 간편합니다.
->반복 횟수가 명확할 때 사용
- 예제 (로켓단 vs 피카츄)
로켓단과 피카츄의 대결 예제를 만들어보겠습니다.
<조건>
- 로켓단과 피카츄의 체력은 10
- 서로에게 입힐 수 있는 데미지를 1-3으로 설정
- 피카츄의 공격은 사용자에게 입력받고, 로켓단의 공격은 랜덤 생성(랜덤 함수 이용)
- 둘 중 하나의 체력이 0이 되면 대결이 종료
from random import randint print("로켓단이 나타났다! '피카츄' 로 로켓단을 무찌르자!") pi_hp = 10 # 피카츄, 로켓단의 HP ro_hp = 10 while True: if pi_hp <= 0: print("'피카츄'가 쓰러졌다!") break elif ro_hp <= 0: print("'로켓댠'이 쓰러졌다!") break else: print("'피카츄'가 시도할 공격을 선택하세요.") num1 = int(input("1.몸통박치기 2.아이언테일 3.백만볼트 : ")) num2 = randint(1, 3) print(f"피카츄가 공격했다! 로켓단은 -{num1}의 데미지를 입었다.") ro_hp -= num1 print(f"로켓단이 공격했다! 피카츄는 -{num2}의 데미지를 입었다.") pi_hp -= num2 continue
체력이 0이 될 때까지 몇번의 루프를 돌려야 하는지 알 수 없기 때문에 이 예제는 while문
이 적합합니다.
random
모듈에서 정수만 생성하기 위해 randint
함수를 사용하였습니다. 이를 사용하기 위해서는 코드 제일 윗줄에 import
해주어야 합니다.
반복실행 중 continue
를 만나면 처음으로 돌아가고, break
를 만나면 while문
에서 탈출합니다.
- 결과값(예시)
>로켓단이 나타났다! '피카츄' 로 로켓단을 무찌르자!
>'피카츄'가 시도할 공격을 선택하세요.
>1.몸통박치기 2.아이언테일 3.백만볼트 : 3
>피카츄가 공격했다! 로켓단은 -3의 데미지를 입었다.
>로켓단이 공격했다! 피카츄는 -2의 데미지를 입었다.
>'피카츄'가 시도할 공격을 선택하세요.
>1.몸통박치기 2.아이언테일 3.백만볼트 : 3
>피카츄가 공격했다! 로켓단은 -3의 데미지를 입었다.
>로켓단이 공격했다! 피카츄는 -1의 데미지를 입었다.
>'피카츄'가 시도할 공격을 선택하세요.
>1.몸통박치기 2.아이언테일 3.백만볼트 : 2
>피카츄가 공격했다! 로켓단은 -2의 데미지를 입었다.
>로켓단이 공격했다! 피카츄는 -3의 데미지를 입었다.
>'피카츄'가 시도할 공격을 선택하세요.
>1.몸통박치기 2.아이언테일 3.백만볼트 : 3
>피카츄가 공격했다! 로켓단은 -3의 데미지를 입었다.
>로켓단이 공격했다! 피카츄는 -1의 데미지를 입었다.
>'로켓댠'이 쓰러졌다!
>```
입력값을 자유롭게 바꿔가며 결과값을 확인하세요.