【问题标题】:Is there a way to shorten my code so that I don't have to write "turtle." every time I use functions from the turtle module?有没有办法缩短我的代码,这样我就不必写“乌龟”了。每次我使用turtle模块中的函数?
【发布时间】:2019-09-10 00:45:32
【问题描述】:

我正在尝试在 python 中使用turtle 绘制正方形,每次我想命令它做某事时,我都必须写turtle

import turtle


turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.back(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.back(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.back(200)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.back(100)



turtle.exitonclick()

我希望编写我的代码而不必每次都写turtle

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    您可以通过编写从turtle 模块导入所有内容

    from turtle import *  # this is a wildcard import
    

    但是,您应该只是 import turtle as t(或任何其他您想要的),如下所示:

    import turtle as t  # you can replace t with any valid variable name
    

    因为通配符导入往往会造成函数定义冲突

    相反,您可以只从模块中导入您需要的类(或方法)。 Turtle 是必要的导入:

    from turtle import Turtle
    

    现在,我们必须实例化它:

    t = Turtle()
    

    现在我们可以使用它了:

    t.do_something()  # methods that act on the turtle, like forward and backward
    

    但是,这不会导入 Screen 模块,因此您将无法使用 exitonclick(),除非您也导入 Screen

    from turtle import Turtle, Screen
    s = Screen()
    s.exitonclick()
    

    正如@cdlane 指出的那样,循环实际上可能是减少您必须编写的代码量的最佳选择。这段代码:

    for _ in range(x):
        turtle.forward(100)
        turtle.right(90)
    

    turtle 向前移动,然后向右移动x 次。

    【讨论】:

      【解决方案2】:

      您知道 SO 上有多少 cmets 说“不要使用通配符导入”以回应人们建议的 from turtle import * 吗?我会进一步争论,不要这样做import turtle as t,因为它会将 functional 接口暴露给turtle。 turtle 模块是面向对象的,你只需要暴露那个接口。如果您厌倦了打字,请了解循环:

      from turtle import Screen, Turtle
      
      t = Turtle()
      
      for _ in range(4):
          t.forward(100)
          t.right(90)
      
      for _ in range(4):
          t.backward(100)
          t.left(90)
      
      t.backward(100)
      
      for _ in range(3):
          t.backward(100)
          t.left(90)
      
      s = Screen()
      
      s.exitonclick()
      

      诚然,我并不介意为短的 turtle 和 tkinter 示例以及 Zelle 图形程序导入通配符。但是fd() 也不是废话,而是forward()!庆祝成为乌龟,不要躲在壳里!

      【讨论】:

        【解决方案3】:

        您可以使用通配符导入:

        from turtle import * 
        

        但最好使用带前缀的导入来保持命名空间干净。见@alec_a's answer

        【讨论】:

        • 如果你只导入海龟,这是一个很好的解决方案,但对于较大的项目,我建议不要使用通配符导入
        • 如果您作为 x 导入,那么您不必担心命名空间冲突,也不必在使用新的非标准库函数时附加导入。不过,这都是个人喜好。
        • @user1529891:在我的脑海中,很多人最终都使用了 Stack Overflow,因为他们没有意识到他们的通配符导入之一引入了错误的 open 函数,或者他们的 @ 987654324@隐藏了内置的anyall。通配符导入会导致很多问题。
        【解决方案4】:

        免责声明:此答案适用于像我这样的懒人:)

        已经有很好的答案向您展示如何解决您的问题,并就通配符导入向您发出警告。

        如果你只是想玩turtle模块,你可以让你的生活更轻松,即不要写turtle.forward(90),最好写forward(90),但如果你写f(90)会超级容易

        同样,它会影响代码的可读性,但通常值得一试

        现在你的代码看起来像

        编辑:按照 @chepner 的建议在一行中修改导入,使其超级懒惰

        from turtle import forward as f, back as b, right as r, left as l, exitonclick
        
        # to draw one square
        f(100)
        r(90)
        f(100)
        r(90)
        f(100)
        r(90)
        f(100)
        
        exitonclick()
        

        【讨论】:

        • 你还不够懒 :) from turtle import forward as f, back as b, right as r, left as l, exitonclick.
        • 这突出了为什么乌龟是愚蠢的。只是一堆重复的动作。我喜欢这个解决方案,因为它让这些重复的动作变得不那么麻烦。
        • @alec_a,你是对的,这违背了编程语言的用途,即自动化无聊的东西:)
        猜你喜欢
        • 1970-01-01
        • 2011-01-11
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多