Python / Pillow / for

4주차 1교시: 반복문과 시각적 리듬

하나의 도형을 그리는 명령을 반복문으로 바꾸고, for와 range로 시각적 리듬을 구성합니다.

종이 위 반복 도형과 간격 변화로 시각적 리듬을 보여 주는 4주차 1교시 이미지
간격과 크기 변화에 따른 시각적 리듬

반복문과 시각적 리듬

핵심 개념
반복, 패턴, 리듬
이전 학습
좌표, RGB, 도형
확인 방법
for, range(), 좌표 계산
다음 학습
리스트와 격자

학습 목표

  1. 반복 단위, 간격, 변화의 관계로 패턴과 시각적 리듬 설명
  2. 같은 명령을 여러 번 작성하는 방식과 비교해 for를 사용하는 이유 설명
  3. for i in range(...):의 다섯 구성 요소와 콜론·들여쓰기의 역할 구분
  4. range()가 만드는 정수 순서와 반복 횟수 예측 및 출력 검증
  5. 좌표의 차이에서 배치 규칙을 도출하고 반복 변수 i에 연결
  6. 코드 구조를 바탕으로 반복문 오류의 원인 설명
  7. Colab에서 원의 개수와 배치 방향을 수정하고 실행 결과 설명

학습 내용

도형 반복과 배치 규칙

3주차에는 좌표로 위치를 정하고, RGB 값으로 색을 정한 뒤, Pillow의 도형 명령으로 이미지에 픽셀을 기록했습니다. 예를 들어 아래 한 줄은 경계 상자 (80, 220, 150, 290) 안에 타원을 그립니다.

개별 관찰
draw.ellipse((80, 220, 150, 290), fill=(42, 104, 124))

같은 크기의 원을 가로로 다섯 개 배치하려면 x좌표만 조금씩 바꾼 명령을 다섯 번 작성할 수 있습니다. 3주차에 배운 도형 명령을 사용해 같은 크기와 색의 원 다섯 개를 그리는 방식입니다.

개별 관찰
draw.ellipse((80, 220, 150, 290), fill=(42, 104, 124))
draw.ellipse((190, 220, 260, 290), fill=(42, 104, 124))
draw.ellipse((300, 220, 370, 290), fill=(42, 104, 124))
draw.ellipse((410, 220, 480, 290), fill=(42, 104, 124))
draw.ellipse((520, 220, 590, 290), fill=(42, 104, 124))

이처럼 같은 명령을 여러 줄 작성하는 방식을 수동 반복이라고 합니다. 반복문으로도 같은 출력, 즉 원 다섯 개의 배열을 만들 수 있습니다. 다만 수동 반복에서는 원을 스무 개로 늘리거나 간격을 변경할 때 여러 줄의 좌표를 다시 계산해야 합니다. 이 과정에서 좌표를 잘못 입력하면 일부 원이 배치 규칙에서 벗어납니다. 반복문은 반복되는 구조와 달라지는 값을 분리해 기록하는 방법입니다.

Manual repetition

5 commands

각 도형의 좌표를 직접 작성합니다. 도형이 적을 때는 각 위치를 확인하기 쉽지만, 개수가 늘수록 수정할 좌표도 많아집니다.

Loop

1 rule × 5

반복할 명령은 한 번 작성하고, 위치 계산식과 반복 횟수를 구분해 지정합니다. 개수와 간격을 한곳에서 조정할 수 있습니다.

나무 손잡이 스탬프와 잉크 패드 옆에, 크림색 종이에 청록색 원 다섯 개가 일정한 간격으로 찍혀 있는 모습
한 동작의 반복

같은 스탬프로 원을 다섯 번 찍으면 형태는 같고 위치만 달라집니다. 반복문도 도형 명령을 한 번 작성하고, 위치처럼 반복마다 달라지는 값을 계산합니다. 스탬프는 이 관계를 설명하는 비유이며, 실제 코드는 숫자를 계산해 픽셀을 기록합니다.

개별 관찰

공통 요소와 변화 요소

위의 수동 반복 코드에서 모든 줄에 공통으로 사용된 부분에 밑줄을 긋고, 매번 달라지는 왼쪽·오른쪽 x좌표 두 개에 원을 그려 표시합니다. 각 x좌표가 다음 반복에서 얼마나 증가하는지도 계산합니다.

관찰 결과 확인

draw.ellipse, y좌표 220과 290, 색상 값은 같습니다. 왼쪽과 오른쪽 x좌표는 매번 110씩 증가합니다. 따라서 “같은 크기와 색의 원을 왼쪽 x좌표가 110씩 증가하는 위치에 다섯 번 그린다”라는 규칙으로 정리할 수 있습니다. 여기서 배치 간격 110은 인접한 두 원의 왼쪽 x좌표 사이 거리입니다. 원 경계 사이의 빈 공간과 구분합니다.

반복, 패턴, 리듬

반복되는 요소가 있다고 해서 모든 화면이 같은 리듬을 갖는 것은 아닙니다. 무엇을 반복하는지, 요소 사이의 간격이 어떤지, 반복 과정에서 무엇이 변하는지에 따라 화면의 속도감과 긴장감이 달라집니다. 이번 수업에서는 다음 네 용어를 구분해 사용합니다.

반복 화면 분석의 네 가지 용어
용어뜻확인 질문
반복 단위다시 나타나는 최소 요소 또는 명령무엇이 되풀이되는가?
반복같은 단위나 동작을 두 번 이상 다시 사용하는 행위몇 번 되풀이되는가?
패턴반복 단위와 변화가 알아볼 수 있는 규칙으로 조직된 구조다음 요소를 어느 정도 예측할 수 있는가?
리듬요소와 빈 공간이 이어지며 시선의 이동 속도와 강조점을 형성하는 관계시선은 어디에서 빨라지고 멈추는가?

음악의 리듬이 소리와 침묵의 시간적 배열에서 생기듯, 시각적 리듬은 형태와 빈 공간의 배열에서 생깁니다. 간격이 일정하면 안정적이고 예측 가능한 흐름이 만들어집니다. 간격이 점차 좁아지면 시선이 더 빠르게 이동하는 듯한 인상을 줄 수 있습니다. 같은 흐름 안에서 한 요소만 색이나 방향이 달라지면 그 위치가 강조점이 됩니다.

첫째 줄은 같은 크기와 간격의 원, 둘째 줄은 점차 커지는 원, 셋째 줄은 배치 간격이 점차 넓어지는 원으로 구성된 코드 실행 결과 비교도
반복 단위와 색이 같아도 크기와 간격의 규칙이 달라지면 시선의 흐름과 강조점이 달라집니다.

공식 사례의 반복 규칙

아래 구조도는 원작 이미지를 복제한 자료가 아닙니다. 각 작가가 반복 단위와 규칙을 구성하는 방식을 수업용으로 단순화한 개념도입니다. 실제 작품과 정확한 제작 맥락은 각 카드에 연결된 공식 자료에서 확인합니다.

