함수의 입력을 바꾸고 생성된 이미지를 호출한 곳으로 돌려받기
- 형식
- 기본 50분 / 확장 60분 · + 10 MIN EXTENSION
- 핵심
- 매개변수, 인자, 지역 변수,
return - 연결
- 고정 함수 → 입력으로 조절하는 생성기
오늘의 학습 목표
- 고정된 함수가 같은 결과만 만드는 이유를 설명하고 바꿀 요소를 입력 자리로 정할 수 있습니다.
- 함수 정의에 적는 매개변수와 함수 호출에 전달하는 인자를 구분할 수 있습니다.
- 위치 인자와 키워드 인자의 차이를 알고 여러 입력을 읽기 쉬운 방식으로 전달할 수 있습니다.
- 함수 안에서 만든 지역 변수의 사용 범위를 설명할 수 있습니다.
return이 값을 출력하는 문장이 아니라 호출한 곳으로 결과를 전달하는 문장임을 설명할 수 있습니다.- 5주차 코드를
create_poster()함수로 묶고 시드·도형 수·조건 기준·팔레트를 입력으로 전달할 수 있습니다. - 같은 입력은 같은 이미지를 재현하고 다른 입력은 같은 규칙의 변주를 만든다는 사실을 확인할 수 있습니다.
- 0-5 min정의와 호출 회상
고정 함수의 실행 순서를 추적하고 바꿀 수 없는 부분을 찾습니다.
- 5-16 min매개변수와 인자
정의의 입력 자리와 호출의 실제 값을 도형 속성에 연결합니다.
- 16-27 min인자 전달 방식
위치 인자와 키워드 인자를 비교하고 호출 오류를 진단합니다.
- 27-38 min지역 변수와 return
함수 안의 결과를 밖으로 전달하고 출력·저장과 구분합니다.
- 38-47 min전체 이미지 생성기
반복·난수·조건·Pillow 코드를 한 함수로 묶어 변주를 만듭니다.
- 47-50 min3교시 미션 연결
세 포스터와 비교 PNG의 고정 완료 조건을 확인합니다.
수업 운영: 기본 50분과 확장 60분
기본 50분에서는 매개변수와 인자의 구분, 위치·키워드 전달, 지역 변수, return, 완전한 이미지 생성 함수, 3교시 미션 계약까지 진행합니다. 각 개념은 숫자 함수에서 먼저 확인한 뒤 도형 함수와 포스터 함수로 확장합니다. 진도가 빠를 때만 50-60분 확장에서 하나의 함수에 세 입력 조합을 적용하고 어떤 값이 화면의 무엇을 바꾸었는지 기록합니다.
매개변수가 많은 함수를 읽는 순서
- 함수 이름으로 전체 작업을 확인합니다.
create_poster는 포스터 한 장을 만드는 작업입니다. - 정의 괄호의 매개변수를 왼쪽부터 읽습니다. 시드, 도형 수, 중간 기준, 큰 기준, 팔레트 순서입니다.
- 호출 괄호의 실제 값과 이름을 연결합니다. 키워드 인자를 사용하면 연결이 코드에 직접 보입니다.
- 함수 본문에서 각 입력이 쓰이는 위치를 한 곳씩 찾습니다. 모든 줄을 한꺼번에 이해하려 하지 않습니다.
return뒤의 값을 찾습니다. 그 값이 호출 결과로 함수 밖에 전달됩니다.
0-5분 · 입력이 없는 함수는 호출할 때 결과를 조절할 수 없다
1교시의 draw_fixed_motif()는 호출할 때마다 같은 좌표와 같은 색을 사용했습니다. 함수 본문 안에 모든 값이 고정되어 있고 괄호 안에는 외부에서 값을 받을 자리가 없기 때문입니다.
from PIL import Image, ImageDraw
from IPython.display import display
image = Image.new("RGB", (600, 400), (245, 240, 228))
draw = ImageDraw.Draw(image)
def draw_fixed_circle():
draw.ellipse(
(80, 100, 200, 220),
fill=(48, 112, 166),
)
draw_fixed_circle()
draw_fixed_circle()
display(image)
호출은 두 번이지만 두 원은 같은 위치에 포개집니다. 두 번째 원을 오른쪽으로 옮기려면 본문을 복사해 좌표를 고치는 대신, 호출할 때 x와 y를 전달할 수 있어야 합니다. 이처럼 함수마다 달라질 값을 받을 수 있도록 정의한 이름을 매개변수라고 합니다.
호출할 때 바꾸고 싶은 값 찾기
위 함수의 숫자와 색상 가운데 두 번째 호출에서 바꾸고 싶은 항목 세 개를 선택합니다. 선택한 항목이 위치, 크기, 색상 가운데 무엇에 해당하는지도 적습니다.
바꿀 값의 기준 예시
x와 y는 위치, 120은 크기, RGB 튜플은 색상에 해당합니다. 다음 단계에서는 x, y, size, color라는 입력 자리를 정의해 호출마다 실제 값을 전달합니다.
5-16분 · 매개변수는 입력 자리이고 인자는 실제 값이다
다음 함수는 위치, 크기, 색상을 함수 밖에서 받습니다. 정의 괄호의 x, y, size, color가 매개변수입니다.
from PIL import Image, ImageDraw
from IPython.display import display
image = Image.new("RGB", (600, 400), (245, 240, 228))
draw = ImageDraw.Draw(image)
def draw_circle(x, y, size, color):
circle_box = (x, y, x + size, y + size)
draw.ellipse(circle_box, fill=color)
draw_circle(70, 90, 100, (48, 112, 166))
draw_circle(250, 150, 140, (230, 83, 72))
display(image)
def draw_circle(x, y, size, color):
함수를 정의할 때 만드는 입력 자리의 이름입니다. 아직 구체적인 위치와 색을 정하지 않습니다.
draw_circle(70, 90, 100, blue)
함수를 호출할 때 각 입력 자리에 전달하는 실제 값 또는 값이 담긴 변수입니다.
| 정의의 매개변수 | 호출의 인자 | 함수 안에서 의미 | 화면 결과 |
|---|---|---|---|
x | 70 | 원의 왼쪽 좌표 | 왼쪽에서 70픽셀 |
y | 90 | 원의 위쪽 좌표 | 위에서 90픽셀 |
size | 100 | 가로와 세로의 크기 | 100 × 100 원 |
color | (48, 112, 166) | 원의 내부 RGB | 파란색 원 |
매개변수는 함수 안에서 변수처럼 사용됩니다. 호출이 시작되면 첫 번째 인자 70이 x, 두 번째 인자 90이 y에 연결됩니다. 호출이 끝난 뒤 두 번째 호출이 시작되면 같은 매개변수 이름에 새로운 값이 연결됩니다.
x=70 · y=90 · size=100x=250 · y=150 · size=140draw.ellipse(circle_box)세 번째 호출의 화면 결과 예측하기
draw_circle(400, 50, 80, (92, 150, 118))을 추가하면 원의 왼쪽, 위쪽, 크기, 색이 어떻게 되는지 적습니다.
세 번째 호출 예측 답안
왼쪽 좌표는 400, 위쪽 좌표는 50, 크기는 80 × 80이며 RGB (92, 150, 118)의 초록색 원이 만들어집니다. 오른쪽과 아래쪽 좌표는 함수 안에서 각각 480과 130으로 계산됩니다.
16-27분 · 위치로 전달할 수도 있고 이름으로 전달할 수도 있다
기본 함수에서는 인자를 매개변수의 순서대로 전달할 수 있습니다. 이를 위치 인자라고 합니다. 값이 적을 때에는 간결하지만 숫자가 많아지면 각 숫자의 의미를 다시 정의에서 찾아야 합니다.
draw_circle(70, 90, 100, (48, 112, 166))
각 값 앞에 매개변수 이름을 적는 키워드 인자를 사용할 수도 있습니다. 코드가 길어지지만 어떤 값이 어떤 역할을 하는지 호출문 자체에서 확인할 수 있습니다.
draw_circle(
x=70,
y=90,
size=100,
color=(48, 112, 166),
)
| 구분 | 연결 기준 | 장점 | 주의점 |
|---|---|---|---|
| 위치 인자 | 왼쪽부터 매개변수 순서 | 짧고 간단함 | x·y·size처럼 숫자가 많으면 순서를 바꾸기 쉬움 |
| 키워드 인자 | 이름=값의 이름 | 각 값의 역할이 호출문에 보임 | 매개변수 이름을 정확히 작성해야 함 |
이번 주의 create_poster()에는 다섯 입력이 있으므로 호출문에서는 키워드 인자를 사용합니다. 키워드 인자의 순서는 바꿀 수 있지만, 수업 예제에서는 함수 정의와 같은 순서를 유지해 비교하기 쉽게 만듭니다.
호출 오류는 정의와 호출의 입력 목록을 나란히 비교한다
| 잘못된 호출 | 원인 | 확인할 기준 |
|---|---|---|
draw_circle(70, 90, 100) | color 인자 누락 | 정의에는 네 매개변수, 호출에는 세 인자 |
draw_circle(70, 90, 100, blue, 4) | 인자 한 개 초과 | 정의보다 호출 값이 많음 |
draw_circle(width=100, x=70, y=90, color=blue) | width라는 매개변수가 없음 | 정의의 이름은 size |
draw_circle(70, y=90, 100, color=blue) | 키워드 인자 뒤에 위치 인자를 사용 | 위치 인자를 먼저 쓰거나 모두 키워드로 작성 |
TypeError: missing 1 required positional argument: 'color'가 나오면?
함수 정의에는 color 매개변수가 있지만 호출할 때 실제 색상 인자를 전달하지 않았다는 뜻입니다. 정의 괄호와 호출 괄호를 나란히 놓고 누락된 역할을 찾은 뒤 RGB 튜플 또는 색상 변수를 전달합니다.
기본값 매개변수는 이번 기본 수업에서 사용하지 않는다
Python은 인자를 생략했을 때 사용할 기본값을 정의할 수 있지만, 이번 시간에는 모든 입력을 호출문에 명시합니다. 먼저 매개변수와 인자의 일대일 연결을 정확히 이해한 뒤 기본값은 이후 확장에서 다룹니다.
27-38분 · return은 함수 안의 결과를 호출한 곳으로 전달한다
다음 함수는 x, y, size를 받아 Pillow 도형에 사용할 경계 상자를 계산합니다. return circle_box가 실행되면 계산된 튜플이 호출한 곳으로 전달되고 first_box에 저장됩니다.
def make_circle_box(x, y, size):
circle_box = (x, y, x + size, y + size)
return circle_box
first_box = make_circle_box(70, 90, 100)
print(first_box)
(70, 90, 170, 190)
70, 90, 100이 x, y, size에 연결됩니다.
함수 본문이 circle_box 튜플을 만듭니다.
튜플이 호출 자리로 돌아와 first_box에 저장됩니다.
return, print, display, save는 목적이 다르다
| 동작 | 주요 목적 | 호출한 곳에서 값 사용 | 이번 생성기에서 위치 |
|---|---|---|---|
return image | 함수의 결과값 전달 | 가능 | 함수 본문의 마지막 |
print(value) | 문자나 숫자를 출력 영역에 표시 | 표시만으로는 전달되지 않음 | 검사와 설명에 사용 |
display(image) | 노트북에 이미지를 시각적으로 표시 | 표시만으로는 전달되지 않음 | 함수 호출 뒤 사용 |
image.save(filename) | 이미지를 파일로 저장 | 파일이 생성됨 | 결과 선택 뒤 사용 |
return은 화면에 자동으로 설명을 출력하는 명령이 아닙니다. 함수가 만든 값을 다른 변수에 저장하거나, 다른 함수에 전달하거나, 나중에 저장할 수 있도록 호출 위치로 돌려주는 명령입니다. 함수가 return 없이 끝나면 Python은 None을 돌려줍니다.
def make_title():
title = "CONTROLLED CHANCE"
print(title)
returned_value = make_title()
print("돌려받은 값:", returned_value)
CONTROLLED CHANCE
돌려받은 값: None
첫 줄은 함수 안의 print()가 표시한 문자열이고, 둘째 줄의 None은 함수가 별도의 값을 반환하지 않았다는 뜻입니다. 이미지 생성 함수에서 return image를 빠뜨리면 호출 결과 변수에도 None이 저장되어 이후 display()나 save() 작업을 이어가기 어렵습니다.
함수 안에서 만든 변수는 기본적으로 함수 안에서 사용한다
make_circle_box() 안에서 만든 circle_box는 함수가 실행되는 동안 사용하는 지역 변수입니다. 함수 밖에서는 그 이름을 직접 사용하지 않고, return으로 받은 값을 새로운 변수에 저장합니다.
def make_circle_box(x, y, size):
circle_box = (x, y, x + size, y + size)
return circle_box
returned_box = make_circle_box(70, 90, 100)
print(returned_box)
circle_box
함수 본문에서 계산에 사용하는 지역 변수입니다. 함수의 작업 과정을 설명합니다.
returned_box
호출이 돌려준 값을 함수 밖에서 새로 저장한 변수입니다. 이후 도형 명령에 사용할 수 있습니다.
함수 밖에서 circle_box를 출력하면 왜 NameError가 나는가?
circle_box는 함수 호출 중 함수 안에서 만들어진 지역 변수이기 때문입니다. 함수 밖에서는 return으로 받은 returned_box를 사용합니다. 이번 수업에서는 global로 내부 변수를 억지로 밖에 노출하지 않습니다.
화면 표시와 결과 반환 구분하기
“함수 안에서 이미지를 보여주었다”와 “함수 호출 결과로 이미지를 돌려받았다”가 같은 말인지 판단하고, 반환된 이미지로 할 수 있는 작업 두 가지를 적습니다.
표시와 반환 판정 답안
두 문장은 다릅니다. display(image)는 노트북 화면에 이미지를 보여주고, return image는 호출한 곳에 이미지 객체를 전달합니다. 반환된 이미지는 변수에 저장하고, 다시 표시하고, PNG로 저장하거나 다음 주의 자르기·합성 작업에 전달할 수 있습니다.
38-47분 · 5주차 코드를 create_poster 함수로 묶기
다음 코드는 5주차의 반복, 난수, 조건, Pillow 도형을 하나의 함수로 묶은 완전한 예제입니다. 한 번에 모든 줄을 외우지 않습니다. 함수 이름, 다섯 입력, 고정 규칙, 반복 생성, 반환 결과의 다섯 묶음으로 읽습니다.
from PIL import Image, ImageDraw
from IPython.display import display
import random
def create_poster(
seed_number,
shape_count,
medium_threshold,
large_threshold,
palette,
):
canvas_width = 600
canvas_height = 600
min_size = 20
max_size = 80
margin = 40
background_color = palette[0]
primary_color = palette[1]
secondary_color = palette[2]
accent_color = palette[3]
outline_color = palette[4]
base_palette = [primary_color, secondary_color, accent_color]
random.seed(seed_number)
image = Image.new(
"RGB",
(canvas_width, canvas_height),
background_color,
)
draw = ImageDraw.Draw(image)
for shape_number in range(shape_count):
size = random.randint(min_size, max_size)
x = random.randint(
margin,
canvas_width - margin - size,
)
y = random.randint(
margin,
canvas_height - margin - size,
)
base_color = random.choice(base_palette)
if size >= large_threshold:
draw.rectangle(
(x, y, x + size, y + size),
fill=accent_color,
outline=outline_color,
width=3,
)
elif size >= medium_threshold:
draw.ellipse(
(x, y, x + size, y + size),
fill=base_color,
)
else:
draw.ellipse(
(x, y, x + size, y + size),
fill=background_color,
outline=base_color,
width=4,
)
return image
calm_palette = [
(235, 241, 250),
(48, 112, 166),
(92, 150, 118),
(230, 83, 72),
(35, 42, 55),
]
poster_a = create_poster(
seed_number=73,
shape_count=56,
medium_threshold=42,
large_threshold=64,
palette=calm_palette,
)
display(poster_a)
poster_a.save("week06_poster_a.png")
| 구분 | 값 | 설계 이유 |
|---|---|---|
| 매개변수 | 시드, 도형 수, 중간 기준, 큰 기준, 팔레트 | 호출마다 의미 있는 시각적 변화를 만들 수 있음 |
| 함수 안 고정값 | 600 × 600 캔버스, 크기 20~80, 여백 40 | 모든 변주가 같은 형식과 안전 범위를 공유함 |
| 공통 절차 | 난수 선택, 반복, 세 조건 분기, 도형 그리기 | 결과가 달라도 같은 생성 시스템으로 보이게 함 |
| 반환값 | 완성된 image | 호출 뒤 표시·비교·저장할 수 있음 |
모든 숫자를 매개변수로 만들 필요는 없습니다. 캔버스 크기와 안전 여백까지 호출마다 바꾸게 하면 비교 기준이 흐려지고 좌표 오류가 늘어날 수 있습니다. 제작자가 자주 조절할 요소만 입력으로 열고, 시스템의 정체성과 안전을 지키는 값은 함수 안에 고정합니다.
같은 함수를 다른 인자로 호출해 세 변주 만들기
다음 두 호출은 위의 함수 정의와 calm_palette를 실행한 뒤 이어서 실행합니다. 함수 본문은 수정하지 않고 호출값만 바꿉니다.
bold_palette = [
(247, 239, 216),
(56, 90, 124),
(183, 94, 120),
(229, 168, 57),
(32, 43, 56),
]
soft_palette = [
(241, 234, 246),
(98, 81, 139),
(49, 142, 136),
(233, 130, 69),
(48, 42, 60),
]
poster_b = create_poster(
seed_number=91,
shape_count=72,
medium_threshold=38,
large_threshold=60,
palette=bold_palette,
)
poster_c = create_poster(
seed_number=127,
shape_count=48,
medium_threshold=48,
large_threshold=68,
palette=soft_palette,
)
display(poster_b)
display(poster_c)
poster_b.save("week06_poster_b.png")
poster_c.save("week06_poster_c.png")
한 함수의 정체성은 유지되고 호출의 인자가 변주를 만든다
세 결과는 모두 600 × 600 캔버스, 40픽셀 여백, 20~80 크기 범위, 같은 세 조건 분기, 같은 Pillow 도형 명령을 사용합니다. 달라진 것은 함수의 입력입니다. 따라서 세 이미지는 서로 다르지만 하나의 규칙을 공유하는 시리즈로 읽힙니다.
같은 입력은 같은 결과를 다시 만든다
random.seed(seed_number)가 함수 안에서 각 호출의 시작에 실행되므로, 같은 인자 조합을 다시 전달하면 같은 난수 선택 순서를 얻습니다.
poster_a_again = create_poster(
seed_number=73,
shape_count=56,
medium_threshold=42,
large_threshold=64,
palette=calm_palette,
)
same_result = poster_a.tobytes() == poster_a_again.tobytes()
print("같은 입력의 결과가 같은가?", same_result)
같은 입력의 결과가 같은가? True
tobytes()는 자동 검사에서 두 이미지의 픽셀 데이터를 비교하기 위해 사용합니다. 학생이 이 메서드를 외울 필요는 없습니다. 기억할 핵심은 같은 함수에 같은 입력을 전달하면 같은 결과를 다시 확인할 수 있다는 점입니다.
시드를 함수 밖에서 한 번만 설정하면 왜 호출 결과가 달라질 수 있는가?
첫 호출이 난수 값을 사용한 뒤 난수 선택 위치가 앞으로 이동하기 때문입니다. 두 번째 호출은 이어진 위치에서 선택을 시작합니다. 각 포스터를 같은 입력으로 독립적으로 재현하려면 함수 안에서 이미지 생성 전에 random.seed(seed_number)를 실행합니다.
이미지 생성 함수의 대표 오류
| 증상 | 가능한 원인 | 수정 위치 |
|---|---|---|
필수 인자가 없다는 TypeError | 호출에서 다섯 입력 중 하나를 생략 | 호출문의 키워드 이름과 값 확인 |
NoneType 관련 오류 | 함수 마지막의 return image 누락 | 함수 본문의 들여쓰기 안 마지막 줄 확인 |
| 두 호출이 예상과 다르게 같음 | 새 인자를 작성했지만 호출 셀을 다시 실행하지 않음 | 수정한 호출 셀 재실행 |
| 같은 입력인데 결과가 달라짐 | random.seed(seed_number)가 함수 밖에 있음 | 함수 안에서 이미지 생성 전에 시드 설정 |
IndexError | 팔레트에 다섯 역할이 모두 없음 | 배경·주조·보조·강조·윤곽 순서로 다섯 RGB 확인 |
| 도형이 화면 밖으로 잘림 | x·y의 최대 범위에서 size를 빼지 않음 | 난수 좌표 두 줄의 - margin - size 확인 |
함수 오류는 정의와 호출을 구분해 고친다
모든 호출에서 같은 오류가 나면 함수 정의의 공통 절차를 먼저 확인합니다. 특정 호출에서만 오류가 나면 그 호출의 인자 수, 이름, 범위, 팔레트 구조를 확인합니다. 정의와 호출을 동시에 여러 곳 수정하면 원인을 구분하기 어려워집니다.
47-50분 · 3교시 연결: 세 변주 이미지 생성기
3교시는 빈 화면에서 긴 함수를 외워 작성하는 시간이 아닙니다. 제공된 create_poster() 템플릿에서 정해진 빈칸을 완성하고, 서로 다른 입력 조합 세 개를 설계해 하나의 생성 시스템을 증명합니다.
| 항목 | 필수 완료 조건 | 검사 목적 |
|---|---|---|
| 함수 정의 | create_poster(seed_number, shape_count, medium_threshold, large_threshold, palette) | 다섯 입력 자리가 유지되는지 확인 |
| 함수 결과 | 600 × 600 RGB 이미지를 return image로 전달 | 화면 출력이 아니라 값 반환을 확인 |
| 세 번 호출 | A·B·C에서 서로 다른 매개변수 조합 사용 | 한 함수가 여러 변주를 만드는지 확인 |
| 재현 검사 | A와 같은 입력을 다시 호출해 같은 픽셀 결과 확인 | 시드가 함수 안에서 작동하는지 확인 |
| 비교 이미지 | 세 결과를 한 장에 배치한 3안 비교 PNG 생성 | 입력 변화와 화면 변화를 함께 비교 |
| 귀가 조건 | 자동 검사 PASS와 `.ipynb + .png` 제출 | 남은 시간과 관계없이 완료를 증명 |
자동 검사는 디자인 취향을 평가하지 않는다
검사 대상은 함수 정의, 입력 연결, 안전한 범위, 반환 이미지, 세 호출의 차이, 같은 입력의 재현, PNG 저장입니다. 특정 팔레트가 더 아름다운지 또는 어느 배치가 더 좋은지는 자동 검사와 귀가 조건에 포함하지 않습니다.
A·B·C에서 바꿀 입력 정하기
A는 기준안, B는 밀도가 높은 안, C는 큰 도형이 드문 안으로 설정합니다. 각 안에서 시드, 도형 수, 중간 기준, 큰 기준, 팔레트 가운데 무엇을 바꿀지 표에 적습니다.
세 변주 설계의 기준 예시
A는 시드 73과 도형 수 56, B는 시드 91과 도형 수 72로 밀도를 높일 수 있습니다. C는 큰 기준을 68처럼 높여 큰 사각형이 나타나는 범위를 줄이고 새로운 팔레트를 사용할 수 있습니다. 각 안의 숫자는 달라도 작은·중간·큰 구간과 안전한 좌표 범위는 유지해야 합니다.
2교시 핵심 문장
매개변수는 함수가 받을 입력의 자리이고, 인자는 호출할 때 전달하는 실제 값이며, return은 함수가 만든 결과를 호출한 곳으로 돌려줍니다.
수업 후 개별 복습
- 당일 4분:
def draw_circle(x, y, size, color)에서 함수 이름과 네 매개변수를 구분해 적습니다. - 다음 날 5분: 위치 인자 호출 하나를 키워드 인자 호출로 바꾸고 두 호출이 같은 결과를 만드는 이유를 설명합니다.
- 3교시 직전 3분:
print,display,save,return의 목적을 한 줄씩 적습니다.
이번 시간에 다루지 않는 함수 문법
기본값 매개변수, *args, **kwargs, 람다 함수, 재귀, 데코레이터, 클래스, global, nonlocal은 이번 기본 수업에서 사용하지 않습니다. 3교시 미션에는 다섯 개의 일반 매개변수, 키워드 인자, 지역 변수, 하나의 return image만 필요합니다.
50-60분 · 한 함수로 세 가지 통제 실험하기
확장 시간에는 함수 본문을 수정하지 않습니다. 기준 호출 A를 복사한 뒤 한 번에 입력 하나만 바꾸어 화면 변화의 원인을 분리합니다.
| 시간 | 변경할 입력 | 관찰할 화면 변화 |
|---|---|---|
| 50-53분 | 시드만 73에서 91로 변경 | 같은 밀도와 규칙에서 배치가 달라지는지 확인 |
| 53-56분 | 도형 수만 56에서 72로 변경 | 밀도와 겹침이 증가하는지 확인 |
| 56-59분 | 큰 기준만 64에서 70으로 변경 | 강조 사각형 수가 줄어드는지 확인 |
| 59-60분 | 세 결과의 차이를 입력과 연결 | “어떤 입력이 무엇을 바꾸었다” 문장 세 개 |
짧은 무작위 실행에서는 경향과 실제 개수가 정확히 일치하지 않을 수 있습니다. 예를 들어 큰 기준을 높이면 큰 도형이 나올 수 있는 크기 구간은 줄어들지만, 특정 시드의 실제 사각형 수가 매번 같은 비율로 줄어든다고 보장되지는 않습니다.
시드와 도형 수를 동시에 바꾸면 원인을 설명하기 어려운 이유
배치와 밀도가 함께 달라져 어느 입력이 특정 차이를 만들었는지 분리하기 어렵기 때문입니다. 입력과 결과의 관계를 학습할 때에는 하나만 바꾸고 나머지를 유지합니다. 최종 작품에서는 관계를 이해한 뒤 여러 입력을 함께 설계할 수 있습니다.
참고 자료
- Python 공식 튜토리얼: Defining Functions함수 정의, 인자가 지역 이름에 연결되는 방식, 반환값과
None의 공식 설명 - Python 공식 튜토리얼: Keyword Arguments위치 인자와 키워드 인자의 호출 방식 및 이름 연결 규칙
- Python 언어 참조: The return statement함수 호출에서 빠져나오며 값을 호출한 곳에 전달하는
return의 공식 정의 - Python 공식 문서: random.seed같은 생성 함수에서 난수 선택을 다시 재현하기 위한 시드 설정
- Pillow 공식 문서: Image 객체함수가 반환하고 이후 표시·저장하는 Pillow 이미지 객체의 공식 참조
- Pillow 공식 문서: ImageDraw생성 함수 안에서 호출하는 사각형과 타원 그리기 메서드의 공식 설명