Python 기초

for 문

for 문은 정해진 횟수만큼 반복할 때 사용하는 반복 구조입니다. for 루프(loop) 라고도 합니다.

for 문은 반복 구조 중에서 가장 많이 사용되는데 그것은 장점이 많기 때문입니다.

 

위의 순서도의 코드 구조는 아래와 같습니다.

# 변수는 각 반복마다 변수의 값이 컨테이너의 요소값으로 설정되며
# 시퀀스는 리스트처럼 요소들을 가지고 있는 객체입니다.
for 변수 in 시퀀스
	반복 문장 # 블록으로 들여쓰기 하여야 합니다.
	반복 문장

 

리스트에 대한 반복

시퀀스는 어떻게 만들까요? 문자열이나 리스트가 시퀀스입니다. 리스트에 대해 반복하는 예제를 살펴봅시다.

레드벨벳의 멤버 리스트에서 이름을 꺼내 화면에 출력하는 코드는 다음과 같습니다.

for name in ["아이린", "슬기", "웬디", "조이", "예리"]:
	print("안녕! " + name)

 

<실행 결과>

안녕! 아이린
안녕! 슬기
안녕! 웬디
안녕! 조이
안녕! 예리

 

  • for 문장에 있는 변수 name은 루프 변수라고 불립니다. 변수 이름은 얼마든지 변경할 수 있습니다.
  • 2번째 줄은 루프 몸체라고 불리며 반드시 들여쓰기 하여야 합니다. 들여쓰기가 어떤 문장들이 루프 안에 있는지를 결정합니다.
  • 한번 반복이 끝나면 처리할 항목이 더 있는지 검사합니다. 처리할 항목이 없다면 루프는 종료되고 루프 몸체 다음 문장부터 다시 실행됩니다.
  • 만약 처리할 항목이 더 있다면 루프 변수가 리스트의 다음 항목으로 변경됩니다. 각 반복에서 name 변수는 각각의 멤버 이름을 참조합니다.

 

for 문의 정확한 이해는 아주 중요하므로 리스트에서 문자열을 꺼내서 반복하는 예제를 그림을 통해 이해해봅시다.

먼저 리스트의 첫 번째 요소인 '아이린' 이 name 변수에 담기고 print() 함수에서 사용됩니다.

그 후 리스트로 돌아가 다음 요소인 '슬기'에 접근합니다.

 

리스트의 두 번째 요소인 '슬기' 가 name 변수에 담기고 print() 함수에서 사용됩니다.

그 후 리스트로 돌아가 다음 요소인 '웬디'에 접근합니다.

 

위와 같이 다음 요소가 있는지 확인 후 반복을 수행합니다.

 

 

 

'예리'까지 출력을 마친 후 리스트에 남은 요소가 없으므로 반복을 종료합니다.

 

정수 리스트에 대하여 반복하기

이번에는 정수 리스트에서 정수를 하나씩 꺼내 출력하는 코드를 살펴봅시다.

for x in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
	print(x, end=" ")

 

<실행 결과>

