【问题标题】:Importing Turtle graphics modules导入 Turtle 图形模块
【发布时间】:2014-04-22 05:47:23
【问题描述】:

我承认我刚刚开始使用 Python 3.3 中的 turtle 图形,并在 youtube 演示之后开始使用 from turtle import *。这允许使用 fd(100) 之类的短命令代替我经常看到的格式 turtle.forward(100) 等。

我的问题是:

  1. 在使用这种格式时,我是否使用了不可接受的快捷方式?
  2. 如何阻止 Python IDLE 将这种格式的每个命令解释为“海龟图形”?
  3. “*”后缀是否像通常那样表示“一切”?

如果我不应该在一篇文章中提出多个问题,我提前道歉,但它们彼此相关,这似乎合乎逻辑。

【问题讨论】:

  • 感谢您的回答,“Michael10x2a”和“dryatu”,在 77 岁时,学习曲线有时似乎相当陡峭。

标签: python turtle-graphics


【解决方案1】:

一般来说,是的,您确实希望避免使用from module import * 形式。这样做的目的是打开模块(一个普通的 python 文件),并从本质上获取该文件中定义的每个函数、类等,并将其添加到您的命名空间。你是对的——* 确实意味着“一切”。

所以,如果我编写了一个名为 foo.py 的模块,其中包含一个名为 bar1bar2 等的函数,那么执行 from foo import * 将允许我使用这些函数,就像我在当前文件中定义它一样:

from foo import *

bar1()
bar2()
# etc

这不好的主要原因是它需要未知数量的函数和类并将其转储到您的命名空间中。当你突然开始使用一个函数时,很难跟踪更大的代码库中发生的事情。例如:

from a import *
from b import *
from c import *
# etc

example()
# Where did this come from? From module a, b, or c? What if both a and b define a 
# function named 'example'? 

您已经知道import module; module.function 表单,但还有第三种表单也很有用:

from turtle import fd, right, left  # etc

right(90)
fd(100)
backwards(300) # throws an error!
forwards(300)  # throws an error!

现在,我可以挑选我想要的函数,知道它们来自哪里,并避免污染我的命名空间。

但是,在你的情况下,我不会太担心。由于您正在试验和学习如何使用 turtle 模块,我认为专注于这方面比编写完美地道的 Python 更重要。

【讨论】:

  • 最后一种格式的一个优点是您可以轻松找到每个函数的来源。
【解决方案2】:

通过使用from package import *,您只是导入了在您从中导入的包定义的__init__.py 文件的__all__ 变量中可选定义的所有内容。 __all__ 变量可以省略,这就是为什么你应该read the details

大多数时候我会使用“导入包”来避免污染命名空间。

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2019-05-23
    • 2011-05-03
    • 2019-02-22
    • 2019-12-18
    • 2020-06-20
    • 1970-01-01
    • 2013-07-05
    • 2019-03-11
    相关资源
    最近更新 更多