회전한 사각형이 격자에 반복되고 한 칸의 색이 달라지는 규칙 기반 구성의 수업용 개념도
수업용 구조도 · 사각형 → 격자와 미세한 변화 → 규칙의 흔적
RULE / VARIATION

Vera Molnár, 규칙과 변주의 작업 ↗

몰나르는 단순한 기하학적 요소를 체계적으로 반복하고, 제한된 범위의 이동이나 변형을 더해 질서와 어긋남을 함께 탐구했습니다. 코드는 수작업으로 모두 계산하기 어려운 다양한 변형을 시도하는 도구로 사용되었습니다.

입력
사각형, 위치, 회전과 같은 기본 요소
규칙
격자에 반복 배치하고 일부 매개변수를 제한된 범위에서 변경
출력
질서 안의 미세한 차이가 드러나는 이미지
두 색의 원과 빈 공간이 반복되며 오른쪽으로 갈수록 간격이 좁아지는 시각 리듬의 수업용 개념도
수업용 구조도 · 단순 형태 → 간격의 압축 → 움직이는 듯한 지각
INTERVAL / PERCEPTION

Bridget Riley, 반복과 지각의 회화 ↗

라일리의 작업은 단순한 형태와 대비, 간격의 정교한 배열을 통해 정지된 화면이 진동하거나 흐르는 듯한 인상을 줍니다. 빈 공간도 반복 단위만큼 중요한 설계 요소입니다.

입력
선, 원, 대비되는 색과 빈 공간
규칙
형태의 간격과 방향을 일정하게 유지하거나 점진적으로 변경
출력
시선의 속도와 움직임을 유도하는 평면
여러 칸에 수평선, 수직선, 대각선을 정해진 방식으로 조합한 지시문 기반 작업의 수업용 개념도
수업용 구조도 · 선의 방향 → 회전과 겹침 → 체계적으로 변주된 판화
INSTRUCTION / SYSTEM

Sol LeWitt, Untitled from Squares with a Different Line Direction in Each Half Square ↗

이 작품은 1971년에 제작된 열 점의 에칭 포트폴리오 가운데 한 점입니다. 르윗은 단순한 선과 정사각형을 기본 어휘로 삼고, 두 판을 회전하거나 겹쳐 찍는 체계를 통해 여러 구성을 만들었습니다.

입력
두 부분으로 나눈 정사각형과 서로 다른 방향의 선
규칙
두 에칭 판을 회전하고 겹쳐 찍어 구성을 변주
출력
하나의 체계에서 파생된 열 점의 에칭 포트폴리오
개별 사례 분석

선택 사례의 반복 규칙 분석

  1. 반복되는 최소 단위를 한 단어로 기록합니다.
  2. 고정되는 속성과 변하는 속성을 각각 하나씩 기록합니다.
  3. 빈칸에 반복 단위, 간격, 변화하는 속성을 작성해 다음 문장을 완성합니다.

____을/를 ____ 간격으로 반복하고, ____을/를 변화시킨다

사례 분석 문장 예시

라일리 사례는 “단순한 형태를 반복하고, 형태 사이의 간격을 점차 좁힌다”라고 정리할 수 있습니다. 몰나르 사례는 “사각형을 격자에 반복하고, 위치나 회전을 제한된 범위에서 변화시킨다”라고 정리할 수 있습니다. 시각적 인상을 설명할 때에는 그 인상을 형성한 요소와 반복 규칙을 함께 제시합니다.

for의 필요성과 문장 구조

for의 필요성

앞에서 살펴본 작품들은 하나의 규칙을 여러 요소에 적용해 구성을 만듭니다. 코드에서도 매번 명령을 새로 작성하는 대신, 공통으로 수행할 작업을 한 번 정의하고 여러 값에 적용할 수 있습니다. 이때 사용하는 Python 문장이 for입니다.

종이에 같은 도장을 다섯 번 찍는 작업에 비유할 수 있습니다. “첫 위치에 찍는다, 두 번째 위치에 찍는다”처럼 동작을 모두 나열할 수도 있지만, “정해진 다섯 위치마다 같은 도장을 한 번씩 찍는다”라고 규칙을 정할 수도 있습니다. 도장을 찍는 동작과 적용할 위치를 구분하면 위치가 늘어나도 동작을 매번 새로 설명할 필요가 없습니다. for도 대상에서 값을 하나씩 가져와 같은 코드 블록을 실행합니다.

도형을 그리기 전에 숫자 출력으로 두 방식을 비교합니다. 목표는 0부터 4까지의 숫자를 한 줄에 하나씩 출력하는 것입니다.

출력 명령을 다섯 번 작성
출력 명령을 다섯 번 작성
print(0)
print(1)
print(2)
print(3)
print(4)

출력할 값마다 print() 문장을 따로 작성합니다. 값을 추가하려면 출력 명령도 추가해야 합니다.

공통 명령을 한 번 작성
공통 명령을 한 번 작성
for i in range(5):
    print(i)

range(5)에서 값을 하나씩 가져와 같은 print(i) 문장을 실행합니다.

두 코드는 같은 결과를 출력합니다. for 코드에서는 i에 0, 1, 2, 3, 4가 차례대로 저장됩니다. 따라서 print(i)를 코드에 한 번 작성했어도 실제로는 다섯 번 실행하며, 출력 결과도 다섯 줄입니다.

개별 예측
0
1
2
3
4

for를 사용하면 출력할 값이 늘어나거나 모든 값에 적용할 계산이 바뀌어도, 반복할 범위와 공통 명령을 각각 한곳에서 수정할 수 있습니다.

출력 조건별 코드 수정 위치
변경할 조건명령을 직접 작성한 경우for를 사용한 경우
0부터 19까지 출력print(5)부터 print(19)까지 15줄 추가range(5)를 range(20)으로 변경
0부터 4까지 각 값에 10을 곱해 출력다섯 출력 문장에 각각 계산 적용print(i)를 print(i * 10)으로 변경

이처럼 for는 반복할 명령과 값을 구분해 관리하는 데 유용합니다. 다만 위치나 색의 변화는 코드로 직접 정해야 합니다. 도장 비유에서도 찍을 위치를 지정해야 하는 것처럼, 원을 나란히 그리려면 반복 변수로 매번 다른 x좌표를 계산해야 합니다. 이 과정은 뒤의 반복 변수와 시각 요소에서 연결합니다.

개별 예측

코드 작성 횟수와 실행 횟수

  1. range(5)만 range(20)으로 바꾸면, 코드에 작성된 print(i) 문장 수와 실제 실행 횟수는 각각 얼마인지 기록합니다.
  2. 원래의 range(5)를 유지하고 print(i)만 print(i * 10)으로 바꾸면 어떤 값이 출력되는지 예측합니다.
반복 범위와 공통 명령 확인

