如何以更简单的方式表达这个问题

3
i = 0
for x in range(0, 5):
    for y in range(0, 5):
        if 0 == outputAfterLearning[i]:
            image.putpixel((x, y), (0, 0, 0))
        elif 1 == outputAfterLearning[i]:
            image.putpixel((x, y), (255, 255, 255))
        i += 1

for x in range(0, 5):
    for y in range(5, 10):
        if 0 == outputAfterLearning[i]:
            image.putpixel((x, y), (0, 0, 0))
        elif 1 == outputAfterLearning[i]:
            image.putpixel((x, y), (255, 255, 255))
        i += 1

for x in range(5, 10):
    for y in range(0, 5):
        if 0 == outputAfterLearning[i]:
            image.putpixel((x, y), (0, 0, 0))
        elif 1 == outputAfterLearning[i]:
            image.putpixel((x, y), (255, 255, 255))
        i += 1

for x in range(5, 10):
    for y in range(5, 10):
        if 0 == outputAfterLearning[i]:
            image.putpixel((x, y), (0, 0, 0))
        elif 1 == outputAfterLearning[i]:
            image.putpixel((x, y), (255, 255, 255))
        i += 1

如您所见,我正在使用5x5像素的正方形迭代图像并在其中设置像素。

上述代码显然适用于尺寸为10x10px的图像,但我希望以更通用的方式编写上述代码,这样我就可以在不添加32个新的循环的情况下将其用于更大的图像(比如30x30px)。


专业提示:使用xrange()而不是range(),它会生成一个迭代器而不是整个列表。因为你实际上并没有使用列表[0, 1, 2, 3, 4, 5],而只是值1、2、3、4、5。 - NorthIsUp
1个回答

4
xdim, ydim = 10, 10
xblocksize, yblocksize = 5, 5
for xblock in range(0, xdim, xblocksize):
   for yblock in range(0, ydim, yblocksize):
      for x in range(xblock, xblock+xblocksize):
         for y in range(yblock, yblock+yblocksize):
            # the common code.

但我会为块迭代创建一个生成器:

def blocked(xdim, ydim, xblocksize, yblocksize):
  for xblock in range(0, xdim, xblocksize):
     for yblock in range(0, ydim, yblocksize):
        for x in range(xblock, xblock+xblocksize):
           for y in range(yblock, yblock+yblocksize):
              yield (x, y)

并使用 putpixel 作为
color = [(0,0,0),(255,255,255)]
for colorcode, pixelloc in zip(outputAfterLearning, blocked(10, 10, 5, 5)):
   if 0 <= colorcode < len(color):
   # ^ omit this if outputAfterLearning[i] is always valid
     image.putpixel(pixelloc, color[colorcode])

我还会将常见代码制作成一个函数,其参数为dims和sizes,以便它可以在不同大小/维度的图片上反复使用。 - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接