반복문과 시각적 리듬
- 핵심 개념
- 반복, 패턴, 리듬
- 이전 학습
- 좌표, RGB, 도형
- 확인 방법
- for, range(), 좌표 계산
- 다음 학습
- 리스트와 격자
학습 목표
- 반복 단위, 간격, 변화의 관계로 패턴과 시각적 리듬 설명
- 같은 명령을 여러 번 작성하는 방식과 비교해 for를 사용하는 이유 설명
for i in range(...):의 다섯 구성 요소와 콜론·들여쓰기의 역할 구분range()가 만드는 정수 순서와 반복 횟수 예측 및 출력 검증- 좌표의 차이에서 배치 규칙을 도출하고 반복 변수
i에 연결 - 코드 구조를 바탕으로 반복문 오류의 원인 설명
- Colab에서 원의 개수와 배치 방향을 수정하고 실행 결과 설명
학습 내용
- 반복 규칙
수동 반복과 반복문의 구조 비교
- 반복과 리듬
반복 단위, 간격, 변화의 관계
- 공식 사례
규칙 기반 반복의 입력·규칙·출력
- for 문장
for를 사용하는 이유, 다섯 구성 요소와 들여쓰기
- range 추적
값의 순서와 반복 횟수 계산
- 시각 매개변수
위치, 크기, 간격과 반복 변수의 연결
도형 반복과 배치 규칙
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))이처럼 같은 명령을 여러 줄 작성하는 방식을 수동 반복이라고 합니다. 반복문으로도 같은 출력, 즉 원 다섯 개의 배열을 만들 수 있습니다. 다만 수동 반복에서는 원을 스무 개로 늘리거나 간격을 변경할 때 여러 줄의 좌표를 다시 계산해야 합니다. 이 과정에서 좌표를 잘못 입력하면 일부 원이 배치 규칙에서 벗어납니다. 반복문은 반복되는 구조와 달라지는 값을 분리해 기록하는 방법입니다.
5 commands
각 도형의 좌표를 직접 작성합니다. 도형이 적을 때는 각 위치를 확인하기 쉽지만, 개수가 늘수록 수정할 좌표도 많아집니다.
1 rule × 5
반복할 명령은 한 번 작성하고, 위치 계산식과 반복 횟수를 구분해 지정합니다. 개수와 간격을 한곳에서 조정할 수 있습니다.
같은 스탬프로 원을 다섯 번 찍으면 형태는 같고 위치만 달라집니다. 반복문도 도형 명령을 한 번 작성하고, 위치처럼 반복마다 달라지는 값을 계산합니다. 스탬프는 이 관계를 설명하는 비유이며, 실제 코드는 숫자를 계산해 픽셀을 기록합니다.
공통 요소와 변화 요소
위의 수동 반복 코드에서 모든 줄에 공통으로 사용된 부분에 밑줄을 긋고, 매번 달라지는 왼쪽·오른쪽 x좌표 두 개에 원을 그려 표시합니다. 각 x좌표가 다음 반복에서 얼마나 증가하는지도 계산합니다.
관찰 결과 확인
draw.ellipse, y좌표 220과 290, 색상 값은 같습니다. 왼쪽과 오른쪽 x좌표는 매번 110씩 증가합니다. 따라서 “같은 크기와 색의 원을 왼쪽 x좌표가 110씩 증가하는 위치에 다섯 번 그린다”라는 규칙으로 정리할 수 있습니다. 여기서 배치 간격 110은 인접한 두 원의 왼쪽 x좌표 사이 거리입니다. 원 경계 사이의 빈 공간과 구분합니다.
반복, 패턴, 리듬
반복되는 요소가 있다고 해서 모든 화면이 같은 리듬을 갖는 것은 아닙니다. 무엇을 반복하는지, 요소 사이의 간격이 어떤지, 반복 과정에서 무엇이 변하는지에 따라 화면의 속도감과 긴장감이 달라집니다. 이번 수업에서는 다음 네 용어를 구분해 사용합니다.
| 용어 | 뜻 | 확인 질문 |
|---|---|---|
| 반복 단위 | 다시 나타나는 최소 요소 또는 명령 | 무엇이 되풀이되는가? |
| 반복 | 같은 단위나 동작을 두 번 이상 다시 사용하는 행위 | 몇 번 되풀이되는가? |
| 패턴 | 반복 단위와 변화가 알아볼 수 있는 규칙으로 조직된 구조 | 다음 요소를 어느 정도 예측할 수 있는가? |
| 리듬 | 요소와 빈 공간이 이어지며 시선의 이동 속도와 강조점을 형성하는 관계 | 시선은 어디에서 빨라지고 멈추는가? |
음악의 리듬이 소리와 침묵의 시간적 배열에서 생기듯, 시각적 리듬은 형태와 빈 공간의 배열에서 생깁니다. 간격이 일정하면 안정적이고 예측 가능한 흐름이 만들어집니다. 간격이 점차 좁아지면 시선이 더 빠르게 이동하는 듯한 인상을 줄 수 있습니다. 같은 흐름 안에서 한 요소만 색이나 방향이 달라지면 그 위치가 강조점이 됩니다.
공식 사례의 반복 규칙
아래 구조도는 원작 이미지를 복제한 자료가 아닙니다. 각 작가가 반복 단위와 규칙을 구성하는 방식을 수업용으로 단순화한 개념도입니다. 실제 작품과 정확한 제작 맥락은 각 카드에 연결된 공식 자료에서 확인합니다.
Vera Molnár, 규칙과 변주의 작업 ↗
몰나르는 단순한 기하학적 요소를 체계적으로 반복하고, 제한된 범위의 이동이나 변형을 더해 질서와 어긋남을 함께 탐구했습니다. 코드는 수작업으로 모두 계산하기 어려운 다양한 변형을 시도하는 도구로 사용되었습니다.
- 입력
- 사각형, 위치, 회전과 같은 기본 요소
- 규칙
- 격자에 반복 배치하고 일부 매개변수를 제한된 범위에서 변경
- 출력
- 질서 안의 미세한 차이가 드러나는 이미지
Bridget Riley, 반복과 지각의 회화 ↗
라일리의 작업은 단순한 형태와 대비, 간격의 정교한 배열을 통해 정지된 화면이 진동하거나 흐르는 듯한 인상을 줍니다. 빈 공간도 반복 단위만큼 중요한 설계 요소입니다.
- 입력
- 선, 원, 대비되는 색과 빈 공간
- 규칙
- 형태의 간격과 방향을 일정하게 유지하거나 점진적으로 변경
- 출력
- 시선의 속도와 움직임을 유도하는 평면
Sol LeWitt, Untitled from Squares with a Different Line Direction in Each Half Square ↗
이 작품은 1971년에 제작된 열 점의 에칭 포트폴리오 가운데 한 점입니다. 르윗은 단순한 선과 정사각형을 기본 어휘로 삼고, 두 판을 회전하거나 겹쳐 찍는 체계를 통해 여러 구성을 만들었습니다.
- 입력
- 두 부분으로 나눈 정사각형과 서로 다른 방향의 선
- 규칙
- 두 에칭 판을 회전하고 겹쳐 찍어 구성을 변주
- 출력
- 하나의 체계에서 파생된 열 점의 에칭 포트폴리오
선택 사례의 반복 규칙 분석
- 반복되는 최소 단위를 한 단어로 기록합니다.
- 고정되는 속성과 변하는 속성을 각각 하나씩 기록합니다.
- 빈칸에 반복 단위, 간격, 변화하는 속성을 작성해 다음 문장을 완성합니다.
____을/를 ____ 간격으로 반복하고, ____을/를 변화시킨다
사례 분석 문장 예시
라일리 사례는 “단순한 형태를 반복하고, 형태 사이의 간격을 점차 좁힌다”라고 정리할 수 있습니다. 몰나르 사례는 “사각형을 격자에 반복하고, 위치나 회전을 제한된 범위에서 변화시킨다”라고 정리할 수 있습니다. 시각적 인상을 설명할 때에는 그 인상을 형성한 요소와 반복 규칙을 함께 제시합니다.
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
4for를 사용하면 출력할 값이 늘어나거나 모든 값에 적용할 계산이 바뀌어도, 반복할 범위와 공통 명령을 각각 한곳에서 수정할 수 있습니다.
| 변경할 조건 | 명령을 직접 작성한 경우 | for를 사용한 경우 |
|---|---|---|
| 0부터 19까지 출력 | print(5)부터 print(19)까지 15줄 추가 | range(5)를 range(20)으로 변경 |
| 0부터 4까지 각 값에 10을 곱해 출력 | 다섯 출력 문장에 각각 계산 적용 | print(i)를 print(i * 10)으로 변경 |
이처럼 for는 반복할 명령과 값을 구분해 관리하는 데 유용합니다. 다만 위치나 색의 변화는 코드로 직접 정해야 합니다. 도장 비유에서도 찍을 위치를 지정해야 하는 것처럼, 원을 나란히 그리려면 반복 변수로 매번 다른 x좌표를 계산해야 합니다. 이 과정은 뒤의 반복 변수와 시각 요소에서 연결합니다.
코드 작성 횟수와 실행 횟수
range(5)만range(20)으로 바꾸면, 코드에 작성된print(i)문장 수와 실제 실행 횟수는 각각 얼마인지 기록합니다.- 원래의
range(5)를 유지하고print(i)만print(i * 10)으로 바꾸면 어떤 값이 출력되는지 예측합니다.
반복 범위와 공통 명령 확인
첫 번째 변경에서는 print(i) 문장은 한 개이고, 실제 실행 횟수는 20번입니다. 출력값은 0부터 19까지입니다. 두 번째 변경에서는 0, 10, 20, 30, 40이 차례대로 출력됩니다. 반복 범위를 변경하면 사용할 값과 실행 횟수가 달라지고, 반복문 안의 명령을 변경하면 각 값에 수행하는 작업이 달라집니다.
for 문장의 다섯 구성 요소
앞의 for i in range(5):는 “범위의 값을 하나씩 반복 변수에 저장하고, 들여쓴 문장을 실행한다”라고 읽습니다. 같은 문장을 구성 요소별로 나누어 확인합니다.
| 구성 요소 | 역할 | 말로 읽기 |
|---|---|---|
for | 반복을 시작하는 Python 예약어 | 다음 값을 하나씩 사용하며 반복한다 |
i | 반복 변수 | 현재 반복에서 사용할 값을 저장하는 변수 |
in | 반복 변수와 값을 가져올 대상을 연결하는 예약어 | 오른쪽 대상에서 값을 하나씩 가져온다 |
range(5) | 0부터 4까지의 정수를 차례대로 제공 | 다섯 번 반복할 수 있는 수의 범위 |
: | 반복할 코드 블록의 시작 표시 | 이제 아래의 들여쓴 문장이 반복된다 |
반복 변수 i에는 매번 새로운 값이 저장됩니다. 이 값을 통해 현재 반복 순서를 확인할 수 있습니다. 이 예제에서는 첫 반복에 0, 다음 반복에 1이 저장됩니다. i는 Python이 정한 필수 이름이 아니므로 step이나 circle_number처럼 바꿀 수 있지만, 정수를 순서대로 사용하는 반복문에서는 관례적으로 i를 자주 사용합니다.
콜론과 들여쓰기
for 줄 끝의 콜론 :은 반복할 코드가 아래에 이어진다는 표시입니다. 다음 줄 앞의 들여쓰기는 실제로 반복되는 문장의 범위를 나타냅니다. 따라서 들여쓰기를 변경하면 반복되는 문장의 범위도 달라집니다.
for i in range(3):
print("원", i)들여쓴 출력 명령은 세 번 실행됩니다.
for i in range(3):
print("원", i)
print("완료")들여쓰기가 없는 마지막 줄은 반복이 끝난 뒤 한 번만 실행됩니다.
들여쓰기의 깊이와 코드 블록
이 수업의 예제는 스페이스 네 칸으로 들여씁니다. 반복문 안에서 같은 코드 블록에 속하는 문장은 같은 깊이로 들여씁니다. Colab이 자동으로 만든 들여쓰기를 유지하고, 탭과 스페이스를 임의로 섞지 않습니다.
실행 횟수의 구분
print("원", i)는 range(3)의 값 0, 1, 2마다 한 번씩 모두 세 번 실행됩니다. print("완료")는 반복문 밖에 있으므로 반복이 끝난 뒤 한 번만 실행됩니다. 화면에는 원 0, 원 1, 원 2, 완료가 순서대로 나타납니다.
Colab 실습 준비
Colab에서 새 노트북을 생성합니다. 이 노트북에서 반복문의 출력 결과와 변수의 변화를 확인한 뒤, 원을 반복해서 그리는 코드를 실행합니다. 코드 셀은 Shift+Enter 또는 셀 왼쪽 ▶ 버튼으로 실행합니다.
반복문 해석의 기본 절차
- 코드가 그리거나 출력할 대상과 반복 횟수를 한 문장으로 정리합니다.
- 반복 실행할 문장을 찾고, 그 문장에서 반복마다 달라지는 값을 구분합니다.
- 반복 변수에 저장될 값을 실행 순서대로 표에 기록합니다.
- 첫 반복의 실행 결과를 확인한 뒤, 나머지 값에서도 같은 코드 블록이 실행되는 과정을 추적합니다.
- 오류가 발생하면 메시지에서 종류와 위치를 확인한 뒤 콜론과 들여쓰기를 점검합니다.
반복 출력 실행
아래 코드를 새 셀에서 실행해 range(5)가 만드는 값을 확인합니다.
range(5)의 출력
- 노트북 제목을
week04-period1-자기이름으로 지정합니다. - 아래 코드를 새 셀에 입력하고 실행합니다.
- 출력이 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(4)는 0, 1, 2, 3의 네 값을 만들고 끝값 4는 사용하지 않습니다. 줄 밖의 큐브는 범위에 적힌 끝값이 실제로 포함되지 않는다는 점을 보여 주는 비유입니다.
| 코드 | 실제로 사용하는 값 | 반복 횟수 | 읽는 방법 |
|---|---|---|---|
range(5) | 0, 1, 2, 3, 4 | 5회 | 0부터 5 직전까지 1씩 증가 |
range(2, 7) | 2, 3, 4, 5, 6 | 5회 | 2부터 7 직전까지 1씩 증가 |
range(0, 10, 2) | 0, 2, 4, 6, 8 | 5회 | 0부터 10 직전까지 2씩 증가 |
range(4, 0, -1) | 4, 3, 2, 1 | 4회 | 4부터 0 직전까지 1씩 감소 |
range(시작값, 끝값, 증가값)처럼 최대 세 값을 사용할 수 있습니다. 값을 하나만 지정하면 시작값은 0, 증가값은 1로 정해집니다. 이번 주 실습에서는 먼저 range(개수)를 사용하고, 간격은 좌표 계산식에서 조정합니다. 한 번에 한 조건씩 변경하면 실행 결과가 달라진 원인을 확인하기 쉽습니다.
반복 상태 추적과 코드 실습
먼저 표에서 반복 변수의 값 → 실행되는 문장 → 출력의 관계를 확인합니다. 출력 예측 문제를 푼 뒤에는 아래의 네 가지 기초 실습에서 코드를 직접 작성하고 수정합니다.
| 실행 차례 | i의 값 | 실행되는 문장 | 출력 |
|---|---|---|---|
| 1 | 0 | print(i) | 0 |
| 2 | 1 | print(i) | 1 |
| 3 | 2 | print(i) | 2 |
| 4 | 3 | print(i) | 3 |
| 5 | 4 | print(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)- 코드를 실행해 여섯 줄이 출력되는지 확인합니다.
- 같은 셀에서 0부터 7까지 출력하도록 반복 범위만 수정하고 다시 실행합니다.
- 범위에 적은 수, 마지막 출력값, 출력 줄 수의 관계를 한 문장으로 기록합니다.
실습 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)- 출력이 다섯 줄이고, 끝값 12가 포함되지 않는지 확인합니다.
- 시작값과 끝값을 유지한 채 증가값만 3으로 변경하고, 출력값과 줄 수를 예측한 뒤 실행합니다.
- 다음에는 시작값만 1로 변경해 다시 실행합니다. 변경 전후의 첫 값과 마지막 값을 비교합니다.
실습 2. 설정별 출력 비교
for step in range(2, 12, 2):
print(step)| 설정 | 출력 순서 | 출력 줄 수 |
|---|---|---|
range(2, 12, 2) | 2, 4, 6, 8, 10 | 5줄 |
range(2, 12, 3) | 2, 5, 8, 11 | 4줄 |
range(1, 12, 3) | 1, 4, 7, 10 | 4줄 |
시작값은 첫 출력값, 증가값은 인접한 출력값의 차이를 정합니다. 세 설정 모두 끝값 12에 도달하거나 이를 넘기기 전에 반복을 마칩니다. 시작값과 증가값을 지정한 경우에는 끝값만 보고 반복 횟수를 판단하지 않고 실제 값의 순서를 확인합니다.
기초 실습 3. 반복 변수와 계산 결과 출력
다섯 번 반복하면서 20에서 시작해 15씩 증가하는 값을 계산합니다. 왼쪽에는 반복 변수 i, 오른쪽에는 계산한 value가 출력되도록 빈칸을 완성합니다. print(i, value)는 두 값을 한 줄에 공백으로 구분해 출력합니다.
for i in range(5):
value = 20 + i * ____
print(i, value)- i가 0, 1, 4일 때의 value를 계산한 뒤 코드를 실행합니다.
- i는 1씩, value는 15씩 증가하는지 비교합니다.
- 반복 범위는 유지하면서 마지막 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("완료")- 수정 전
완료의 출력 횟수와 전체 출력 줄 수를 기록합니다. print("완료")의 들여쓰기를 수정한 뒤 셀 전체를 다시 실행합니다.- 어느 문장이 반복문 안에 있고 어느 문장이 밖에 있는지 한 문장으로 설명합니다.
실습 4. 수정 코드와 실행 범위 확인
for i in range(3):
print("처리", i)
print("완료")처리 0
처리 1
처리 2
완료
수정 전에는 처리 문장과 완료 문장이 각각 세 번 실행되어 총 여섯 줄이 출력됩니다. 수정 후에는 처리 문장은 세 번, 완료 문장은 반복 종료 후 한 번 실행되어 총 네 줄이 출력됩니다. 들여쓰기는 코드의 정렬뿐 아니라 반복 실행할 문장의 범위를 결정합니다.
네 실습의 실행 결과를 남기고, 각 셀 아래에 수정한 부분과 출력이 달라진 이유를 한 문장으로 기록합니다. 다음 절에서는 시작값 + 반복 변수 × 증가량의 계산 결과를 원의 x좌표에 연결합니다.
반복 변수와 시각 요소
이제 처음에 작성한 수동 반복을 반복문으로 바꿉니다. 원 다섯 개의 위치, 크기, 색은 그대로 유지합니다. 먼저 왼쪽 x좌표 80, 190, 300, 410, 520에서 공통 규칙을 찾습니다.
좌표의 배치 규칙 도출
- 시작 위치 확인: 첫 원의 왼쪽 x좌표는 80입니다.
- 차이 계산:
190 - 80,300 - 190,410 - 300,520 - 410은 모두 110입니다. - 이동 횟수 확인: 첫 위치에서는 아직 이동하지 않았으므로 0번, 두 번째 위치에서는 1번, 다섯 번째 위치에서는 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입니다. 다섯 번의 반복은 수동 반복과 같은 출력을 만듭니다.
i | i * 110 | x = 80 + i * 110 | 원 경계의 x 범위 |
|---|---|---|---|
| 0 | 0 | 80 | 80~150 |
| 1 | 110 | 190 | 190~260 |
| 2 | 220 | 300 | 300~370 |
| 3 | 330 | 410 | 410~480 |
| 4 | 440 | 520 | 520~590 |
원 여섯 개의 배열 확장
다음 예제부터는 range(5)를 range(6)으로 바꾸어 원을 하나 추가합니다. 시작 위치도 80에서 100으로 변경합니다. x좌표는 100, 210, 320, 430, 540, 650이 됩니다. 원의 크기, y좌표, 색은 유지하며, 이 설정을 2교시에서도 사용합니다.
개수, 시작 위치, 배치 간격
| 변경할 값 | 코드의 위치 | 다른 값을 유지했을 때의 결과 |
|---|---|---|
| 개수 | range(6)의 6 | 4로 바꾸면 처음 네 위치에만 원을 그림 |
| 시작 위치 | x = 100 + i * 110의 100 | 140으로 바꾸면 모든 원이 오른쪽으로 40만큼 이동 |
| 배치 간격 | x = 100 + i * 110의 110 | 90으로 바꾸면 첫 원은 그대로이고 나머지 원이 더 가까워짐 |
개수는 반복 횟수, 시작 위치는 배열 전체의 위치, 배치 간격은 이웃한 원 사이의 거리를 결정합니다. 한 번에 한 값만 바꾸면 어떤 수정이 어떤 결과를 만드는지 구분할 수 있습니다.
시작 위치와 배치 간격의 계산 비교
i = 3일 때 기준 좌표는 100 + 3 * 110 = 430입니다. 시작 위치만 140으로 바꾸면 470, 배치 간격만 90으로 바꾸면 370입니다. 곱셈을 먼저 계산한 뒤 덧셈을 합니다. 첫 원은 i = 0이므로 배치 간격을 바꾸어도 x좌표가 100으로 유지됩니다.
원의 반복 배치
같은 노트북에 새 셀을 추가해 반복문으로 원을 그립니다. Image.new()로 이미지를 만들고 ImageDraw.Draw()로 그리기를 준비한 다음, 반복문 안에서 원을 그립니다. 셀의 마지막 image는 완성된 이미지를 표시합니다.
원 여섯 개의 가로 배열
- 같은 노트북의 새 코드 셀에 아래 코드를 입력합니다.
- Shift+Enter 또는 셀 왼쪽 ▶ 버튼으로 실행합니다.
- 연한 배경 위에 청록색 원 여섯 개가 가로로 배치되는지 확인합니다.
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 * 110 | i = 0, x = 100 | 0개: 계산만으로는 원이 생기지 않음 |
| 첫 원 그리기 | draw.ellipse(...) | i = 0, x = 100 | 1개 |
| 두 번째 좌표 계산 | x = 100 + i * 110 | i = 1, x = 210 | 1개: 앞서 그린 원은 그대로 유지 |
| 두 번째 원 그리기 | draw.ellipse(...) | i = 1, x = 210 | 2개 |
| 세 번째~다섯 번째 | 좌표 계산과 그리기를 반복 | i = 2, 3, 4 | 차례로 3개, 4개, 5개 |
| 마지막 원 그리기 | draw.ellipse(...) | i = 5, x = 650 | 6개 |
| 반복 종료 후 | image | 더 이상 좌표를 계산하지 않음 | 완성된 원 여섯 개를 표시 |
변수 값의 변경과 이미지의 누적
x에는 매번 새 좌표가 저장되지만, 앞서 이미지에 기록한 픽셀은 지워지지 않습니다. 따라서 원 하나가 이동하는 애니메이션이 아니라 원 여섯 개가 쌓인 한 장의 이미지가 됩니다. 새 이미지에 처음부터 다시 그리려면 Image.new()가 포함된 전체 셀을 다시 실행합니다.
조건별 반복문 수정
기준 코드 셀은 남겨 두고 복제본에서 연습합니다. 각 단계에서 좌표 예측 → 코드 수정 → 전체 셀 실행 → 결과 비교를 수행합니다. 아래 코드 조각은 복제한 셀의 for 줄부터 도형 명령까지를 교체하는 데 사용합니다.
원 네 개의 배열: 배치 간격 120
시작 x좌표는 100, 원의 지름은 70입니다. 왼쪽 x좌표 사이의 배치 간격을 120으로 정합니다. ____ 세 곳을 숫자로 바꾼 뒤 실행합니다.
실행 전 네 원의 x좌표와 마지막 원의 오른쪽 좌표를 기록합니다. 실행 후 개수와 간격이 예측과 일치하는지 확인합니다.
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좌표 계산식의 값으로 지정합니다.
원 개수 유지와 빈 공간 조정
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입니다. 이 수치는 좌표 사이의 거리로, 색칠되지 않은 픽셀의 개수를 세는 것과는 구분합니다.
가로·세로 배열 전환
새 복제본에서 지름 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좌표 | 지름 | 중심 좌표 | 다음 원까지 경계 사이 거리 |
|---|---|---|---|---|
| 첫 번째 | 100 | 30 | (115, 235) | 80 |
| 두 번째 | 210 | 40 | (230, 240) | 70 |
| 세 번째 | 320 | 50 | (345, 245) | 60 |
| 네 번째 | 430 | 60 | (460, 250) | 50 |
| 다섯 번째 | 540 | 70 | (575, 255) | 40 |
| 여섯 번째 | 650 | 80 | (690, 260) | 다음 원 없음 |
중심은 (x + size / 2, 220 + size / 2)입니다. 왼쪽 위 위치를 유지한 채 크기를 키우면 중심은 오른쪽 아래로 이동하고, 원 사이의 빈 공간은 줄어듭니다. 여기서 빈 공간의 수치는 이웃한 경계 상자 사이의 가로 거리입니다. 원 둘레 사이의 최단 거리를 계산한 값은 아닙니다.
비교 코드: 원 중심 고정과 크기 변경
기준 배열의 첫 원 중심은 (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교시 제출에서는 배치 간격을 고정하고 색과 크기를 변경합니다.
- 크기 변화 코드의
size = 30 + i * 10에서 증가량 10을 4로 바꾼 복제본을 만듭니다. - 마지막 원의 지름과 마지막 두 원의 경계 사이 거리를 예측한 뒤 실행합니다. 증가량 10인 결과와 강조점·밀도를 비교합니다.
- “증가량을 ____로 정했다. 오른쪽의 ____이/가 ____하므로 ____한 흐름을 의도했다.”를 완성합니다. 설계 근거에 계산한 수치를 하나 이상 포함합니다.
- 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)
imageB. 반복문 밖의 도형 명령
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)
imageC. 반복문 안의 이미지 재생성
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동일한 출력 결과의 원인 비교
- A, B, C 각각에서
draw.ellipse()가 몇 번 실행되는지와 마지막에 보일 원의 x좌표를 기록합니다. - 세 예제를 실행하고 예측과 비교합니다. 그림만으로 B와 C를 구분할 수 있는지도 판단합니다.
- 각 코드에서 문제의 원인을 찾아 수정하고, 전체 셀을 다시 실행해 원 여섯 개가 보이는지 확인합니다.
세 오류의 실행 횟수와 수정 위치 확인
| 예제 | 도형 명령 실행 | 마지막 이미지 | 수정 방법 |
|---|---|---|---|
| A | 6번 | x = 100에 원 하나가 겹쳐 보임 | x = 100 + i * 110으로 변경 |
| B | 1번 | x = 650에 원 하나 | draw.ellipse()를 x 계산과 같은 깊이로 들여쓰기 |
| C | 6번 | 마지막에 만든 이미지의 x = 650에 원 하나 | 이미지 생성과 그리기 준비 두 줄을 반복문 앞으로 이동 |
B에서는 좌표 계산만 반복하고, 마지막 x값으로 원을 한 번 그립니다. C에서는 매번 새로운 이미지에 원 하나를 그리고 image가 가리키는 마지막 이미지만 표시합니다. B와 C의 최종 그림은 같아도 실행 과정은 다릅니다. 도형 명령이 반복문 안에 있는지, 같은 이미지에 계속 그리는지를 함께 확인해야 합니다.
학습 내용 점검
반복문의 값, 코드 블록의 경계, 좌표 계산을 함께 확인합니다.
핵심 개념 점검
- 반복 단위, 패턴, 리듬의 개념 구분
- for로 반복 범위와 공통 명령을 구분해 관리하는 이유 설명
range()의 끝값 제외 규칙- 콜론과 들여쓰기가 만드는 코드 블록
- 시작 위치, 개수, 배치 간격을 바꾸는 코드 위치 구분
- 반복 변수와 이미지에 남는 도형의 상태 구분
- 조건에 맞춘 가로·세로 배열과 예측 결과 확인
오늘의 원리
range(4)가 제공하는 값을 순서대로 기록합니다.- 반복문에서 콜론과 들여쓰기의 역할을 각각 한 문장으로 설명합니다.
x = 60 + i * 80에서i가 0, 1, 2일 때의 x좌표를 계산해 기록합니다.
정답 확인
range(4)는 0, 1, 2, 3을 만듭니다. 콜론은 아래에 코드 블록이 시작됨을 표시하고, 들여쓰기는 실제로 반복할 문장의 범위를 나타냅니다. x좌표는 60, 140, 220입니다.
| 보이는 문제 | 가능한 원인 | 먼저 확인할 위치 |
|---|---|---|
SyntaxError | for 줄 끝의 콜론이 없음 | 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와의 차이 |
|---|---|---|---|---|
| 0 | 100 | 0 | 100 | 첫 위치 |
| 1 | 180 | 5 | 185 | 85 |
| 2 | 260 | 20 | 280 | 95 |
| 3 | 340 | 45 | 385 | 105 |
| 4 | 420 | 80 | 500 | 115 |
| 5 | 500 | 125 | 625 | 125 |
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교시에서는 원 반복 그리기의 기준 코드를 복습한 뒤, 색상 리스트의 항목을 순서대로 사용하는 반복문을 작성합니다.
참고 자료
- Python 공식 튜토리얼: for Statements와 range()시퀀스의 항목을 순서대로 반복하는 for 문장과 끝값을 포함하지 않는 range의 공식 설명
- Pillow 공식 문서: ImageDraw좌표, 채우기 색상, 타원 등 도형 명령의 공식 사용법
- La Biennale di Venezia: Vera Molnár기하학적 형태와 컴퓨터 기반 체계를 탐구한 작가의 공식 기관 소개
- Bridget Riley Art Foundation: Catalogue Raisonné초기 흑백 작업과 반복 구조를 확인할 수 있는 공식 디지털 카탈로그
- MoMA: Sol LeWitt, Untitled from Squares with a Different Line Direction in Each Half Square두 에칭 판의 회전과 겹침을 체계적으로 변주한 1971년 작품의 공식 소장품 기록