[CHAPTER 5] 반복문
프로그램의 기본 제어 구조
- 순차 구조 : 여러 명령이 순차적으로 실행되는 구조
- 선택 구조 : 여러 개 중 하나의 명령문을 선택하여 실행하는 구조
- 반복 구조 : 동일한 명령이 반복되면서 실행되는 구조
이번 챕터에서는 반본 구조에 대해 자세히 살펴보겠다.
반복문
반복문은 어떤 단계를 반복하게 하는 것으로
반복 구조를 사용하면 중복되는 코드의 사용을 줄여줌으로써 프로그램이 간결해진다.
또한, 반복되는 코드를 타이핑하는 시간도 줄여준다.
프로그래밍에서 반복은 흔히 올가미 같은 동그란 고리를 의미하는 루프(loop)라고 한다.
이 고리를 빠져나오지 않고 계속해서 반복을 하는 경우를 무한 루프(infinite loop)라고 한다.
반복문의 종류
파이썬에서는 2가지 종류의 반복문이 있다. (while, for)
for문부터 살펴보자.
횟수 제어 반복 | for
for 반복문의 기본적인 사용법
>>> for i in [1, 2, 3, 4, 5]: # 반복문의 끝에 :이 있어야함
print(i , '번째 출력') # if 문과 마찬가지로 들여쓰기를 하여야 함
1 번째 출력
2 번째 출력
3 번째 출력
4 번째 출력
5 번째 출력
위의 반복문은 i가 [1, 2, 3, 4, 5]의 값에서 차례대로 읽어 5번 실행한다. 대괄호 []로 표현된 것은 list이다. 이것은 chapter 7에서 자세히 다룬다.
그러니까,
첫 번째 실행에서 i의 값은 1
두 번째 실행에서 i의 값은 2
...
다섯 번째 실행에서 i의 값은 5가 된다.
출력 결과를 보면 i는 1부터 5까지 변하는 것을 볼 수 있다.
for - in 다음에는 문자열도 올 수 있다.
>>> for i in "Hello":
print('i =', i)
i = H
i = e
i = l
i = l
i = o
반복문을 이용해 구구단을 간단하게 작성할 수도 있다.
>>> for i in [1, 2, 3, 4, 5]:
print("9 *", i, "=", 9 * i)
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
range() 함수를 쓰면 for문을 더 효율적으로 작성할 수 있다. range() 함수
0부터 10000까지 반복하고 싶은데 [0, 1, 2, 3, 4, ... 10000] 이렇게 1만 개를 일일이 쓸 수는 없다.
이럴 때 range()함수를 이용한다.
range()를 활용한 for문의 사용법이다.
>>> for i in range(10):
print('i =', i)
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
첫 번째 반복에서는 i는 0range(10)은 0, 1, 2 ... 9까지의 숫자열을 반환한다.
두 번째 반복에서는 i는 1
마지막 반복에서는 i는 9가 된다.
수의 범위를 지정할 수도 있다.
range(start, stop, step)이라고 호출하면 start에서 시작하여 stop-1까지 step간격으로 정수들이 생성된다.
start가 생략되면 star = 0
step이 생략되면 step = 1 이라고 간주한다.
stop은 생략할 수 없다.
3부터 5까지 반복한다.
>>> for i in range(3,6):
print('i =', i)
i = 3
i = 4
i = 5
3부터 9까지 2간격으로 반복한다.
for i in range(3,10,2):
print('i =', i)
while 반복문의 기본적인 사용법 조건 제어 반복 | while
condition = True
while condition:
response = input('\'q\'입력시 종료: ')
if response == 'q':
condition = False
print('종료')
'q'입력시 종료: a 'q'입력시 종료: b 'q'입력시 종료: c 'q'입력시 종료: q 종료 |
condition에 오는 값을 조건식이라한다.
조건식이 True이면 반복을 계속 진행하고, False이면 중단한다.
'q'를 입력하는 순간 condition = False 가 실행되고
조건식이 False가 되어 while 문을 탈출한다.
1부터 10까지의 합을 계산하는 코드를 while 문으로 작성해보자.
count = 1
s = 0
while count <= 10:
s += count
count += 1
print('합계는', s)
합계는 55 |
첫 번째 실행에서 s = 1
두 번째 실행에서 s = 1 + 2
세 번째 실행에서 s = 1 + 2 + 3
...
열 번째 실행에서 s = 1+ 2 + 3 + ... + 10
그리고 count는 11이 되고 반복문을 빠져나간다
위의 코드를 for문으로 다시 작성해보자.
s = 0
for count in range(11):
s += count
print('합계는', s)
코드가 조금 더 직관적이고 간결하다.
상황에 따라서 for문과 while문 중에 잘 선택하여 사용하여야 한다.
무한루프
while문에서는 프로그램이 무한히 반복하는 일이 발생한다. 이것을 무한 루프라고 한다.
while True:
light = input('신호등 색상을 입력하시오:')
print('전진!')
신호등 색상을 입력하시오: red 신호등 색상을 입력하시오: yellow 신호등 색상을 입력하시오: green 신호등 색상을 입력하시오: green 신호등 색상을 입력하시오: green ... |
조건이 True이므로 무한히 반복한다.
green을 입력하였을 때 무한 루프를 빠져나와 print('전진!')이 실행되게 하고 싶다.
무한 루프를 빠져나오는 방법을 살펴보자.
continue와 break
빠져나오려면 break를 이용하면 된다.
입력한 문자열이 green이라면 break를 실행한다.
break는 루프를 강제적으로 빠져나올 때 사용하는 문장이다.
while True:
light = input('신호등 색상을 입력하시오:')
if light == 'green': # green이 입력되면
break # 반복문을 빠져나온다.
print('전진!')
신호등 색상을 입력하시오: red 신호등 색상을 입력하시오: yellow 신호등 색상을 입력하시오: green 전진! |
continue는 루프를 빠져나오지 않고 countinue 아래의 문장만을 건너뛰는 역할을 한다.
st = 'I love Python Programming' # 출력을 위한 문자열
for ch in st:
if ch in ['a','e','i','o','u', 'A','E','I','O','U']:
continue # 모음일 경우 아래 출력을 건너뛴다
print(ch, end='')
lv Pythn Prgrmmng |
하지만 continue와 break를 너무 많이 쓰면 코드를 읽기 어려워진다.
필요한 경우에만 제한적으로 사용하도록 하자.
출력을 예쁘게 만드는 포매팅
추가적으로 print()를 더 예쁘게 사용해보자!
format() 메서드
플레이스 홀더 {}와, format() 메소드를 이용하여 print()함수를 더 예쁘게 작성할 수 있다.
플레이스홀더 {}는 format() 메서드의 인자로 들어오는 값이 출력되는 위치를 지정하는 역할을 한다.
print('{} Python!'.format('Hello'))
print('I like {} and {}'.format('Python', 'Java'))
Hello Python! I like Python and Java |
{} 안에 인덱스 값을 넣어 순서를 표시할 수도 있다.
print('I like {0} and {1}'.format('Python', 'Java'))
print('I like {1} and {0}'.format('Python', 'Java'))
print('I like {0}, {0}, {0}'.format('Python', 'Java'))
I like Python and Java I like Java and Python I like Python, Python, Python |
f-strings
format() 메서드를 조금 더 간단하게 쓸 수 있는 기능이 있다.
나는 이 방법이 가장 편한 것 같다.
st1 = 'Python'
st2 = 'Java'
print(f'I like {st1} and {st2}')
print(f'I like {st2} and {st1}')
I like Python and Java I like Java and Python |
소수점 출력
소수점 두 자리까지, 세 자리까지 출력하고 싶다면 아래와 같이 {.2f}, {.3f}를 이용한다.
f는 부동소수점(floating point)을 의미한다.
>>> print('소수점 아래 두자리 정밀도 : {0:.2f}, 세자리 정밀도 {0:.3f}'.format(1/3))
소수점 아래 두자리 정밀도 : 0.33, 세자리 정밀도 0.333
{10.3f}는 전체 10칸의 필드 폭을 지정하고 소수점 세 자리까지만 출력하라는 뜻이다.
>>> print('전체 10칸을 차지하는 실수 : {0:10.3f}, {0:10.4f}'.format(3.1415926))
전체 10칸을 차지하는 실수 : 3.142, 3.1416
정수 출력을 위해서는 {d}를 사용하면 된다.
>>> for i in range(2, 11, 2):
print('{0:3d} {1:4d} {2:5d}'.format(i, i*i, i*i*i))
2 4 8
4 16 64
6 36 216
8 64 512
10 100 1000
지금까지 배운 것들로
N-각형 그리기
사용자로부터 n을 입력받고
n각형을 그리는 프로그램을 작성해보자
import turtle
t = turtle.Turtle()
t.shape("turtle")
s = turtle.textinput("", "몇각형을 원하시나요?:")
n = int(s)
for i in range(n):
t.forward(100)
t.left(360/n)
turtle.done()
숫자 맞추기 게임
프로그램은 random 모듈을 사용하여 1부터 99까지의 정수 중 하나를 고른다.
사용자가 숫자를 입력하면 정답보다 큰지 작은지 출력해준다.
이 과정을 반복하면서 정답을 맞혀보자!
import random
tries = 0
guess = 0;
answer = random.randint(1, 100)
print("1부터 100 사이의 숫자를 맞추시오")
while guess != answer:
guess = int(input("숫자를 입력하시오: "))
tries = tries + 1
if guess < answer:
print("낮음!")
elif guess > answer:
print("높음!")
print("축하합니다. 총 시도횟수=", tries)
1부터 100 사이의 숫자를 맞추시오 숫자를 입력하시오: 55 높음! 숫자를 입력하시오: 45 낮음! 숫자를 입력하시오: 50 높음! 숫자를 입력하시오: 47 높음! 숫자를 입력하시오: 46 축하합니다. 총 시도횟수= 5 |