첫 번째 변경에서는 print(i) 문장은 한 개이고, 실제 실행 횟수는 20번입니다. 출력값은 0부터 19까지입니다. 두 번째 변경에서는 0, 10, 20, 30, 40이 차례대로 출력됩니다. 반복 범위를 변경하면 사용할 값과 실행 횟수가 달라지고, 반복문 안의 명령을 변경하면 각 값에 수행하는 작업이 달라집니다.

for 문장의 다섯 구성 요소

앞의 for i in range(5):는 “범위의 값을 하나씩 반복 변수에 저장하고, 들여쓴 문장을 실행한다”라고 읽습니다. 같은 문장을 구성 요소별로 나누어 확인합니다.

for i in range(5):의 다섯 구성 요소
구성 요소역할말로 읽기
for반복을 시작하는 Python 예약어다음 값을 하나씩 사용하며 반복한다
i반복 변수현재 반복에서 사용할 값을 저장하는 변수
in반복 변수와 값을 가져올 대상을 연결하는 예약어오른쪽 대상에서 값을 하나씩 가져온다
range(5)0부터 4까지의 정수를 차례대로 제공다섯 번 반복할 수 있는 수의 범위
:반복할 코드 블록의 시작 표시이제 아래의 들여쓴 문장이 반복된다

반복 변수 i에는 매번 새로운 값이 저장됩니다. 이 값을 통해 현재 반복 순서를 확인할 수 있습니다. 이 예제에서는 첫 반복에 0, 다음 반복에 1이 저장됩니다. i는 Python이 정한 필수 이름이 아니므로 step이나 circle_number처럼 바꿀 수 있지만, 정수를 순서대로 사용하는 반복문에서는 관례적으로 i를 자주 사용합니다.

콜론과 들여쓰기

for 줄 끝의 콜론 :은 반복할 코드가 아래에 이어진다는 표시입니다. 다음 줄 앞의 들여쓰기는 실제로 반복되는 문장의 범위를 나타냅니다. 따라서 들여쓰기를 변경하면 반복되는 문장의 범위도 달라집니다.

Inside the loop
Inside the loop
for i in range(3):
    print("원", i)

들여쓴 출력 명령은 세 번 실행됩니다.

After the loop
After the loop
for i in range(3):
    print("원", i)
print("완료")

들여쓰기가 없는 마지막 줄은 반복이 끝난 뒤 한 번만 실행됩니다.

들여쓰기의 깊이와 코드 블록

이 수업의 예제는 스페이스 네 칸으로 들여씁니다. 반복문 안에서 같은 코드 블록에 속하는 문장은 같은 깊이로 들여씁니다. Colab이 자동으로 만든 들여쓰기를 유지하고, 탭과 스페이스를 임의로 섞지 않습니다.

실행 횟수의 구분

print("원", i)는 range(3)의 값 0, 1, 2마다 한 번씩 모두 세 번 실행됩니다. print("완료")는 반복문 밖에 있으므로 반복이 끝난 뒤 한 번만 실행됩니다. 화면에는 원 0, 원 1, 원 2, 완료가 순서대로 나타납니다.

Colab 실습 준비

Colab에서 새 노트북을 생성합니다. 이 노트북에서 반복문의 출력 결과와 변수의 변화를 확인한 뒤, 원을 반복해서 그리는 코드를 실행합니다. 코드 셀은 Shift+Enter 또는 셀 왼쪽 ▶ 버튼으로 실행합니다.

반복문 해석의 기본 절차

  1. 코드가 그리거나 출력할 대상과 반복 횟수를 한 문장으로 정리합니다.
  2. 반복 실행할 문장을 찾고, 그 문장에서 반복마다 달라지는 값을 구분합니다.
  3. 반복 변수에 저장될 값을 실행 순서대로 표에 기록합니다.
  4. 첫 반복의 실행 결과를 확인한 뒤, 나머지 값에서도 같은 코드 블록이 실행되는 과정을 추적합니다.
  5. 오류가 발생하면 메시지에서 종류와 위치를 확인한 뒤 콜론과 들여쓰기를 점검합니다.

반복 출력 실행

아래 코드를 새 셀에서 실행해 range(5)가 만드는 값을 확인합니다.

코드 실행

range(5)의 출력

  1. 노트북 제목을 week04-period1-자기이름으로 지정합니다.
  2. 아래 코드를 새 셀에 입력하고 실행합니다.
  3. 출력이 0부터 4까지 다섯 줄인지 확인합니다.
코드 실행
for i in range(5):
    print(i)

0
1
2
3
4

range의 값과 반복 횟수

range()는 정수의 순서를 만듭니다. 가장 중요한 규칙은 끝값을 포함하지 않는다는 점입니다. range(5)를 “0부터 5까지”라고 읽으면 여섯 개로 잘못 셀 수 있습니다. 실제로 사용하는 값은 0, 1, 2, 3, 4입니다.

나무 큐브 네 개가 가로로 나란히 놓이고, 다섯 번째 큐브는 줄에서 떨어져 한쪽에 따로 놓인 모습
range의 끝값 제외 규칙

range(4)는 0, 1, 2, 3의 네 값을 만들고 끝값 4는 사용하지 않습니다. 줄 밖의 큐브는 범위에 적힌 끝값이 실제로 포함되지 않는다는 점을 보여 주는 비유입니다.

range의 주요 사용 형태
코드실제로 사용하는 값반복 횟수읽는 방법
range(5)0, 1, 2, 3, 45회0부터 5 직전까지 1씩 증가
range(2, 7)2, 3, 4, 5, 65회2부터 7 직전까지 1씩 증가
range(0, 10, 2)0, 2, 4, 6, 85회0부터 10 직전까지 2씩 증가
range(4, 0, -1)4, 3, 2, 14회4부터 0 직전까지 1씩 감소

range(시작값, 끝값, 증가값)처럼 최대 세 값을 사용할 수 있습니다. 값을 하나만 지정하면 시작값은 0, 증가값은 1로 정해집니다. 이번 주 실습에서는 먼저 range(개수)를 사용하고, 간격은 좌표 계산식에서 조정합니다. 한 번에 한 조건씩 변경하면 실행 결과가 달라진 원인을 확인하기 쉽습니다.

반복 상태 추적과 코드 실습

먼저 표에서 반복 변수의 값 → 실행되는 문장 → 출력의 관계를 확인합니다. 출력 예측 문제를 푼 뒤에는 아래의 네 가지 기초 실습에서 코드를 직접 작성하고 수정합니다.

for i in range(5)의 실행 추적
실행 차례i의 값실행되는 문장출력
10print(i)0
21print(i)1
32print(i)2
43print(i)3
54print(i)4
종료다음 값 없음들여쓴 문장을 더 실행하지 않음변화 없음
개별 예측

실행 전 출력 예측

개별 예측
for step in range(1, 6):
    print(step * 10)

step에 저장될 값을 순서대로 기록한 뒤, 각 값에 10을 곱한 예상 출력값을 한 줄씩 작성합니다.

출력과 반복 횟수 확인

range(1, 6)은 1, 2, 3, 4, 5를 만들므로 다섯 번 반복합니다. 출력은 10, 20, 30, 40, 50입니다. 지정한 끝값 6은 제외되고, 마지막 값 5까지 사용됩니다.

