我最近使用了math
模块。我不想一直写math.sqrt(x)
和math.sin(x)
。我想缩短它并写下sqrt(x)
和sin(x)
。
怎么样?
答案 0 :(得分:6)
对于较长的模块名称,通常会缩短它们,例如
import numpy as np
然后你可以使用短名称。或者你可以导入你需要的特定东西,如其他的anwsers所示:
from math import sin, sqrt
这通常用在包内,用于更紧密耦合的代码。对于图书馆而言,名称缩短的第一个选项通常是首选方式。
从不所做的是使用from math import *
表单。它会污染名称空间,可能导致名称冲突并使调试更加困难。最重要的是,它使代码难以阅读,因为不清楚特定功能的来源。
可以在交互式解释器中进行异常。但是一旦你养成使用缩写名称的习惯,就可能不值得去那里使用其他约定。
答案 1 :(得分:5)
您可以像这样导入:
>>> 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
请注意,一般来说,从模块或包导入*的做法是不受欢迎的,因为它经常会导致代码难以理解。但是,可以使用它来保存交互式会话中的输入。
答案 2 :(得分:5)
from math import sin, sqrt
# Then you can just do
sqrt(4)
答案 3 :(得分:1)
让我补充一点,我不仅考虑from math import *
名称空间污染,还考虑from math import cos
。这是因为当您在模块foo
之上执行此操作时,然后使用import foo; print( dir( foo ) )
查看该模块的命名空间,您将在该列表中有一个项cos
。通常,这不是你想要的。
因此大部分时间我的所有导入都看起来像from math import cos as _cos
,前导下划线是表示私人名称的传统印记。我们的想法是从另一个模块和打印输出import foo; print( name for name in dir( foo ) if not name.startswith( '_' ) )
导入,将准确地将那个在该模块中定义的名称公之于众。
有一点需要注意:from math import cos as _cos; f = lambda x: _cos( x )
在功能上与import math; g = lambda x: math.cos( x )
不完全相同。不同的是,在python中,每次调用代码时,名称解析都会在运行时发生。在第一次导入时,名称cos
仅解析一次;对math
模块的任何后续更改都不会影响f()
。对于第二次导入,cos
每次调用时都会针对math
解析,因此对数学模块的cos
方法的更改将传播到{{1} }}。当然,g()
模块既不会在运行时期间发生变化,也不会在运行时更改模块的方法,这是一种特别值得推荐的编程技术。另一方面,一个模块就像python中的其他所有对象一样,所以总是要知道底层发生了什么是值得的。
通常,math
是您想要的,它也比第二种形式快一点。