입문 · 원 위의 곱셈표

2강: 반복문과 나머지

Python으로 “원 위의 곱셈표” 패턴을 만들면서 배워요:

  • zip으로 쌍을 도는 for 반복문
  • 나머지 연산자 %와 한 바퀴 돌아오는 각도
  • plt.plot으로 두 점을 잇는 선
  • 매개변수 하나를 바꾸며 탐구하기

먼저 보기

클릭하면 YouTube에서 재생돼요.

times-table.py
"""Times table on a circle: N dots, each dot n joined to dot (k * n) mod N.
Run: python times-table.py   (needs: pip install numpy matplotlib)
"""
import numpy as np
import matplotlib.pyplot as plt

plt.style.use("dark_background")

N, k = 200, 2  # the number of dots and the multiplier

start = 2 * np.pi * np.arange(N) / N  # dot n at the angle 2*pi*n/N
end = start * k  # dot k*n: angles wrap around the circle by themselves (that is the "mod N")

plt.figure(figsize=(6, 6))
for a, b in zip(start, end):
    plt.plot([np.cos(a), np.cos(b)], [np.sin(a), np.sin(b)], color="#f5c76b", linewidth=0.6)
plt.axis("equal")
plt.axis("off")
plt.show()

# Try: k = 3 for the nephroid, k = 101 to see it collapse into diameters

이 컴퓨터에 Python이 없나요? 노트북으로 같은 스크립트와 연습 문제, 정답을 브라우저의 Google Colab에서 실행할 수 있어요. 노트북은 영어로 되어 있어요.

한 줄씩

  1. N, k = 200, 2

    이름 두 개를 한 번에: 점 200개와 곱하는 수 2. 바꿔 볼 수가 바로 이 둘이에요.

  2. start = 2 * np.pi * np.arange(N) / N

    각 점의 각도예요. 점 n은 2π·n / N에 놓이므로 점 200개가 원을 고르게 나눠 가져요.

  3. end = start * k

    점 k·n의 각도예요. 2π를 넘는 각도는 그냥 한 바퀴 더 돌 뿐이라, 이것이 한 바퀴 돌아오는 계산(k·n mod N)을 대신해 줘요.

  4. for a, b in zip(start, end):

    zip은 두 배열을 짝지어요. 반복할 때마다 시작 각도 하나와 그 끝 각도를 받아요.

  5. plt.plot([np.cos(a), np.cos(b)], [np.sin(a), np.sin(b)], color="#f5c76b", linewidth=0.6)

    plt.plot은 선의 두 끝의 x 값들을, 그다음 y 값들을 받아요. 반복할 때마다 원의 현이 하나씩 그려져요.

직접 해 보기

  1. 3배와 4배를 그려 보세요. 각 곡선에는 첨점(뾰족한 점)이 몇 개 있나요?

    힌트

    k를 바꾸세요.

    정답

    3배는 첨점이 2개인 네프로이드, 4배는 첨점이 3개인 곡선이에요. 언제나 k − 1개예요.

  2. 점이 200개일 때 150 × 2는 어느 점에 닿을까요? 나머지 연산자로 계산해 보세요.

    힌트

    Python에서 %는 나눈 나머지를 줘요.

    정답

    (150 * 2) % 200은 100이에요.

  3. 점을 200개 대신 20개로 해 보세요. 하트가 왜 잘 안 보일까요?

    힌트

    N을 바꾸세요.

    정답

    점이 20개면 선도 20개뿐이라, 모든 선이 닿는 곡선이 드러나기에는 너무 적어요.

퀴즈

1. zip(start, end)는 반복할 때마다 무엇을 줄까요?
2. Python에서 300 % 200은 얼마일까요?
3. 스크립트가 %를 한 번도 쓰지 않는 이유는 무엇일까요?
4. plt.plot([x1, x2], [y1, y2])에서 먼저 오는 것은 무엇일까요?
5. 2배는 어떤 곡선을 그릴까요?

플래시카드

앞면을 읽고, 뒷면의 내용을 스스로 말해 본 다음 카드를 펼쳐 보세요.

  • zip(a, b)

    두 시퀀스를 항목끼리 짝지어요: (a[0], b[0]), (a[1], b[1]), …

  • x % n

    x를 n으로 나눈 나머지: 300 % 200은 100이에요.

  • plt.plot([x1, x2], [y1, y2])

    (x1, y1)에서 (x2, y2)까지의 선.

  • 포락선

    한 무리의 모든 선이 살짝 닿는 곡선: 여기서는 카디오이드.

  • 원 위에서 k배

    정수 배수 k는 첨점이 k − 1개인 곡선을 그려요.

이 플래시카드만 따로 보기 →