range의 끝값 규칙

range(1, 5)의 값은 1, 2, 3, 4입니다. 1부터 5까지 사용하려면 끝값을 5보다 1 큰 6으로 지정해 range(1, 6)을 사용합니다. 이 규칙은 다음 교시의 리스트 인덱스와 연결됩니다.

다음 실습은 앞에서 만든 Colab 노트북에서 수행합니다. 실습마다 새 코드 셀을 추가하고, 빈칸 ____은 알맞은 값으로 바꾼 뒤 실행합니다. 각 셀에서 출력 예측 → 코드 작성 → 실행 → 결과 비교를 수행한 뒤 정답을 펼쳐 확인합니다. 그림을 그리기 전 단계이므로 아래 코드는 Pillow 준비 없이 실행할 수 있습니다.

기초 실습 1. 반복 횟수 조정

범위 설정

0부터 5까지의 정수를 한 줄에 하나씩 출력하도록 빈칸을 완성합니다. 실행 전에 출력 줄 수와 마지막 값을 기록합니다.

범위 설정
for i in range(____):
    print(i)

  1. 코드를 실행해 여섯 줄이 출력되는지 확인합니다.
  2. 같은 셀에서 0부터 7까지 출력하도록 반복 범위만 수정하고 다시 실행합니다.
  3. 범위에 적은 수, 마지막 출력값, 출력 줄 수의 관계를 한 문장으로 기록합니다.
실습 1. 코드와 반복 횟수 확인
코드 예시 · 본문의 실행 순서와 함께 확인
for i in range(6):
    print(i)

0
1
2
3
4
5

range(6)은 0부터 5까지 제공하므로 여섯 번 출력합니다. 두 번째 조건에서는 range(8)을 사용하며, 마지막 값은 7이고 출력은 여덟 줄입니다. range(n)의 마지막 값은 n - 1, 반복 횟수는 n입니다. 이 실습처럼 n이 양의 정수인 경우에 적용합니다.

기초 실습 2. 시작값과 증가값 조정

값의 간격

시작값 2, 끝값 12를 유지하면서 2, 4, 6, 8, 10을 순서대로 출력하도록 증가값을 작성합니다. range()의 세 번째 값은 다음 정수로 이동할 때 더하는 값입니다.

값의 간격
for step in range(2, 12, ____):
    print(step)

  1. 출력이 다섯 줄이고, 끝값 12가 포함되지 않는지 확인합니다.
  2. 시작값과 끝값을 유지한 채 증가값만 3으로 변경하고, 출력값과 줄 수를 예측한 뒤 실행합니다.
  3. 다음에는 시작값만 1로 변경해 다시 실행합니다. 변경 전후의 첫 값과 마지막 값을 비교합니다.
실습 2. 설정별 출력 비교
코드 예시 · 본문의 실행 순서와 함께 확인
for step in range(2, 12, 2):
    print(step)

시작값·증가값 변경과 반복 횟수
설정출력 순서출력 줄 수
range(2, 12, 2)2, 4, 6, 8, 105줄
range(2, 12, 3)2, 5, 8, 114줄
range(1, 12, 3)1, 4, 7, 104줄

시작값은 첫 출력값, 증가값은 인접한 출력값의 차이를 정합니다. 세 설정 모두 끝값 12에 도달하거나 이를 넘기기 전에 반복을 마칩니다. 시작값과 증가값을 지정한 경우에는 끝값만 보고 반복 횟수를 판단하지 않고 실제 값의 순서를 확인합니다.

기초 실습 3. 반복 변수와 계산 결과 출력

변수의 역할 구분

다섯 번 반복하면서 20에서 시작해 15씩 증가하는 값을 계산합니다. 왼쪽에는 반복 변수 i, 오른쪽에는 계산한 value가 출력되도록 빈칸을 완성합니다. print(i, value)는 두 값을 한 줄에 공백으로 구분해 출력합니다.

변수의 역할 구분
for i in range(5):
    value = 20 + i * ____
    print(i, value)

  1. i가 0, 1, 4일 때의 value를 계산한 뒤 코드를 실행합니다.
  2. i는 1씩, value는 15씩 증가하는지 비교합니다.
  3. 반복 범위는 유지하면서 마지막 value가 100이 되도록 계산식의 증가량을 수정합니다.
실습 3. 두 변수의 출력 확인
코드 예시 · 본문의 실행 순서와 함께 확인
for i in range(5):
    value = 20 + i * 15
    print(i, value)

0 20
1 35
2 50
3 65
4 80

마지막 반복에서 i는 4이므로 20 + 4 * 15 = 80입니다. 마지막 value를 100으로 만들려면 증가량을 20으로 변경합니다. 이때 value는 20, 40, 60, 80, 100이고, i의 범위와 반복 횟수는 그대로입니다. 뒤의 원 배치 코드에서는 이처럼 계산한 값을 x좌표로 사용합니다.

기초 실습 4. 들여쓰기와 출력 순서 수정

실행 결과의 오류 수정

아래 코드는 실행되지만 완료가 반복할 때마다 출력됩니다. 먼저 실행해 출력 순서를 확인한 뒤, 처리 결과 세 줄과 마지막 완료 문장 한 줄만 출력되도록 들여쓰기를 수정합니다. 반복 범위와 출력 문장의 내용은 유지합니다.

실행 결과의 오류 수정
for i in range(3):
    print("처리", i)
    print("완료")

  1. 수정 전 완료의 출력 횟수와 전체 출력 줄 수를 기록합니다.
  2. print("완료")의 들여쓰기를 수정한 뒤 셀 전체를 다시 실행합니다.
  3. 어느 문장이 반복문 안에 있고 어느 문장이 밖에 있는지 한 문장으로 설명합니다.
실습 4. 수정 코드와 실행 범위 확인
코드 예시 · 본문의 실행 순서와 함께 확인
for i in range(3):
    print("처리", i)
print("완료")

처리 0
처리 1
처리 2
완료

수정 전에는 처리 문장과 완료 문장이 각각 세 번 실행되어 총 여섯 줄이 출력됩니다. 수정 후에는 처리 문장은 세 번, 완료 문장은 반복 종료 후 한 번 실행되어 총 네 줄이 출력됩니다. 들여쓰기는 코드의 정렬뿐 아니라 반복 실행할 문장의 범위를 결정합니다.

기초 실습 완료 기준

네 실습의 실행 결과를 남기고, 각 셀 아래에 수정한 부분과 출력이 달라진 이유를 한 문장으로 기록합니다. 다음 절에서는 시작값 + 반복 변수 × 증가량의 계산 결과를 원의 x좌표에 연결합니다.

반복 변수와 시각 요소

이제 처음에 작성한 수동 반복을 반복문으로 바꿉니다. 원 다섯 개의 위치, 크기, 색은 그대로 유지합니다. 먼저 왼쪽 x좌표 80, 190, 300, 410, 520에서 공통 규칙을 찾습니다.

