Python 重构此函数时需要帮助吗

Python 重构此函数时需要帮助吗,python,python-3.x,zelle-graphics,Python,Python 3.x,Zelle Graphics,我目前正在完成一项大学作业。第一学期我们一直在使用John Zelle的graphics.py模块 任务是构造两种不同的图案,然后按照特定的设计进行布局,根据窗口是500x500、700x700还是900x900像素自动调整 我已经完成了任务,但是,我的代码有很大一部分效率很低,而且很长,因此这并不理想 下面是冗长而低效的代码: def DrawPattern(width,size,win,colour): if size == 5: for x in range(0,

我目前正在完成一项大学作业。第一学期我们一直在使用John Zelle的
graphics.py
模块

任务是构造两种不同的图案,然后按照特定的设计进行布局,根据窗口是
500x500、700x700还是900x900
像素自动调整

我已经完成了任务,但是,我的代码有很大一部分效率很低,而且很长,因此这并不理想

下面是冗长而低效的代码:

def DrawPattern(width,size,win,colour):

    if size == 5:
        for x in range(0,width,100):
            drawCircleExpanse(win,x,400,colour)
        for j in range(100,400,100):
            drawCircleExpanse(win,j,300,colour)
        drawCircleExpanse(win,200,200,colour)
        for j in range(100,400,100):
            drawCircleExpanse(win,j,100,colour)
        for x in range(0,width,100):
            drawCircleExpanse(win,x,0,colour)
    if size == 7:
        for x in range(0,width,100):
            drawCircleExpanse(win,x,width-100,colour)
        for j in range(100,width-100,100):
            drawCircleExpanse(win,j,width-200,colour)
        for i in range(200,width-200,100):
            drawCircleExpanse(win,i,width-300,colour)        
        drawCircleExpanse(win,300,300,colour)
        for j in range(100,width-100,100):
            drawCircleExpanse(win,j,100,colour)
        for x in range(0,width,100):
            drawCircleExpanse(win,x,0,colour)
        for i in range(200,width-200,100):
            drawCircleExpanse(win,i,width-500,colour)   
    if size == 9:
        for x in range(0,width,100):
            drawCircleExpanse(win,x,width-100,colour)
        for j in range(100,width-100,100):
            drawCircleExpanse(win,j,width-200,colour)
        for i in range(200,width-200,100):
            drawCircleExpanse(win,i,width-300,colour) 
        for y in range(300,width-300,100):
            drawCircleExpanse(win,y,width-400,colour)
        drawCircleExpanse(win,400,400,colour)
        for j in range(100,width-100,100):
            drawCircleExpanse(win,j,100,colour)
        for x in range(0,width,100):
            drawCircleExpanse(win,x,0,colour)
        for i in range(200,width-200,100):
            drawCircleExpanse(win,i,width-700,colour) 
        for y in range(300,width-300,100):
            drawCircleExpanse(win,y,width-600,colour) 
size
变量接受用户的输入;例如
5、7或9
。这可转换为
500 x 500、700 x 700或900 x 900
。与
color
类似,它只会将颜色更改为用户选择的颜色之一

此代码将生成以下图案,大小为
5
,转换为
500 x 500

drawCircleExpanse
函数构造模式本身,包含以下代码:

def drawCircleExpanse(win,x,y,colour):
    rad = 50
    for c in range(10):
        circle = Circle(Point(50+x,(50+(c * 10) / 2)+y), rad)
        circle.setOutline(colour)
        circle.draw(win)
        rad -= 5

如果有人能帮我缩短大量代码,我将不胜感激。

我同意这可能更适合codereview,但我有两个想法可以帮助您:

  • 对于
    size
    的每个值,中心元素
    drawCircleExpanse
    前后的行数(用于循环)为
    floor(size/2)
    。由于可以计算行数,因此可以使用嵌套行循环的另一个循环。在中心元素
    draw…
    调用前后使用嵌套循环意味着您可以完全摆脱
    if
    语句
  • 为了使代码更易于阅读,我实际上将因子100移动到
    drawCircleExpanse
    ,这样
    drawCircleExpanse
    的坐标就位于一个虚拟的网格上,而不是屏幕上的像素上。如果需要,将网格到像素的变换本地化还可以使您在以后更改该变换时具有更大的灵活性

    • 你为什么不让电脑帮你算算呢?对于
      size==5
      ,这是重构的第一步:

      x_list = range(0, 500, 100) + \
               range(100, 400, 100) + \
               [200] + \
               range(100, 400, 100) + \
               range(0, 500, 100)
      
      y_list = [400] * 5 + \
               [300] * 3 + \
               [200] + \
               [100] * 3 + \
               [0] * 5
      
      def drawCircleExpanse(win, x, y, colour):
          print "%3d, %3d" % (x, y)
      
      win = None
      colour = None
      for x, y in zip(x_list, y_list):
          drawCircleExpanse(win, x, y, colour)
      
      输出

        0, 400
      100, 400
      200, 400
      300, 400
      400, 400
      100, 300
      200, 300
      300, 300
      200, 200
      100, 100
      200, 100
      300, 100
        0,   0
      100,   0
      200,   0
      300,   0
      400,   0
      
      您应该能够通过使用
      size
      来创建
      x\u列表
      y\u列表
      来进一步重构此文件

      如果有人能帮我缩短时间,我将不胜感激 大量的代码块

      这是否足够简短:

      from graphics import *
      
      RADIUS = 50
      NUMBER_CIRCLES = 10
      DECREMENT = RADIUS // NUMBER_CIRCLES
      
      def drawCircleExpanse(win, x, y, colour):
          for radius in range(RADIUS, 0, -DECREMENT):
              circle = Circle(Point(RADIUS + x, (2 * RADIUS - radius) + y), radius)
              circle.setOutline(colour)
              circle.draw(win)
      
      def DrawPattern(width, size, win, colour):
          for y in range(size, 0, -2): # 5 3 1
              for x in range(width // 2 - y * RADIUS, width // 2 + y * RADIUS, RADIUS * 2):
                  drawCircleExpanse(win, x, width // 2 - y * RADIUS, colour)
                  if y > 1:
                      drawCircleExpanse(win, x, width // 2 + (y - 2) * RADIUS, colour)
      
      win = GraphWin("Optimize Drawing", 700, 700)
      
      DrawPattern(700, 7, win, "red")
      
      win.getMouse()
      
      win.close()
      
      我想你把事情弄得太复杂了。上述值也适用于“3”(和300)以及5、7和9以外的其他值。有一个小问题,调整轻微的窗口边框(铬)宽度,我留给你


      我不确定这类问题是否属于本文的主题。我以前从未问过这个SE,但也许codereview SE是问这类问题的更好地方?在发布之前,我会仔细检查那里的主题指导原则,但我觉得这可能更适合那里。