导入乌龟图形模块
我承认我刚开始学习Python 3.3中的turtle
图形,跟着一个YouTube视频,我用了from turtle import *
这条命令。这样我就可以用更简短的命令,比如fd(100),而不是更常见的turtle.forward(100)
这种格式。
我有几个问题:
- 使用这种格式算不算是一个不好的捷径?
- 我怎么才能让Python IDLE不把每个命令都当成“海龟图形”来解释?
- 这个“ * ”符号是不是像通常那样,表示“所有的东西”?
如果我在一条帖子里问了多个问题,我提前道歉,但这些问题是相关的,这样问似乎更合理。
2 个回答
当你使用 from package import *
这个语句时,其实是在导入一个包里面所有可以选择的内容,这些内容是在包的 __init__.py
文件里通过 __all__
变量定义的。需要注意的是,__all__
这个变量可以不写,所以你最好查看一下具体的说明。
大多数情况下,我会选择使用 "import package",这样可以避免弄乱命名空间。
一般来说,你确实应该避免使用这种形式 from module import *
。这样做的结果是,它会打开一个模块(就是一个普通的Python文件),然后把这个文件里定义的所有函数、类等等都放到你的命名空间里。没错,*
的意思就是“所有的东西”。
举个例子,如果我写了一个叫 foo.py
的模块,里面有一个叫 bar1
、bar2
等等的函数,那么使用 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代码更重要。