좌표의 배치 규칙 도출

  1. 시작 위치 확인: 첫 원의 왼쪽 x좌표는 80입니다.
  2. 차이 계산: 190 - 80, 300 - 190, 410 - 300, 520 - 410은 모두 110입니다.
  3. 이동 횟수 확인: 첫 위치에서는 아직 이동하지 않았으므로 0번, 두 번째 위치에서는 1번, 다섯 번째 위치에서는 4번 이동한 것으로 볼 수 있습니다.
  4. 식으로 정리: 현재 위치 = 시작 위치 + 이동 횟수 × 배치 간격입니다. range(5)의 i가 0부터 4까지 변하므로 이동 횟수로 사용할 수 있습니다.

반복 변수와 배치 간격의 곱셈 원리

세 번째 원의 왼쪽 x좌표는 시작 위치에 110을 두 번 더한 값입니다. 80 + 110 + 110을 80 + 2 * 110으로 줄여 적을 수 있습니다. 같은 관계를 모든 반복에 적용한 식이 x = 80 + i * 110입니다. i는 현재 원의 순서를 나타내고, 이 순서에 배치 간격을 곱하면 시작 위치로부터의 이동 거리를 계산할 수 있습니다.

코드 실행
for i in range(5):
    x = 80 + i * 110
    draw.ellipse((x, 220, x + 70, 290), fill=(42, 104, 124))

반복할 때마다 새로운 x좌표를 계산하고, 그 위치에 원을 하나씩 새로 그립니다. 첫 반복에서 i = 0이므로 x는 80입니다. 다음 반복에서 i = 1이므로 x는 190입니다. 다섯 번의 반복은 수동 반복과 같은 출력을 만듭니다.

반복 변수와 원의 위치 계산
ii * 110x = 80 + i * 110원 경계의 x 범위
008080~150
1110190190~260
2220300300~370
3330410410~480
4440520520~590

원 여섯 개의 배열 확장

다음 예제부터는 range(5)를 range(6)으로 바꾸어 원을 하나 추가합니다. 시작 위치도 80에서 100으로 변경합니다. x좌표는 100, 210, 320, 430, 540, 650이 됩니다. 원의 크기, y좌표, 색은 유지하며, 이 설정을 2교시에서도 사용합니다.

개수, 시작 위치, 배치 간격

한 줄 배열의 세 가지 조정값
변경할 값코드의 위치다른 값을 유지했을 때의 결과
개수range(6)의 64로 바꾸면 처음 네 위치에만 원을 그림
시작 위치x = 100 + i * 110의 100140으로 바꾸면 모든 원이 오른쪽으로 40만큼 이동
배치 간격x = 100 + i * 110의 11090으로 바꾸면 첫 원은 그대로이고 나머지 원이 더 가까워짐

개수는 반복 횟수, 시작 위치는 배열 전체의 위치, 배치 간격은 이웃한 원 사이의 거리를 결정합니다. 한 번에 한 값만 바꾸면 어떤 수정이 어떤 결과를 만드는지 구분할 수 있습니다.

시작 위치와 배치 간격의 계산 비교

i = 3일 때 기준 좌표는 100 + 3 * 110 = 430입니다. 시작 위치만 140으로 바꾸면 470, 배치 간격만 90으로 바꾸면 370입니다. 곱셈을 먼저 계산한 뒤 덧셈을 합니다. 첫 원은 i = 0이므로 배치 간격을 바꾸어도 x좌표가 100으로 유지됩니다.

원의 반복 배치

같은 노트북에 새 셀을 추가해 반복문으로 원을 그립니다. Image.new()로 이미지를 만들고 ImageDraw.Draw()로 그리기를 준비한 다음, 반복문 안에서 원을 그립니다. 셀의 마지막 image는 완성된 이미지를 표시합니다.

코드 실행

원 여섯 개의 가로 배열

  1. 같은 노트북의 새 코드 셀에 아래 코드를 입력합니다.
  2. Shift+Enter 또는 셀 왼쪽 ▶ 버튼으로 실행합니다.
  3. 연한 배경 위에 청록색 원 여섯 개가 가로로 배치되는지 확인합니다.
코드 실행
from PIL import Image, ImageDraw

canvas_width = 800
canvas_height = 400
background_color = (244, 239, 229)
fill_color = (42, 104, 124)

image = Image.new("RGB", (canvas_width, canvas_height), background_color)
draw = ImageDraw.Draw(image)

for i in range(6):
    x = 100 + i * 110
    draw.ellipse((x, 220, x + 70, 290), fill=fill_color)

image

실습 점검

  • SyntaxError가 발생하면 for 줄 끝의 콜론을 확인합니다.
  • IndentationError가 발생하면 x = ...와 draw.ellipse(...)가 같은 깊이인지 확인합니다.
  • 원이 하나만 보이면 좌표 계산, 도형 명령의 들여쓰기, 이미지 생성 위치를 순서대로 확인합니다. 아래 오류 비교에서 세 원인을 구분합니다.

반복 실행과 도형 누적

코드는 이미지 생성 → i에 값 저장 → x 계산 → 원 그리기 순서로 실행됩니다. 원을 그린 뒤에는 i에 다음 값을 저장하고 좌표 계산과 그리기를 반복합니다. 이미지 생성은 반복문 밖에 있으므로 한 번만 실행됩니다.

기준 코드의 첫 반복, 두 번째 반복, 마지막 반복 추적
실행 단계현재 실행하는 코드변수의 상태이미지에 남은 원
반복 전Image.new(...)아직 좌표를 계산하지 않음0개
첫 좌표 계산x = 100 + i * 110i = 0, x = 1000개: 계산만으로는 원이 생기지 않음
첫 원 그리기draw.ellipse(...)i = 0, x = 1001개
두 번째 좌표 계산x = 100 + i * 110i = 1, x = 2101개: 앞서 그린 원은 그대로 유지
두 번째 원 그리기draw.ellipse(...)i = 1, x = 2102개
세 번째~다섯 번째좌표 계산과 그리기를 반복i = 2, 3, 4차례로 3개, 4개, 5개
마지막 원 그리기draw.ellipse(...)i = 5, x = 6506개
반복 종료 후image더 이상 좌표를 계산하지 않음완성된 원 여섯 개를 표시
위에서부터 첫 반복 후 원 한 개, 두 번째 반복 후 원 두 개, 여섯 번째 반복 후 원 여섯 개가 같은 이미지에 누적된 상태
위에서부터 첫 번째, 두 번째, 여섯 번째 그리기가 끝난 상태입니다. 실행 과정을 나누어 보여 주는 비교도이며, 기준 셀은 마지막에 완성된 이미지 한 장을 표시합니다.

변수 값의 변경과 이미지의 누적

x에는 매번 새 좌표가 저장되지만, 앞서 이미지에 기록한 픽셀은 지워지지 않습니다. 따라서 원 하나가 이동하는 애니메이션이 아니라 원 여섯 개가 쌓인 한 장의 이미지가 됩니다. 새 이미지에 처음부터 다시 그리려면 Image.new()가 포함된 전체 셀을 다시 실행합니다.

