我在我所有的 python 程序中都使用 pylab(更具体地说是 numpy)。异常(exception)情况非常罕见,如果有的话。到目前为止,我已经养成了通过以下方式导入 numpy 的习惯:
from numpy import *
这样做的好处是让 numpy 看起来从一开始就是 python 的一部分。在每个脚本中都像这样导入 numpy 有什么不好的地方吗?我的意思是除了每个脚本/程序都需要更多内存并且加载时间更长这一事实之外。
我认为总是必须在来自 numpy 的每个函数调用(例如,np.zeros(3)
)之前编写 numpy 甚至 np 是乏味的,因为它需要我知道哪个函数来自numpy 而不是。我真的不在乎 zeros 函数来自 numpy 还是 python,我只是想/需要使用它。
您认为哪种表示法更好?
最佳答案
使用
from numpy import *
改变any
、all
和求和
。例如,any([[False]]) # True all([[True, False], [False, False]]) # True sum([[1,2],[3,4]], 1) # TypeError: unsupported operand type(s) for +: 'int' and 'list'
然而,如果你使用
from numpy import *
那么值就完全不同了:from numpy import * any([[False]]) # False all([[True, False], [False, False]]) # False sum([[1,2],[3,4]], 1) array([3, 7])
可以通过这种方式找到完整的名称冲突集(感谢@Joe Kington 和@jolvi 指出这一点):
import numpy as np np_locals = set(np.__all__) builtins = set(dir(__builtins__)) print([name for name in np_locals.intersection(builtins) if not name.startswith('__')]) # ['any', 'all', 'sum']
这可能会导致非常困惑的错误,因为有人测试或使用您的 没有
from numpy import *
的 Python 解释器中的代码可能会完全看到 与你不同的行为。使用
from module import *
形式的多次导入可以复合 更多此类碰撞的问题。如果你改掉这个坏习惯 芽,你永远不必担心这个(可能混淆的)错误。如果两个模块重新定义相同的名称,导入的顺序也很重要。
这让人很难弄清楚函数和值的来源。
虽然可以使用
from numpy import *
并仍然访问 Python 的内置函数,但它很笨拙:from numpy import * any([[False]]) __builtins__.any([[False]])
可读性低于:
import numpy as np np.any([[False]]) any([[False]])
正如 Python 之禅所说,
Namespaces are a honking great idea -- let's use more of those!
我的建议是永远不要在任何脚本中使用 from module import *
。
关于numpy - 我应该使用 `from numpy import *` 将 numpy(或 pylab)用作 python 环境吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748895/