导入乌龟图形模块

1 投票
2 回答
2123 浏览
提问于 2025-04-18 03:39

我承认我刚开始学习Python 3.3中的turtle图形,跟着一个YouTube视频,我用了from turtle import *这条命令。这样我就可以用更简短的命令,比如fd(100),而不是更常见的turtle.forward(100)这种格式。

我有几个问题:

  1. 使用这种格式算不算是一个不好的捷径?
  2. 我怎么才能让Python IDLE不把每个命令都当成“海龟图形”来解释?
  3. 这个“ * ”符号是不是像通常那样,表示“所有的东西”?

如果我在一条帖子里问了多个问题,我提前道歉,但这些问题是相关的,这样问似乎更合理。

2 个回答

0

当你使用 from package import * 这个语句时,其实是在导入一个包里面所有可以选择的内容,这些内容是在包的 __init__.py 文件里通过 __all__ 变量定义的。需要注意的是,__all__ 这个变量可以不写,所以你最好查看一下具体的说明

大多数情况下,我会选择使用 "import package",这样可以避免弄乱命名空间。

2

一般来说,你确实应该避免使用这种形式 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代码更重要。

撰写回答