2강: 반복문과 나머지
Python으로 “원 위의 곱셈표” 패턴을 만들면서 배워요:
- zip으로 쌍을 도는 for 반복문
- 나머지 연산자 %와 한 바퀴 돌아오는 각도
- plt.plot으로 두 점을 잇는 선
- 매개변수 하나를 바꾸며 탐구하기
먼저 보기
클릭하면 YouTube에서 재생돼요.
"""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에서 실행할 수 있어요. 노트북은 영어로 되어 있어요.
한 줄씩
N, k = 200, 2이름 두 개를 한 번에: 점 200개와 곱하는 수 2. 바꿔 볼 수가 바로 이 둘이에요.
start = 2 * np.pi * np.arange(N) / N각 점의 각도예요. 점 n은 2π·n / N에 놓이므로 점 200개가 원을 고르게 나눠 가져요.
end = start * k점 k·n의 각도예요. 2π를 넘는 각도는 그냥 한 바퀴 더 돌 뿐이라, 이것이 한 바퀴 돌아오는 계산(k·n mod N)을 대신해 줘요.
for a, b in zip(start, end):zip은 두 배열을 짝지어요. 반복할 때마다 시작 각도 하나와 그 끝 각도를 받아요.
plt.plot([np.cos(a), np.cos(b)], [np.sin(a), np.sin(b)], color="#f5c76b", linewidth=0.6)plt.plot은 선의 두 끝의 x 값들을, 그다음 y 값들을 받아요. 반복할 때마다 원의 현이 하나씩 그려져요.
직접 해 보기
3배와 4배를 그려 보세요. 각 곡선에는 첨점(뾰족한 점)이 몇 개 있나요?
힌트
k를 바꾸세요.
정답
3배는 첨점이 2개인 네프로이드, 4배는 첨점이 3개인 곡선이에요. 언제나 k − 1개예요.
점이 200개일 때 150 × 2는 어느 점에 닿을까요? 나머지 연산자로 계산해 보세요.
힌트
Python에서 %는 나눈 나머지를 줘요.
정답
(150 * 2) % 200은 100이에요.
점을 200개 대신 20개로 해 보세요. 하트가 왜 잘 안 보일까요?
힌트
N을 바꾸세요.
정답
점이 20개면 선도 20개뿐이라, 모든 선이 닿는 곡선이 드러나기에는 너무 적어요.
퀴즈
플래시카드
앞면을 읽고, 뒷면의 내용을 스스로 말해 본 다음 카드를 펼쳐 보세요.
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개인 곡선을 그려요.