조건별 반복문 수정

기준 코드 셀은 남겨 두고 복제본에서 연습합니다. 각 단계에서 좌표 예측 → 코드 수정 → 전체 셀 실행 → 결과 비교를 수행합니다. 아래 코드 조각은 복제한 셀의 for 줄부터 도형 명령까지를 교체하는 데 사용합니다.

1단계 · 빈칸 완성

원 네 개의 배열: 배치 간격 120

시작 x좌표는 100, 원의 지름은 70입니다. 왼쪽 x좌표 사이의 배치 간격을 120으로 정합니다. ____ 세 곳을 숫자로 바꾼 뒤 실행합니다.

실행 전 네 원의 x좌표와 마지막 원의 오른쪽 좌표를 기록합니다. 실행 후 개수와 간격이 예측과 일치하는지 확인합니다.

1단계 · 빈칸 완성
for i in range(____):
    x = ____ + i * ____
    draw.ellipse((x, 220, x + 70, 290), fill=fill_color)

1단계 코드와 예상 결과 확인
코드 예시 · 본문의 실행 순서와 함께 확인
for i in range(4):
    x = 100 + i * 120
    draw.ellipse((x, 220, x + 70, 290), fill=fill_color)

x좌표는 100, 220, 340, 460입니다. 마지막 원의 오른쪽 좌표는 460 + 70 = 530으로 캔버스 안에 있습니다. 개수는 range()의 값으로, 간격은 x좌표 계산식의 값으로 지정합니다.

2단계 · 조건에 맞게 수정

원 개수 유지와 빈 공간 조정

1단계 코드에서 원의 개수 4와 지름 70은 유지합니다. 첫 원의 왼쪽 x좌표를 60으로 변경하고, 인접한 원의 경계 사이 거리가 30이 되도록 배치합니다. 바꿔야 하는 두 값을 직접 찾아 수정합니다.

배치 간격은 원 지름 + 경계 사이 거리입니다. 왼쪽 x좌표 사이 거리와 원 사이의 빈 공간을 구분해 계산합니다.

2단계 수정 근거 확인
코드 예시 · 본문의 실행 순서와 함께 확인
for i in range(4):
    x = 60 + i * 100
    draw.ellipse((x, 220, x + 70, 290), fill=fill_color)

배치 간격은 70 + 30 = 100입니다. x좌표는 60, 160, 260, 360이며, 첫 두 원의 경계 사이 거리는 160 - (60 + 70) = 30입니다. 이 수치는 좌표 사이의 거리로, 색칠되지 않은 픽셀의 개수를 세는 것과는 구분합니다.

3단계 · 다른 방향에 적용

가로·세로 배열 전환

새 복제본에서 지름 50인 원 네 개를 세로로 배치합니다. 왼쪽 x좌표는 100으로 고정하고, 위쪽 y좌표는 40에서 시작해 80씩 증가시킵니다. i와 연결할 좌표를 직접 선택해 반복문을 작성합니다.

실행 전에 마지막 원의 아래쪽 경계 좌표를 계산해 높이 400인 이미지 범위에 포함되는지 확인합니다. 원이 가로나 세로로 늘어나 보인다면 경계 상자의 너비와 높이에 같은 값을 적용했는지 점검합니다.

3단계 코드와 가로 배열의 차이 확인
코드 예시 · 본문의 실행 순서와 함께 확인
for i in range(4):
    y = 40 + i * 80
    draw.ellipse((100, y, 150, y + 50), fill=fill_color)

y좌표는 40, 120, 200, 280입니다. 마지막 원의 아래쪽은 280 + 50 = 330으로 이미지 안에 있습니다. 반복 횟수는 같지만 i를 y좌표에 연결했으므로 세로 배열이 됩니다.

크기·간격 변화와 시각적 리듬

원 여섯 개를 그리는 기준 코드를 다시 사용합니다. 반복 횟수는 여섯 번, 색은 한 가지로 고정하고 원의 크기를 변경합니다. 먼저 첫 번째부터 세 번째 원까지의 크기를 계산하고 예상 배열을 스케치한 뒤, 실행 결과와 비교합니다.

기준 코드 셀을 복제하고 for 줄부터 도형을 그리는 줄까지를 아래 코드로 교체합니다. 셀을 처음부터 실행하면 이미지가 새로 생성되므로 이전 그림과 겹치지 않습니다. 간격이 점차 넓어지는 계산은 뒤의 선택 확장에서 다룹니다.

왼쪽 위 위치 고정과 크기 변경

사례의 관찰 기준 적용
for i in range(6):
    x = 100 + i * 110
    size = 30 + i * 10
    draw.ellipse((x, 220, x + size, 220 + size), fill=fill_color)

왼쪽 위 위치는 기준과 같고, 지름은 30, 40, 50, 60, 70, 80으로 커집니다. 크기 계산에 사용한 size를 오른쪽 x좌표와 아래쪽 y좌표에 모두 적용합니다.

배치 간격, 빈 공간, 중심의 차이

왼쪽 x좌표 사이 거리가 같아도 원 사이의 빈 공간은 달라질 수 있습니다. 크기 변화 코드의 첫 원은 x = 100에서 시작해 130에서 끝납니다. 다음 원은 210에서 시작하므로 경계 사이 거리는 210 - 130 = 80입니다. 두 번째 원은 지름이 40이므로 다음 원까지의 거리가 70으로 줄어듭니다.

왼쪽 위 위치 고정과 원 크기 증가 결과
원왼쪽 x좌표지름중심 좌표다음 원까지 경계 사이 거리
첫 번째10030(115, 235)80
두 번째21040(230, 240)70
세 번째32050(345, 245)60
네 번째43060(460, 250)50
다섯 번째54070(575, 255)40
여섯 번째65080(690, 260)다음 원 없음

중심은 (x + size / 2, 220 + size / 2)입니다. 왼쪽 위 위치를 유지한 채 크기를 키우면 중심은 오른쪽 아래로 이동하고, 원 사이의 빈 공간은 줄어듭니다. 여기서 빈 공간의 수치는 이웃한 경계 상자 사이의 가로 거리입니다. 원 둘레 사이의 최단 거리를 계산한 값은 아닙니다.

윗줄은 왼쪽 위 위치를 유지하여 중심이 점차 아래로 이동하는 원, 아랫줄은 중심 높이를 255로 고정하여 수평으로 정렬된 크기 변화 배열
위쪽 배열은 각 원의 왼쪽 위 위치를 유지하고, 아래쪽 배열은 기준 배열의 각 원 중심을 유지한 채 크기를 변경한 결과입니다. 두 줄 모두 지름은 30, 40, 50, 60, 70, 80이며 같은 비율로 표시했습니다.
비교 코드: 원 중심 고정과 크기 변경

