| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 파이썬
- Python
- SSH Tunnel
- 개발일지
- database
- 오픈빌더
- 장고
- ec2
- postgres
- settings.py
- 아나콘다
- 파이선
- AWS
- 이터널리턴
- pycharm
- 파이팅
- django db with ssh tunnel
- psycopg
- Django
- Chatbot
- vpc
- subnet
- chartjs-chart-financial
- 챗봇
- GPT
- vue
- RDS
- 파이참
- 따라하며 배우는 파이썬과 데이터 과학
- Today
- Total
우아한 개발계발 블로그
따라하며 배우는 파이썬과 데이터 과학 (5) - 여러 번 반복하는 일을 하자 본문
2021.05.30 - [분류 전체보기] - 따라하며 배우는 파이썬과 데이터 과학 (4) - IF! 조건을 따져 실행해 보자
따라하며 배우는 파이썬과 데이터 과학 (4) - IF! 조건을 따져 실행해 보자
2021.05.28 - [Study/따라하며 배우는 파이썬과 데이터 과학] - 따라하며 배우는 파이썬과 데이터 과학 (3) - 연산자로 연산을 해 보자 따라하며 배우는 파이썬과 데이터 과학 (3) - 연산자로 연산을 해
w00-ah.tistory.com
이전 글에서 제어 기법 중 조건문에 대해 알아봤으니 이번에는 반복문에 대해 알아보자
5.1 반복?
반복문을 알기전에 반복문의 필요성에 대해 짚고 가자
왜 반복문이 필요할까. 상황 가정을 통해 느껴보자.
예를 들어 가로등을 켜고 끄는 가로등.켜기(), 가로등.끄기() 함수가 있다고 가정하고 우리는 한 지역의 가로등을 담당하고 있다고 가정해보자. 우리가 해야할 일은 아침이 되면 가로등이 켜지고 밤이되면 조명을 끄는것이다.
사람이 매일매일 가로등을 끄고 켜려면 굉장히 불편할 것이다. 그리고 가로등의 개수는 수만 개이다. 그래서 우리는 자동
if Is아침(): # Is아침 함수는 현재 시간이 아침이라면 True를 반환한다.
가로등.끄기()
if Is밤(): # Is아침 함수는 현재 시간이 밤이라면 True를 반환한다.
가로등.켜기()
이렇게 보면 문제는 없어보인다. 하지만 이 코드는 엄청난 문제가 있다. 누군가 계속 실행 버튼을 눌러줘야한다는 것이다. 파이썬은 위에서부터 아래로 순차적으로 실행하고 더이상의 코드가 없다면 프로그램은 종료된다.
이 프로그램은 아침이라면 가로등을 끄고 프로그램이 종료된다. 사람이 밤낮으로, 수시로 작동시켜야하는 프로그램이라면 굳이 할 사용할 이유가 없는 프로그램이다. 이 프로그램이 하루종일 작동하면서 알아서 밤과 낮을 판단할 수 없을까? 이때 우리는 반복이라는 개념을 사용할 수 있다. while True: 를 맨 윗줄에 추가하여 프로그램이 무한반복될 수 있도록 해보자.
while True: # 아래 코드 블록을 무한 반복하라!
if Is아침():
가로등.끄기()
if Is밤():
가로등.켜기()
위의 코드는 사람이 반복시키는게 아닌 프로그램이 스스로 반복하여 아침과 밤을 구분하여 가로등을 끄고 켜는 것이다.
이렇게 반복적인 일에 프로그래밍을 더하면 인간의 수고를 덜 수 있다.
파이썬에는 두가지 반복문이 있는데 for 반복문과 while 반복문이다.
for을 사용하면 for반복문이고 while을 사용하면 while 반복문인 것이다.
5.2 for 반복문
for 반복문은 보통 정해진 횟수를 반복하는데 쓰인다.

