在脚本中导入numpy语句
我是一名使用Matlab的程序员,也偶尔用Python做一些事情。Python中有一个非常基础的概念,就是关于from和import语句的用法,我还没有完全搞明白。
当我从bitarray模块中导入bitarray时(我这样说对吗?),在后面的代码中我只需要直接调用它的方法就可以了,像例子1那样。但是,当我导入numpy时,例子2中的代码就会报错,我必须使用例子3中的语句,然后在使用它的方法之前加上np.,这样才行,这样理解是没问题的。我也可以用类似的语法导入bitarray,像例子4那样……为什么例子2不工作,而例子1却可以呢?我希望能有个简单的解释 :)
1)
from bitarray import bitarray
2)
from numpy import numpy
3)
import numpy as np
4)
import bitarray as pp
2 个回答
1) 如果 bitarray
是库 bitarray
中的一个 函数 或 类 名字,那这样用是完全可以的。
2) 这不太合理,因为 numpy
里没有叫 numpy
的函数。
3) 这样做是没问题的,因为你是在导入一个库,并给它起了个别名。
4) 这样做也没问题,因为你同样是在用别名导入。
这是因为 bitarray
和 numpy
的包结构不同;具体来说,一个包里有一个和模块同名的对象,而另一个没有。
bitarray
模块里有一个叫 bitarray
的类,(类似的,标准库里的 datetime
模块也包含一个 datetime
类)。所以下面这两种写法是等价的:
from bitarray import bitarray
ba = bitarray(...)
和
import bitarray
ba = bitarray.bitarray(...)
在第一种情况下,我们是直接从模块中把 类 bitarray
导入到当前的命名空间;而在第二种情况下,我们是把整个模块作为 bitarray
导入,然后需要通过模块的命名空间来访问这个类。
相比之下,numpy
模块里没有一个叫 numpy
的对象,所以
from numpy import numpy
这样写是行不通的。
as
是单独的;它只是让你可以给导入的东西起个别名,所以下面这些写法都是可以的:
import numpy as np
a = np.array(...)
from bitarray import bitarray as pp
b = pp(...)
import bitarray as pp
b = pp.bitarray(...)
正如 mauve
上面提到的,你可以使用 *
这个“通配符导入”来导入所有内容,所以:
from numpy import *
from bitarray import *
会把这两个模块里的所有顶层名称都导入到当前的命名空间。之后,比如说:
a = array(...)
b = bitarray(...)
都能正常工作。不过,这种做法 不推荐,因为通常来说这是个坏主意——例如,numpy
里有一个 all
的定义,如果你导入了所有内容,它会覆盖掉同名的内置函数。
而且,这样会让任何阅读你代码的人(包括未来的你自己!)很难搞清楚正在使用的类和函数是从哪里来的。对比一下:
from numpy import *
from random import *
a = choice([1, 2, 3]) # which module did choice come from?
b = all(x == y for x in l) # is this numpy's all or the built-in?
和下面这个更清晰的:
import numpy as np
import random
a = random.choice([1, 2, 3]) # clearly from random
b = all(x == y for x in l) # must be the built-in, not np.all()