对于循环不在If语句后执行

时间:2013-08-12 09:10:05

标签: python if-statement for-loop coordinates jython

我想在jython中画一张脸。

我正在使用If if Elif语句,因此每种颜色都会被覆盖,我会逐层构建一个面。

def face():
  pic=makeEmptyPicture(400,400)

  for x in range (400):
    for y in range (400):
      px = getPixel(pic,x,y)
      setColor(px, makeColor(43, 170, 214))
      #face
      if (( pow((x-200),2)+pow((y-200),2))<pow(200,2)):
        setColor(px, makeColor (255, 214, 153))
      #eyes
      if( ((pow((x-100),2)+pow((y-160),2))<pow(50,2)) or ((pow((x-290),2)+pow((y-145),2))<pow(60,2)) ):
        setColor(px,makeColor(255,255,255))
      #iris
      if( ((pow((x-100),2)+pow((y-163),2))<pow(20,2)) or ((pow((x-295),2)+pow((y-135),2))<pow(22,2)) ):
        setColor(px,makeColor(54, 123, 220))
      #pupil
      if( ((pow((x-100),2)+pow((y-165),2))<pow(10,2)) or ((pow((x-295),2)+pow((y-137),2))<pow(11,2)) ):
        setColor(px,makeColor(0,0,0))
      #nose
      if( ((pow((x-209),2)+pow((y-245),2))<pow(13,2)) or ((pow((x-191),2)+pow((y-250),2))<pow(12,2)) ):
        setColor(px,makeColor(255, 198, 114))
      #mouth
      for y in range (337,311):
        x = (y-337)*(247-181)/(311-337) +181
        setColor(px,makeColor(254, 114, 115))

  return (pic)

我得到了这个:
face
我想要的是这个:

face2

看来这没有执行:

#mouth
for y in range (337,311):
   x = (y-337)*(247-181)/(311-337) +181
   setColor(px,makeColor(254, 114, 115))

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您需要将-1作为第三个参数传递给range

<强>演示:

>>> range(10, 5)
[]
>>> range(10, 5, -1)
[10, 9, 8, 7, 6]

<强>代码:

for y in range (337, 311, -1):            #311 is not inclusive
     x = (y-337)*(247-181)/(311-337) +181
     setColor(px,makeColor(254, 114, 115))

答案 1 :(得分:2)

如果您想向后运行范围,则需要提供-1的步骤。

例如:

pax> python
Python 2.7.3 (default, Jan  2 2013, 16:53:07) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print range (50,40)
[]
>>> print range (50,40,-1)
[50, 49, 48, 47, 46, 45, 44, 43, 42, 41]
>>> 

如果没有否定步骤,则范围永远不会开始,因为已经传递了结束值。

因此,在您的特定情况下,您需要:

for y in range (337,311,-1):
   x = (y-337)*(247-181)/(311-337) +181
   setColor(px,makeColor(254, 114, 115))

但是,你这样做的方式也不是......我称之为效率的典范 - 那就像我一样机智: - )

你正在为你处理的160,000个像素中的每个像素画出整个嘴。您可能需要考虑一些不太原始的绘图函数,如直线和圆,沿着以下几行:

  • 画一个大蓝色方块。
  • 为脸部画一个大粉色圆圈。
  • 为外眼画两个白色圆圈。
  • 为内心画两个蓝色圆圈。
  • 为虹膜画出两个黑色圆圈。
  • 为鼻子画两个橙色圆圈。
  • 画一条紫色的嘴巴。

我怀疑这会比根据一系列规则单独设置每个像素更有效。