2010-08-13 109 views

回答

6

對於更長的模塊名稱是很常見的縮短它們,例如

import numpy as np 

然後您可以使用短名稱。或者你可以導入具體的東西,你需要,如在其他anwsers:

from math import sin, sqrt 

這通常被用來包裝內,對於更加緊密耦合的代碼。對於圖書館來說,縮短名稱的第一個選項通常是首選方式。

你應該怎麼做從來沒有做的是使用from math import *的形式。它會污染名稱空間,可能會導致名稱衝突並使調試更加困難。最重要的是它使代碼很難閱讀,因爲不清楚某個特定功能的來源。

交互式解釋程序可能會出現異常。但是,一旦你習慣使用縮短的名字,那麼可能不值得在那裏與另一個大會一起去。

5

可以導入這樣的:

>>> from math import sqrt, sin 
>>> sqrt(100) 
10.0 

來源:More on modules

有從一個模塊直接進口的名字進入進口模塊的符號表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 

注意,在進口*從一般的做法模塊或軟件包是不贊成的,因爲它經常會導致代碼難讀。但是,可以使用它來保存交互式會話中的輸入。

5
from math import sin, sqrt 
# Then you can just do 
sqrt(4) 
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方法的更改將傳播到g()。當然,math模塊既不會在運行時發生變化,也不會在運行時更改模塊的方法,這是一種特別值得推薦的編程技術。另一方面,一個模塊就像Python中的其他所有東西一樣,所以它總是能夠意識到引擎蓋下發生了什麼。

通常,from math import cos as _cos; f = lambda x: _cos(x)是你想要的,它也比第二種形式快一點。

相關問題