代码之家  ›  专栏  ›  技术社区  ›  Steven Anderman

有人知道我如何让这段代码更容易阅读,占用更少的空间吗?

  •  -1
  • Steven Anderman  · 技术社区  · 3 年前

    我写这段代码是为了使用python中的turtle模块以某种方式在模式中创建。我正试图将其简化为更少的代码行,但我不确定如何以完全相同的方式实现。

    import turtle
    t = turtle.Turtle()
    t.speed(0)
    
    t.penup()
    t.setposition(120, 210)
    t.pendown()
    
    t.speed(5)
    t.width(2)
    length = 80
    colors = ["purple", "blue", "green", "orange", "red"]
    
    t.color(colors[0])
    for purple_side in range(1, 4):
        t.forward(length)
        if purple_side % 3 != 0:
            t.right(90)
    
    t.color(colors[1])
    for blue_side in range(1, 3):
      t.forward(length)
      if blue_side % 2 != 0:
        t.left(90)
    
    t.color(colors[2])
    for green_side in range(1, 3):
      t.forward(length)
      if green_side % 2 != 0:
        t.right(90)
    
    t.color(colors[3])
    for yellow_side in range(1, 3):
      t.forward(length)
      if yellow_side % 2 != 0:
        t.left(90)
    
    t.color(colors[4])
    for red_side in range(1, 5):
      t.forward(length)
      if red_side % 4 != 0:
        t.right(90)
    
    t.color(colors[3])
    for yellow_side in range(1, 3):
      t.forward(length)
      if yellow_side % 2 != 0:
        t.left(90)
    
    t.color(colors[2])
    for green_side in range(1, 3):
      t.forward(length)
      if green_side % 2 != 0:
        t.right(90)
    
    t.color(colors[1])
    for blue_side in range(1, 3):
      t.forward(length)
      if blue_side % 2 != 0:
        t.left(90)
      else:
        t.color(colors[0])
        t.forward(length)
        t.right(90)
    

    我尝试了许多不同的方法来简化这段代码,但没有成功。

    1 回复  |  直到 3 年前
        1
  •  2
  •   Turksarama    3 年前

    看看你画的模式会给你一个线索,如果你从更高的层次思考你想做的事情,你可能会发现事情会简单得多。

    首先,请注意,每个正方形都在右上角和左下角连接,如果您也从同一个地方开始,您的代码会更简单。

    第二,注意反向跳闸与向下跳闸相同,但颜色顺序相反。

    import turtle
    t = turtle.Turtle()
    t.speed(0)
    
    t.penup()
    t.setposition(120, 210)
    t.pendown()
    
    t.speed(5)
    t.width(2)
    
    t.right(90) # the turtle starts facing to the right, but each half square begins facing down
    
    length = 80
    colors = ["purple", "blue", "green", "orange", "red"]
    
    def drawHalfSquare(color):
        t.color(color)
        t.forward(length)
        t.right(90)
        t.forward(length)
        t.left(90)
    
    for color in colors:
        drawHalfSquare(color)
        
    # turn around at the end to face up
    t.right(180)
    
    for color in colors[::-1]: #[::-1 will reverse the list]
        drawHalfSquare(color)
    
        2
  •  0
  •   cdlane    3 年前

    首先研究你要画的东西的对称性。例如,从第一个下划开始,而不是从右划开始,会使第一个正方形与其他正方形相同,而不是特殊情况。

    尽管看起来可能大不相同,但该解决方案与@Turksarama的漂亮解决方案(+1)有一些相同的基本绘图概念:

    from turtle import Screen, Turtle
    
    COLORS = ['purple', 'blue', 'green', 'orange', 'red']
    LENGTH = 80
    
    screen = Screen()
    
    turtle = Turtle()
    turtle.speed('fastest')
    turtle.width(2)
    turtle.right(90)
    
    turtle.penup()
    turtle.setposition(len(COLORS) / 2 * LENGTH, len(COLORS) / 2 * LENGTH)
    turtle.pendown()
    
    for color in [*COLORS, None, *reversed(COLORS)]:
    
        if color:
            turtle.color(color)
    
            turtle.forward(LENGTH)
            turtle.right(90)
            turtle.forward(LENGTH)
        else:
            turtle.left(90)
    
        turtle.left(90)
    
    turtle.hideturtle()
    screen.exitonclick()