0 1 2 3 4 5 6 7 8 9

 

  • [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 는 정수들을 가지고 있는 리스트입니다. for문이 실행되면 이들 리스트에서 정수를 하나씩 꺼내 변수 x에 할당하게 됩니다.
  • 각 반복에서 변수 x의 값을 출력합니다.
  • 여기서 print(x, end = " ")은 변수 x의 값을 출력한 후에 줄을 바꾸지 말고 " "을 출력하라는 의미입니다.

 

range() 함수

0부터 9까지의 정수들의 리스트는 불편하지만 만들 수 있습니다. 하지만 숫자 10개가 아닌 100만개의 리스트는 어떻게 해야 할까요?

좀 더 편리한 방법으로 range() 함수를 사용할 수 있습니다. range() 는 범위(구간)라는 뜻입니다.

 

이 함수를 이용하면 특정 구간의 정수들을 생성할 수 있습니다. 예를 들어 range(10) 하면 0부터 9까지의 정수가 생성됩니다.

sum = 0

for x in range(10):    # range(10)은 0부터 9까지의 정수를 생성합니다.
	sum += x

print(sum)

 

<실행 결과>

45

 

range(start, stop) 의 형식도 사용할 수 있습니다. range(start, stop)와 같이 호출하면 start 부터 시작하여 (stop-1) 까지의 정수가 생성됩니다.

이때 stop은 포함되지 않습니다.

sum = 0

for x in range(0, 10): # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 에 대해 반복합니다
	sum += x

print(sum)

 

<실행 결과>

45

 

range(start, stop, step) 과 같은 형식도 제공됩니다. start 부터 stop-1까지 step의 간격으로 정수를 생성합니다.

예를 들어 range(0, 10, 2) 와 같이 호출하면 0부터 2씩 건너뛰면서 10보다는 작은 정수 [0, 2, 4, 6, 8] 가 생성됩니다.

for x in range(0, 10, 2):    # 0, 2, 4, 6, 8 에 대하여 반복합니다
	print(x, end = " ")

 

<실행 결과>

0 2 4 6 8

 

여기서 range() 함수의 형식을 정리하고 지나갑니다.

range( [start ,] stop [, step] )

 

range() 함수는 start 부터 stop-1 까지 step의 간격으로 정수들을 생성합니다.

start와 step이 대괄호로 싸여져 있는데 이는 생략할 수 있다는 의미입니다. start나 step이 생략되면 start는 0, step은 1로 간주됩니다.

 

NOTE

위에서는 쉬운 설명을 위해 range() 함수가 정수들의 리스트를 생성한다고 설명하였습니다.

하지만 파이썬 버전 3부터는 range() 함수는 연속적인 정수들을 생성하는 제너레이터 객체를 반환합니다.

반복 횟수가 많을 때, 정수 리스트를 생성하면 너무 커지기 때문입니다. range() 가 반환하는 객체를 받아 리스트로 변환하려면 list() 함수를 사용하면 됩니다.

print(range(10))
print(list(range(10)))

 

<실행 결과>

range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

NOTE

반복문은 상당히 복잡할 수 있으므로 앞에서 소개한 "Python Tutor" 라는 도구를 사용하면 파이썬이 실행되는 모습을 그래픽으로 볼 수 있습니다.

"Python Tutor" 는 소스 코드의 각 문장이 실행되는 모습을 화면으로 시각화하여 볼 수 있습니다.

링크 : http://www.pythontutor.com/visualize.html#mode=edit

 

 

문자열 반복

문자열도 시퀀스의 일부분입니다. 따라서 문자열을 대상으로 반복문을 만들 수 있습니다.

문자열 "abcdef" 에 들어 있는 문자들을 처리하려면 다음과 같은 반복문을 만들어서 사용할 수 있습니다.

for c in "abcdef":
	print(c, end = " ")

 

<실행 결과>

a b c d e f

 

반복 루프가 끝나면?

반복 루프의 몸체 로직이 종료되면 루프 아래에 있는 문장이 실행됩니다.

for x in range(0, 5):
	print(x, end = " ")
print("반복이 종료되었습니다.") # 반복 루프가 종료되면 반복문의 아래에 있는 문장이 실행됩니다.

 

<실행 결과>

0 1 2 3 4 반복이 종료되었습니다.

 

반복문을 이용한 터틀 그래픽

반복문과 터틀 그래픽을 이용하여 싸인(sine) 그래프를 그려보도록 하겠습니다.

import math
import turtle

t = turtle.Turtle()
t.shape("turtle")

for angle in range(360):				# 360번 반복합니다.
	y = math.sin(math.radians(angle))	# angle 값에 대응되는 싸인 값을 계산합니다.
	scaledX = angle						# x축의 좌표값을 각도로 합니다.
	scaledY = y * 100					# y축의 좌표값을 싸인값으로 합니다.
	t.goto (scaledX, scaledY)			# 터틀 객체를 (scaledX, scaledY)로 이동시킵니다.

turtle.done()

 

<실행 결과>

math와 turtle 모듈을 이용하여 싸인 그래프를 그렸습니다.

 

 

도전 과제

1. 1부터 사용자가 입력한 수 n 까지 더해 (1 + 2 + ... + n) 을 계산하는 프로그램을 작성하여 봅시다. for문 을 사용합시다.

 

<실행 결과>

  • 정수 10을 입력했을 때
어디까지 계산할까요? : 10
1부터 10 까지의 정수의 합 =  55

 


2. for 문을 이용하여 팩토리얼을 계산하여 봅시다. 팩토리얼 n! 은 1부터 n까지의 정수를 모두 곱한 것을 의미합니다.

즉 n! = 1 X 2 X 3 X ... X (n-1) X n 입니다.

 

<실행 결과>

  • 정수 10을 입력했을 때
정수를 입력하세요 : 10
10 !은 3628800 입니다.

 


3. 봉민이는 2018년 12월 31일 연말을 보낼 때 새해를 맞이하는 카운트 다운을 하는 프로그램을 만드려고 합니다.

예를 들어 사용자가 10을 입력하면 10 -> 9 -> 8 ... -> 1 과  같이 카운트를 하고 0이 되면 "Happy New Year!" 라고 화면에 출력합니다.

 

<실행 결과>

  • 10을 입력했을 때
초기 숫자를 입력하세요 : 10
10 9 8 7 6 5 4 3 2 1 Happy New Year!

 


4. 봉민이는 섭씨 온도로 날씨가 표시 되는 것이 지겨워 화씨 온도로도 날씨를 표현하는 프로그램을 작성하고자 합니다.

반복 구조를 사용하여야 하며 정수보다는 실수로 출력해야 합니다. 화씨 0도부터 100도까지, 10도 단위로 증가시키면서 대응되든 섭씨온도를 옆에 출력합니다.

 C = (F-32) * 5 / 9 수식을 사용합니다.

 

<실행 결과>

0 -> -17.78
10 -> -12.22
20 -> -6.67
30 -> -1.11
40 -> 4.44
50 -> 10.0
60 -> 15.56
70 -> 21.11
80 -> 26.67
90 -> 32.22
100 -> 37.78

 

HINT

round(c, 2)를 사용하면 변수 c의 값을 소수점 2번째 자리까지 출력할 수 있습니다.

 


5. 봉민이는 반복문을 배운 기념으로 터틀 그래픽을 이용하여 다시 그림을 그려보고 싶어 졌습니다. 아래의 그림들을 터틀 그래픽으로 그려보세요.

 

 


6. 봉민이는 검은색 거북이가 지겨워져 알록달록한 거북이 그림을 그리고 싶어졌습니다. 서로 다른 색을 이용하여 화면에 사각형의 각 변을 그려봅시다.

반복문을 사용하고 색을 문자열 형태로 리스트 안에 저장하여 사용합니다.

 

<실행 결과>

 

HINT

화면 배경색을 바꾸는 코드는 아래와 같습니다.

import turtle

window = turtle.Screen()		# 화면 객체를 가져옵니다.
window.bgcolor("lightgreen")	# 배경색을 녹색으로 변경합니다.

turtle.done()