在python中导入模块时,如何避免一直写入模块名称?

在python中导入模块时,如何避免一直写入模块名称?,python,module,import,Python,Module,Import,我最近经常使用数学模块。我不想一直写math.sqrt(x)和math.sin(x)。我想缩短它并编写sqrt(x)和sin(x)。 如何导入?您可以这样导入: >>> from math import sqrt, sin >>> sqrt(100) 10.0 发件人: import语句的一个变体是将名称从模块直接导入导入模块的符号表中。例如: >>> from fibo import fib, fib2 >>> fib(

我最近经常使用
数学
模块。我不想一直写
math.sqrt(x)
math.sin(x)
。我想缩短它并编写
sqrt(x)
sin(x)

如何导入?

您可以这样导入:

>>> from math import sqrt, sin
>>> sqrt(100)
10.0
发件人:

import语句的一个变体是将名称从模块直接导入导入模块的符号表中。例如:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
甚至还有一个变量可以导入模块定义的所有名称,这些名称在交互式解释器中很有用:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
请注意,通常不赞成从模块或包导入*的做法,因为这通常会导致代码可读性差。但是,可以使用它来保存交互式会话中的键入


对于较长的模块名称,通常会缩短它们,例如

import numpy as np
然后你可以用这个短名字。或者您可以导入所需的特定内容,如其他Anwser中所示:

from math import sin, sqrt
这通常在包内使用,用于更紧密耦合的代码。对于库来说,第一个名称缩短的选项通常是首选的方式

你永远不应该做的是使用来自数学导入的
*
表单。它将污染名称空间,可能导致名称冲突,并使调试更加困难。最重要的是,它使代码难以阅读,因为不清楚特定函数的来源


可以在交互式解释器中进行例外。但是,一旦你习惯了使用更短的名字,就不值得再去使用另一个约定了。

< P>让我补充一下,我不仅从数学导入*/CODE中考虑<代码> >命名空间污染,而且还从数学导入COS <代码>。这是因为当您在模块
foo
上执行此操作时,然后使用
import foo查看该模块的名称空间;打印(dir(foo))
,您将在该列表中有一个项目
cos
。通常,这不是你想要的

因此,大多数情况下,我所有的导入都像math import cos as _cos中的
,前面的下划线是表示私有名称的常规符号。其思想是从另一个模块导入和打印输出,
importfoo;print(dir(foo)中name的name,如果不是name.startswith(“”)
将为您提供该模块中定义为public的名称

有一件事需要注意:
从math import cos as_cos;f=lambda x:_cos(x)
在功能上与导入数学不完全相同;g=lambda x:math.cos(x)
。不同之处在于,在python中,名称解析发生在运行时,每次调用代码时。第一次导入时,名称
cos
只解析一次;对
math
模块的任何后续更改都不会影响
f()
。在第二次导入中,
cos
将在每次调用时根据
math
解析,因此对数学模块的
cos
方法的更改将传播到
g()
。当然,
math
模块在运行时不会更改,在运行时更改模块的方法也不是特别值得推荐的编程技术。另一方面,模块就像python中的其他东西一样,只是一个对象,因此始终注意引擎盖下发生的事情是值得的

通常,
从数学导入cos作为_cos;f=lambda x:_cos(x)
是您想要的,它也比第二种形式快一点

from math import sin, sqrt