기본적인 구조는 이러한데, Iterable 객체 또는 sequence 객체는 대표적으로 아래와 같은 객체들이 있다.
- list
- tuple
- dictionary
- set
- range() # 인자로 넘겨준 숫자 만큼 시퀀스를 만들어 반환함
for 의 작동 구조는 입력받은 객체에서 객체 내부의 요소를 하나씩 꺼내와서 변수에 저장한다. 그리고 하나씩 꺼내올때마다. for의 코드 블록이 실행되는 것이다.
이는 예제 코드를 통해 살펴볼 수 있다.
for i in [1,2,3,4,5]:
print(i)
# 출력결과
# >>> 1
# >>> 2
# >>> 3
# >>> 4
# >>> 5
Iterrable한 객체로 1,2,3,4,5 의 요소를 갖는 List를 할당해주었고, for 블록에서 사용할 변수는 i라고 선언해주었다.
처음에 list [1,2,3,4,5]에서 첫번째 요소인 1이 변수 i 에 할당되고 for 블록의 명령어인 print(i)를 통해 i 변수 i의 값을 출력하니 i 에 저장된 1 출력된다. 그리고 for 블록이 끝났으므로 다시 처음으로 돌아가 두번째 요소인 2 가 변수 i 에 할당되고 위와 같은 작업이 반복된다. 그러다 마지막으로 5가 출력되고 더이상의 요소가 존재하지않으므로 for문이 종료된다.
이러한 과정을 요약해보자면 아래와 같다.
- 객체에서 요소를 하나 불러와 변수에 저장함
- for 블록에 해당하는 명령어들을 실행함
- 블록 내부의 명령어가 종료되면 처음으로 돌아가 그 다음 요소를 불러와 변수에 저장함
- 2-3의 과정을 반복하다가 더 이상 객체에 요소가 존재하지 않으면 for문을 종료한다.
한마디로 정리하자면 for문은 하나씩 가져와 반복 실행하는 것이라고 생각하면 된다.
예제를 통해 더 알아보자
for _ in range(5):
print("#"*20)
# 실행결과
# ####################
# ####################
# ####################
# ####################
# ####################
#을 20번 출력하는 코드를 range(5)를 통해 5번 반복하였다.
range() 함수는 입력받는 인자에 따른 시퀀스를 생성하여 반환한다.
range(start, end, step) 와 같이 3개의 인자가 있는데 이를 말로 풀면 정말 쉽다.
start 부터 end 까지 step 씩 라고 이해하면 된다. start 와 step 인자는 생략할 수 있다.
그래서 range(5) 는 range(0,5,1) 과 같다.
※ end 까지 이므로 range(5)는 0,1,2,3,4 를 내부 요소로 갖는 시퀀스를 반환하니 염두해두자.
아래 코드를 통해 range에 가 어떤 값을 반환해주는지 알 수 있다.
for t in range(10):
print(t)
# 실행 결과
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
for t in range(0, 10, 2):
print(t)
# 실행결과
# 0
# 2
# 4
# 6
# 8
5.2 while 반복문
for 보다 훨씬 쉽다. while 반복문은 if 문처럼 Condition을 인자로 받는다. 이 condition이 참이라면 while의 블록을 실행하는 것이다. for보다 이해하기 쉽지않은가?

예제 코드를 통해 더 알아보자.
구구단을 출력하는 코드이다.
i, j = 1, 1
while j <= 9:
while i <= 9:
print(f"{i} * {j} = {i * j:<10}", end=" ")
i += 1
print()
j += 1
i = 1
# 실행결과
# 1 * 1 = 1 2 * 1 = 2 3 * 1 = 3 4 * 1 = 4 5 * 1 = 5 6 * 1 = 6 7 * 1 = 7 8 * 1 = 8 9 * 1 = 9
# 1 * 2 = 2 2 * 2 = 4 3 * 2 = 6 4 * 2 = 8 5 * 2 = 10 6 * 2 = 12 7 * 2 = 14 8 * 2 = 16 9 * 2 = 18
# 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 4 * 3 = 12 5 * 3 = 15 6 * 3 = 18 7 * 3 = 21 8 * 3 = 24 9 * 3 = 27
# 1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16 5 * 4 = 20 6 * 4 = 24 7 * 4 = 28 8 * 4 = 32 9 * 4 = 36
# 1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25 6 * 5 = 30 7 * 5 = 35 8 * 5 = 40 9 * 5 = 45
# 1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36 7 * 6 = 42 8 * 6 = 48 9 * 6 = 54
# 1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49 8 * 7 = 56 9 * 7 = 63
# 1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64 9 * 8 = 72
# 1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
print문이 난해할 수 있는데 이는 문자열 포매팅 방식의 일종이므로 나중에 다룰 것이니 당장은 [여기] 를 참고하자
i 와 j에는 각각 1이 할당되었다. 그리고 j 가 9보다 작으므로 while j <= 9: 블록이 실행되었다. 그리고 i 가 9보다 작으므로 while i <= 9: 블록이 실행되었다. 내부 블록에서 반복될 때마다 i 의 값을 1씩 증가 시키고있다. 1씩 증가하다가, 10이 되어 9보다 커지니 while i <= 9: 블록이 종료되고 j에 1을 더하면서 while j <= 9: 의 블록이 다시 반복된다.
말로 설명하기도 버거운 위의 과정을 반복하면서 j 가 10이되면 j<=9 조건식의 반환값은 False가 되므로
while j <= 9: 블록은 더이상 실행되지않고 종료되고 다음으로 넘어간다.
아래 코드는 책의 코드를 가져와 보았다.
#
# 따라하며 배우는 파이썬과 데이터과학(생능출판사 2020)
# LAB 5-9 간단한 코드로 멋진 나선형 도형 그려보기, 132쪽
#
import turtle
t = turtle.Turtle()
t.shape("turtle")
# 거북이의 속도는 0으로 설정하면 최대가 된다.
t.speed(0)
t.width(3)
length = 10 # 초기 선의 길이는 10으로 한다.
# while 반복문이다. 선의 길이가 500보다 작으면 반복한다.
while length < 500:
t.forward(length) # length만큼 전진한다.
t.right(89) # 89도 오른쪽으로 회전한다.
length += 5 # 선의 길이를 5만큼 증가시킨다.
turtle.done()

