Skip to content

Latest commit

 

History

History
417 lines (390 loc) · 14.5 KB

4.condition+repetition.md

File metadata and controls

417 lines (390 loc) · 14.5 KB

4장 조건조건 + 반복반복

프로그램을 만들 때 조건과 반복은 필수 요소입니다. 오늘은 조건문과 반복문에 대해서 배워보도록 하겠습니다.


4.1 조건문

조건문이란?

조건이면 명령을 실행하는 문장

참과 거짓

논리형?

이나 거짓을 값으로 취할 수 있는 변수의 자료형

: 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

이제 본격적으로 조건문에 대하여 배워보도록 하겠습니다.

4.1.1 if문

  • 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("게임에서 패배했습니다.")
  • 결과값
    어떠한 문자열이라도 입력할 경우, 게임에서 승리했습니다. 문구 출력 공백일 경우 게임에서 패배했습니다. 출력

4.1.3 elif문

  • 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
>당신과 여정을 떠날 포켓몬은 꼬북이입니다.
>```
입력값을 바꿔가며 결과 값을 확인하세요.

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 가 있습니다.

4.2.1 for 변수 in list

  • 위에서 설명한 반복 가능한 객체 중 list를 사용한 예제를 만들어보겠습니다.


pokemons라는 list생성 후 모든 요소를 출력합니다.

pokemons = ['피카츄', '파이리', '꼬북이'] 
for pokemon in pokemons: 
   print(pokemon) 
  • 결과값
    pokemons 배열 속의 모든 요소들이 출력되었습니다.
피카츄
파이리
꼬북이

4.2.2 for 변수 in 문자열

  • 예제
    문자열의 요소들을 모두 출력합니다.
for letter in '잠만보': 
   print(letter)
  • 결과
잠
만
보

문자열인 '잠만보'의 모든 요소들이 순서대로 출력되었습니다.

들여쓰기에 대한 이해

python에서 들여쓰기는 아주 중요합니다. cjava 등 보통 다른 컴퓨터 언어에서 코드블록은 {} 중괄호로 표시되는 반면 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 문 등 에도 해당되는 내용이니 항상 들여쓰기를 올바르게 할 수 있도록 주의하도록 합시다.

4.2.3 for 변수 in 순서열

range숫자열을 나타내는 파이썬 내장 함수 중 하나입니다.

range(start, stop, step)

startstep은 지정하지 않아도 됩니다. 지정하지 않을 시 자동으로 01로 설정됩니다.
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) 입니다.


4.3 반복문+ 조건문 (while문)

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시간째 자는 중

for문 VS while문

  • 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의 데미지를 입었다.
>'로켓댠'이 쓰러졌다!
>```
입력값을 자유롭게 바꿔가며 결과값을 확인하세요.