기준 배열의 첫 원 중심은 (135, 255)입니다. 각 원의 기준 중심 위치를 유지하고 반지름만 변경하려면, 중심 좌표에서 반지름을 빼고 더해 경계 상자를 정합니다. 새 복제본의 반복문을 아래 코드로 교체합니다.

기준 배열의 첫 원 중심은 (135, 255) 입니다. 각 원의 기준 중심 위치를 유지하고 반지름만 변경하려면, 중심 좌표에서 반지름을 빼고 더해 경계 상자 를 정합니다. 새 복제
for i in range(6):
    center_x = 135 + i * 110
    center_y = 255
    size = 30 + i * 10
    radius = size / 2
    draw.ellipse((center_x - radius, center_y - radius,
                  center_x + radius, center_y + radius), fill=fill_color)

중심 y좌표는 모두 255이고, 중심 x좌표 사이 거리는 110입니다. 크기가 커지면 경계가 중심의 양쪽으로 확장됩니다. 무엇을 고정할지에 따라 크기 변화의 정렬 방식도 달라집니다.

시각적 인상과 코드 규칙의 관계

시각적 인상을 설명할 때에는 관찰한 위치와 그 차이를 만든 수치를 함께 기록합니다. 시선의 이동은 사람마다 다를 수 있으므로, 자신의 해석을 뒷받침할 근거를 화면과 코드에서 찾아 제시합니다.

크기 변화 배열의 세 가지 분석 기준
관찰 기준기록할 내용코드와 연결하는 예
강조점처음 눈에 들어온 원과 그 이유지름이 80으로 가장 큰 오른쪽 원에 먼저 시선이 향함
밀도더 조밀해 보이는 위치오른쪽으로 갈수록 경계 사이 거리가 80에서 40으로 줄어듦
정렬과 방향중심을 이은 선의 방향중심 y좌표가 235에서 260으로 증가하여 아래쪽으로 기울어짐
사례의 관찰 기준 적용

리듬 비교와 다음 실습 준비

앞의 라일리 사례에서 살펴본 형태와 빈 공간의 관계를 자신의 원 배열에 적용합니다. 작품을 재현하는 활동이 아니라, 관찰 기준을 코드 수정에 사용하는 활동입니다. 3교시 제출에서는 배치 간격을 고정하고 색과 크기를 변경합니다.

  1. 크기 변화 코드의 size = 30 + i * 10에서 증가량 10을 4로 바꾼 복제본을 만듭니다.
  2. 마지막 원의 지름과 마지막 두 원의 경계 사이 거리를 예측한 뒤 실행합니다. 증가량 10인 결과와 강조점·밀도를 비교합니다.
  3. “증가량을 ____로 정했다. 오른쪽의 ____이/가 ____하므로 ____한 흐름을 의도했다.”를 완성합니다. 설계 근거에 계산한 수치를 하나 이상 포함합니다.
  4. 3교시에 사용할 크기 증가량 size_step을 4~10에서 선택해 기록합니다. 배치 간격은 유지하고, 색상 변경은 2교시에서 리스트를 배운 뒤 준비합니다.
증가량 4와 10의 비교 근거

증가량이 4이면 마지막 원의 지름은 30 + 5 * 4 = 50입니다. 다섯 번째 원의 지름이 46이므로 마지막 두 원의 경계 사이 거리는 650 - (540 + 46) = 64입니다. 증가량이 10일 때의 지름 80, 경계 사이 거리 40과 비교하면 크기 차이가 작고 오른쪽 빈 공간이 더 넓습니다.

핵심 정리

반복문은 같은 명령을 여러 번 작성하는 작업을 줄이고, 반복 횟수와 시각 매개변수의 관계를 명시하는 도구입니다.

단일 원 출력의 세 가지 원인

오류 메시지가 없어도 의도한 그림이 생성되지 않을 수 있습니다. 아래 코드는 모두 실행되지만 원 여섯 개의 배열을 만들지 못합니다. 먼저 도형 명령의 실행 횟수와 마지막 이미지에 남을 위치를 예측한 뒤, 세 원인을 비교합니다.

각 예제는 별도의 기준 코드 복제본에서 실행합니다. image = Image.new(...)부터 셀 끝의 image까지를 해당 코드로 교체합니다. 위쪽의 import와 색·캔버스 변수는 유지합니다.

A. 고정 좌표의 반복

예측 · 실행 · 수정
image = Image.new("RGB", (canvas_width, canvas_height), background_color)
draw = ImageDraw.Draw(image)

for i in range(6):
    x = 100
    draw.ellipse((x, 220, x + 70, 290), fill=fill_color)

image

B. 반복문 밖의 도형 명령

예측 · 실행 · 수정
image = Image.new("RGB", (canvas_width, canvas_height), background_color)
draw = ImageDraw.Draw(image)

for i in range(6):
    x = 100 + i * 110
draw.ellipse((x, 220, x + 70, 290), fill=fill_color)

image

C. 반복문 안의 이미지 재생성

예측 · 실행 · 수정
for i in range(6):
    image = Image.new("RGB", (canvas_width, canvas_height), background_color)
    draw = ImageDraw.Draw(image)
    x = 100 + i * 110
    draw.ellipse((x, 220, x + 70, 290), fill=fill_color)

image

예측 · 실행 · 수정

동일한 출력 결과의 원인 비교

  1. A, B, C 각각에서 draw.ellipse()가 몇 번 실행되는지와 마지막에 보일 원의 x좌표를 기록합니다.
  2. 세 예제를 실행하고 예측과 비교합니다. 그림만으로 B와 C를 구분할 수 있는지도 판단합니다.
  3. 각 코드에서 문제의 원인을 찾아 수정하고, 전체 셀을 다시 실행해 원 여섯 개가 보이는지 확인합니다.
세 오류의 실행 횟수와 수정 위치 확인
단일 원 출력 과정의 차이
예제도형 명령 실행마지막 이미지수정 방법
A6번x = 100에 원 하나가 겹쳐 보임x = 100 + i * 110으로 변경
B1번x = 650에 원 하나draw.ellipse()를 x 계산과 같은 깊이로 들여쓰기
C6번마지막에 만든 이미지의 x = 650에 원 하나이미지 생성과 그리기 준비 두 줄을 반복문 앞으로 이동

B에서는 좌표 계산만 반복하고, 마지막 x값으로 원을 한 번 그립니다. C에서는 매번 새로운 이미지에 원 하나를 그리고 image가 가리키는 마지막 이미지만 표시합니다. B와 C의 최종 그림은 같아도 실행 과정은 다릅니다. 도형 명령이 반복문 안에 있는지, 같은 이미지에 계속 그리는지를 함께 확인해야 합니다.

학습 내용 점검

반복문의 값, 코드 블록의 경계, 좌표 계산을 함께 확인합니다.

