fork download
  1. from PIL import Image, ImageDraw
  2. from functools import reduce
  3.  
  4. # ニュートン法はfunctools.reduceを使った方がシンプルに書ける
  5. def newton(x):
  6. return reduce(lambda j, i: j - (j**3 - 1) / (3 * j**2), range(10), x)
  7.  
  8. def plot(draw, s):
  9. hs = s // 2
  10. red = (255, 0, 0)
  11. green = (0, 255, 0)
  12. blue = (0, 0, 255)
  13. # ローカル関数fooを定義する
  14. def foo(x, y):
  15. nonlocal s, hs
  16. z = newton(complex(x - hs + 0.5, -y + hs + 0.5) / s * 4)
  17. # 条件分岐「文」ではなく、条件分岐「式」に慣れよう
  18. return red if z.real > 0 else green if z.real < 0 and z.imag > 0 else blue
  19. # Pythonではfor文を使うよりリスト内包表記を使った方がスマートだ
  20. [draw.rectangle([x, y, x + 1, y + 1], fill = foo(x, y)) for y in range(s)\
  21. for x in range(s)]
  22.  
  23. # スクリプトとして起動する
  24. if __name__ == '__main__':
  25. size = 512
  26. img = Image.new('RGB', (size, size))
  27. plot(ImageDraw.Draw(img), size)
  28. img.show()
  29. img.save('img.png')
  30.  
  31.  
Runtime error #stdin #stdout #stderr 2.26s 32340KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "./prog.py", line 29, in <module>
  File "/usr/local/lib/python3.9/dist-packages/PIL/Image.py", line 2237, in save
    fp = builtins.open(filename, "w+b")
PermissionError: [Errno 13] Permission denied: 'img.png'