length 변수의 값이 500 보다 작을 동안 length의 값을 5씩 증가시키면서 89도씩 회전하며 전진하여 그림을 그리는 코드이다. 자세한 설명은 주석을 통해하고있으니 꼭 참고하자!
5.4 break 와 continue
혹시 글의 맨 처음 내용을 기억하는가? while은 이렇게 조건을 통해 반복되는데 조건이 True로 고정된 참 값이라면 while 블록은 무한반복된다. 다음을 보자
i = 0
while True: # 무한 루프
print(i)
i += 1 # i를 1씩 증가시킴
# 실행결과
# 0
# 1
# 2
# 3
# .
# .
# 12839183781732
# 12839183781733
# .
# .
# .
i를 1씩 증가시키며 출력하는 작업을 무한 반복하는 코드인데, 이 코드는 문제가 있다. 어떤 문제가 있을까? 말 그대로 무한 반복하는 것이 문제인데, 종료되지 않는 것이 문제이다. i를 1씩 증가시키다가 우리 컴퓨터의 메모리를 초과해버리면 컴퓨터의 메모리가 꽉차서 작동이 멈출 수도 있다. 그래서 우리는 우리는 반복문을 종료하는 예약어인 break를 사용하는 방법을 통해 반복을 제어할 수 있다.
i = 0
while True: # 무한 루프
print(i)
i += 1 # i를 1씩 증가시킴
if i == 100: # i가 100일 때
break # 반복문을 끝냄. while의 제어흐름을 벗어남
# 실행결과
# 0
# 1
# 2
# 3
# .
# .
# 98
# 99
i가 100이 되었을 때 break를 통해 반복문을 종료하는 코드를 추가하였다. 99까지 출력되고 i에 1을 더하여 100이된 순간에 반복문이 종료된 모습을 확인할 수 있다.
break는 모든 반복문(for, while)에서 사용할 수 있으니 알아두자.
그리고 break는 반복문을 종료시킬 때, 자신이 위치하는 블록의 반복만 빠져나오기 때문에 2중 반복문같은 경우에는 break를 두번 사용하여 빠져나와야 한다.
다음으로는 반복 제어 중 continue가 있다.
아래 코드를 보자
i=0
while i<10: # i < 10 일 동안
i += 1 # i를 1씩 증가시킴
if i == 5: # i가 5 일 때
continue # 이하 코드들은 무시하고 건너뜀
print(i)
# 실행 결과
# 1
# 2
# 3
# 4
# 6
# 7
# 8
# 9
# 10
실행 결과를 보면 5만 출력되지 않은 모습을 볼 수 있다. if문과 continue가 없다면 1~ 10 까지 출력되었겠지만
i 가 5일 때, continue 가 작동했기 때문에, print(i)는 실행되지 않고 건너뛰어진 모습을 확인할 수 있다.
이처럼 break와 continue을 이용해서 반복할 때 모든 경우에 다 반복 블록이 실행되는게 아니라 경우를 나누어서 반복할 수 있다.
이제까지 파이썬의 아주 기초적인 문법들에 대해 알아봤고, 파이썬이 제공하는 함수들만 사용해봤다.
이제 다음장에서 우리는 우리가 함수를 만들어서 사용해 볼 것이다.
'Study > 따라하며 배우는 파이썬과 데이터 과학' 카테고리의 다른 글
| 따라하며 배우는 파이썬과 데이터 과학 (7) - 데이터를 리스트와 튜플로 묶어보자 (0) | 2021.06.20 |
|---|---|
| 따라하며 배우는 파이썬과 데이터 과학 (6) - 함수로 일처리를 짜임새있게 하자 (1) | 2021.06.20 |
| 따라하며 배우는 파이썬과 데이터 과학 (4) - IF! 조건을 따져 실행해 보자 (0) | 2021.05.30 |
| 따라하며 배우는 파이썬과 데이터 과학 (3) - 연산자로 연산을 해 보자 (0) | 2021.05.28 |
| 따라하며 배우는 파이썬과 데이터 과학 (2) - 값을 담아 다루어 보자 (1) | 2021.05.28 |