핵심 개념 점검

  • 반복 단위, 패턴, 리듬의 개념 구분
  • for로 반복 범위와 공통 명령을 구분해 관리하는 이유 설명
  • range()의 끝값 제외 규칙
  • 콜론과 들여쓰기가 만드는 코드 블록
  • 시작 위치, 개수, 배치 간격을 바꾸는 코드 위치 구분
  • 반복 변수와 이미지에 남는 도형의 상태 구분
  • 조건에 맞춘 가로·세로 배열과 예측 결과 확인
개별 점검

오늘의 원리

  1. range(4)가 제공하는 값을 순서대로 기록합니다.
  2. 반복문에서 콜론과 들여쓰기의 역할을 각각 한 문장으로 설명합니다.
  3. x = 60 + i * 80에서 i가 0, 1, 2일 때의 x좌표를 계산해 기록합니다.
정답 확인

range(4)는 0, 1, 2, 3을 만듭니다. 콜론은 아래에 코드 블록이 시작됨을 표시하고, 들여쓰기는 실제로 반복할 문장의 범위를 나타냅니다. x좌표는 60, 140, 220입니다.

반복문의 주요 문제와 점검 항목
보이는 문제가능한 원인먼저 확인할 위치
SyntaxErrorfor 줄 끝의 콜론이 없음range(...):의 마지막 문자
IndentationError반복할 문장이 들여쓰기되지 않았거나 깊이가 섞임for 바로 다음 줄의 앞쪽 공백
원 하나만 보임고정 좌표, 반복문 밖 도형 명령, 반복문 안 이미지 생성좌표 계산 → 들여쓰기 → 이미지 생성 위치
원 일부가 잘림원의 경계가 캔버스 범위를 벗어남800 × 400 이미지에서는 경계 좌표가 x 0~799, y 0~399 안에 있는지 확인

학습 범위

이번 교시의 핵심은 한 줄의 배열을 만드는 반복문과 시각 매개변수의 관계를 이해하는 것입니다. 여러 색을 순서대로 사용하고 가로·세로를 함께 반복하는 격자는 다음 교시의 학습 내용입니다.

완료 기준

노트북 기록 항목

  • 코드와 출력: 기준 배열 셀, 조건을 수정한 가로 배열 셀, 세로 배열 셀을 구분해 남깁니다.
  • 예측과 검증: 수정한 배열의 첫 위치·마지막 위치·도형 개수를 계산하고 실행 결과와 비교합니다.
  • 설계 근거: 크기 증가량과 빈 공간의 관계를 숫자가 포함된 문장으로 설명합니다.
  • 오류 설명: A, B, C 중 하나를 선택해 원 하나만 보였던 이유와 코드에서 수정한 부분을 설명합니다.

실행 결과와 코드의 수정 이유를 함께 설명할 수 있으면 완료입니다. 예측과 결과가 달랐다면 원인을 수정한 뒤 달라진 점을 한 문장으로 기록합니다.

수업 후 개별 복습

수업 중 풀지 못한 문항은 표시해 두었다가 수업 후 복습합니다. 먼저 답을 작성한 뒤 정답을 펼쳐 확인합니다. 각 답에는 결과만 쓰지 말고 range()의 실제 값이나 좌표 계산을 함께 기록합니다.

1. range(3, 8)의 값과 반복 횟수

3, 4, 5, 6, 7을 만들고 다섯 번 반복합니다. 끝값 8은 포함하지 않습니다.

2. 동일 좌표의 원 반복(6회)과 표시 개수

명령은 여섯 번 실행되지만 같은 색과 크기의 원이 정확히 겹치면 화면에는 원 하나처럼 보입니다. 반복 횟수와 시각적으로 구분되는 도형의 수는 항상 같지 않습니다.

3. 간격 축소(90 → 60)와 리듬 변화

원 중심 사이의 거리가 줄어 화면이 더 조밀해집니다. 같은 캔버스에 더 많은 요소를 배치할 수 있지만, 원의 크기가 그대로라면 서로 겹칠 가능성도 커집니다.

4. for 문장과 반복 코드 블록의 역할

“range()에서 값을 하나씩 가져와 반복 변수에 저장한다. 각 값에 대해 들여쓴 도형 명령을 실행한다”라고 설명할 수 있습니다.

선택 확장: 배치 간격의 점진적 증가

기본 실습을 마친 뒤 선택적으로 수행합니다. 여기서는 일정한 배치 간격에 점점 커지는 추가 이동량을 더합니다. 이번 교시의 완료 기준이나 3교시 제출에 필요한 계산은 아닙니다.

원 여섯 개의 기준 코드 셀을 복제하고 반복문을 아래 코드로 교체합니다. 먼저 표에서 x좌표의 차이가 어떻게 변하는지 확인한 뒤 전체 셀을 실행합니다.

선택 확장 점검
for i in range(6):
    x = 100 + i * 80 + i * i * 5
    draw.ellipse((x, 220, x + 70, 290), fill=fill_color)

기본 이동량과 추가 이동량의 좌표 합산
i기본 위치
100 + i * 80
추가 이동량
i * i * 5
최종 x직전 x와의 차이
01000100첫 위치
1180518585
22602028095
334045385105
442080500115
5500125625125

i * i * 5의 값은 0, 5, 20, 45, 80, 125입니다. 추가 이동량의 차이가 5, 15, 25, 35, 45로 커지므로 기본 간격 80에 더해지는 값도 커집니다. 그 결과 배치 간격이 85, 95, 105, 115, 125로 증가합니다. 원의 지름은 70으로 유지하므로 빈 공간도 오른쪽으로 갈수록 넓어집니다.

위에서부터 일정한 크기와 간격의 기준 배열, 오른쪽으로 커지는 배열, 오른쪽으로 간격이 넓어지는 배열의 실행 결과
위에서부터 기준 코드, 크기 변화 코드, 선택 확장 코드의 실행 결과입니다. 같은 비율로 표시한 세 배열에서 원의 크기와 빈 공간의 변화 방향을 비교합니다.
선택 확장 점검

빈 공간의 변화 방향 비교

크기 변화 배열과 간격 변화 배열에서 오른쪽 빈 공간이 좁아지는지 넓어지는지 비교합니다. 각 배열의 마지막 두 원 사이 거리를 계산해 설명에 포함합니다.

두 배열의 마지막 빈 공간 확인

크기 변화 배열은 650 - (540 + 70) = 40, 간격 변화 배열은 625 - (500 + 70) = 55입니다. 전체 흐름에서는 전자의 빈 공간이 80에서 40으로 좁아지고, 후자의 빈 공간은 15에서 55로 넓어집니다.

2교시 학습 내용

한 줄의 원 배열은 반복 변수 하나로 구성했습니다. 여러 색을 순서대로 사용하고 가로와 세로 방향을 함께 반복하려면 값의 묶음과 두 겹의 반복 구조가 필요합니다. 다음 교시에는 리스트로 색을 모으고, 중첩 반복으로 격자를 만듭니다.

2교시에서는 원 반복 그리기의 기준 코드를 복습한 뒤, 색상 리스트의 항목을 순서대로 사용하는 반복문을 작성합니다.

참고 자료

이 페이지의 목차