from PIL import Image, ImageDraw
from functools import reduce
# ニュートン法はfunctools.reduceを使った方がシンプルに書ける
def newton(x):
return reduce(lambda j, i: j - (j**3 - 1) / (3 * j**2), range(10), x)
def plot(draw, s):
hs = s // 2
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
# ローカル関数fooを定義する
def foo(x, y):
nonlocal s, hs
z = newton(complex(x - hs + 0.5, -y + hs + 0.5) / s * 4)
# 条件分岐「文」ではなく、条件分岐「式」に慣れよう
return red if z.real > 0 else green if z.real < 0 and z.imag > 0 else blue
# Pythonではfor文を使うよりリスト内包表記を使った方がスマートだ
[draw.rectangle([x, y, x + 1, y + 1], fill = foo(x, y)) for y in range(s)\
for x in range(s)]
# スクリプトとして起動する
if __name__ == '__main__':
size = 512
img = Image.new('RGB', (size, size))
plot(ImageDraw.Draw(img), size)
img.show()
img.save('img.png')
ZnJvbSBQSUwgaW1wb3J0IEltYWdlLCBJbWFnZURyYXcKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQoKIyDjg4vjg6Xjg7zjg4jjg7Pms5Xjga9mdW5jdG9vbHMucmVkdWNl44KS5L2/44Gj44Gf5pa544GM44K344Oz44OX44Or44Gr5pu444GR44KLCmRlZiBuZXd0b24oeCk6CiAgICByZXR1cm4gcmVkdWNlKGxhbWJkYSBqLCBpOiBqIC0gKGoqKjMgLSAxKSAvICgzICogaioqMiksIHJhbmdlKDEwKSwgeCkKCmRlZiBwbG90KGRyYXcsIHMpOgogICAgaHMgPSBzIC8vIDIKICAgIHJlZCA9ICgyNTUsIDAsIDApCiAgICBncmVlbiA9ICgwLCAyNTUsIDApCiAgICBibHVlID0gKDAsIDAsIDI1NSkKICAgICMg44Ot44O844Kr44Or6Zai5pWwZm9v44KS5a6a576p44GZ44KLCiAgICBkZWYgZm9vKHgsIHkpOgogICAgICAgIG5vbmxvY2FsIHMsIGhzCiAgICAgICAgeiA9IG5ld3Rvbihjb21wbGV4KHggLSBocyArIDAuNSwgLXkgKyBocyArIDAuNSkgLyBzICogNCkKICAgICAgICAjIOadoeS7tuWIhuWykOOAjOaWh+OAjeOBp+OBr+OBquOBj+OAgeadoeS7tuWIhuWykOOAjOW8j+OAjeOBq+aFo+OCjOOCiOOBhgogICAgICAgIHJldHVybiByZWQgaWYgei5yZWFsID4gMCBlbHNlIGdyZWVuIGlmIHoucmVhbCA8IDAgYW5kIHouaW1hZyA+IDAgZWxzZSBibHVlCiAgICAjIFB5dGhvbuOBp+OBr2ZvcuaWh+OCkuS9v+OBhuOCiOOCiuODquOCueODiOWGheWMheihqOiomOOCkuS9v+OBo+OBn+aWueOBjOOCueODnuODvOODiOOBoAogICAgW2RyYXcucmVjdGFuZ2xlKFt4LCB5LCB4ICsgMSwgeSArIDFdLCBmaWxsID0gZm9vKHgsIHkpKSBmb3IgeSBpbiByYW5nZShzKVwKICAgICBmb3IgeCBpbiByYW5nZShzKV0KCiMg44K544Kv44Oq44OX44OI44Go44GX44Gm6LW35YuV44GZ44KLCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBzaXplID0gNTEyCiAgICBpbWcgPSBJbWFnZS5uZXcoJ1JHQicsIChzaXplLCBzaXplKSkKICAgIHBsb3QoSW1hZ2VEcmF3LkRyYXcoaW1nKSwgc2l6ZSkKICAgIGltZy5zaG93KCkKICAgIGltZy5zYXZlKCdpbWcucG5nJykKCg==