您好,登錄后才能下訂單哦!
這篇文章主要介紹Python中import與from import有什么區(qū)別,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
```cpp import re target = 'abc1234xyz' re.search('(\d+)', target)
但有時(shí)候,你可能會(huì)看到某些人這樣寫(xiě)代碼: ```python from re import search target = 'abc1234xyz' search('(\d+)', target)
那么這兩種導(dǎo)入方式有什么區(qū)別呢?
我們分別使用type函數(shù)來(lái)看看他們的類(lèi)型:
>>> import re >>> type(re) <class 'module'> >>> from re import search >>> type(search) <class 'function'>
可以看到,直接使用import re導(dǎo)入的re它是一個(gè)module類(lèi),也就是模塊。我們把它成為正則表達(dá)式模塊。而當(dāng)我們from re import search時(shí),這個(gè)search是一個(gè)function類(lèi),我們稱(chēng)呼它為search 函數(shù)。
一個(gè)模塊里面可以包含多個(gè)函數(shù)。
如果在你的代碼里面,你已經(jīng)確定只使用search函數(shù),不會(huì)再使用正則表達(dá)式里面的其他函數(shù)了,那么你使用兩種方法都可以,沒(méi)什么區(qū)別。
但是,如果你要使用正則表達(dá)式下面的多個(gè)函數(shù),或者是一些常量,那么用第一種方案會(huì)更加簡(jiǎn)潔清晰。
例如:
import re re.search('c(.*?)x', flags=re.S) re.sub('[a-zA-Z0-9]', '***', target, flags=re.I)
在這個(gè)例子中,你分別使用了re.search,re.sub,re.S和re.I。后兩者是常量,用于忽略換行符和大小寫(xiě)。
但是,如果你使用from re import search, sub, S, I來(lái)寫(xiě)代碼,那么代碼就會(huì)變成這樣:
import re search('c(.*?)x', flags=S) sub('[a-zA-Z0-9]', '***', target, flags=I)
看起來(lái)雖然簡(jiǎn)潔了,但是,一旦你的代碼行數(shù)多了以后,你很容易忘記S和I這兩個(gè)變量是什么東西。而且我們自己定義的函數(shù),也很有可能取名為sub或者search,從而覆蓋正則表達(dá)式模塊下面的這兩個(gè)同名函數(shù)。這就會(huì)導(dǎo)致很多難以覺(jué)察的潛在 bug。
再舉一個(gè)例子。Python 的 datetime模塊,我們可以直接import datetime,此時(shí)我們導(dǎo)入的是一個(gè)datetime模塊,
輸出為:class‘module'
但是如果你寫(xiě)為from datetime import datetime,那么你導(dǎo)入的datetime是一個(gè)type類(lèi):
輸出為:class‘type'
因?yàn)檫@種方式導(dǎo)入的datetime,它就是Python 中的一種類(lèi)型,用于表示包含日期和時(shí)間的數(shù)據(jù)。
這兩種導(dǎo)入方式導(dǎo)入的datetime,雖然名字一樣,但是他們的意義完全不一樣,請(qǐng)大家觀察下面兩種寫(xiě)法:
import datetime now = datetime.datetime.now() one_hour_ago = now - datetime.timedelta(hours=1) from datetime import datetime, timedelta now = datetime.now() one_hour_ago = now - timedelta(hours=1)
第二種寫(xiě)法看似簡(jiǎn)單,但實(shí)則改動(dòng)起來(lái)卻更為麻煩。例如我還需要增加一個(gè)變量today用于記錄今日的日期。
對(duì)于第一段代碼,我們只需要增加一行即可:
today = datetime.date.today()
但對(duì)于第二行來(lái)說(shuō),我們需要首先修改導(dǎo)入部分的代碼:
from datetime import datetime, timedelta, date
然后才能改代碼:today = date.today()
這樣一來(lái)你就要修改兩個(gè)地方,反倒增加了負(fù)擔(dān)。
在使用某些第三方庫(kù)的代碼里面,我們會(huì)看到類(lèi)似這樣的寫(xiě)法:
from lxml.html import fromstring
selector = fromstring(HTML)
但是我們還可以寫(xiě)為:
from lxml import html
selector = html.fromstring(HTML)
但是,下面這種寫(xiě)法會(huì)導(dǎo)致報(bào)錯(cuò):
import lxml
selector = lxml.html.fromstring(HTML)
那么這里的lxml.html又是什么東西呢?
這種情況多常見(jiàn)于一些特別大型的第三方庫(kù)中,這種庫(kù)能處理多種類(lèi)型的數(shù)據(jù)。例如lxml它既能處理xml的數(shù)據(jù),又能處理html的數(shù)據(jù),于是這種庫(kù)會(huì)劃分子模塊,lxml.html模塊專(zhuān)門(mén)負(fù)責(zé)html相關(guān)的數(shù)據(jù)。
在使用某些第三方庫(kù)的代碼里面,我們會(huì)看到類(lèi)似這樣的寫(xiě)法:
from lxml.html import fromstring selector = fromstring(HTML)
但是我們還可以寫(xiě)為:
from lxml import html selector = html.fromstring(HTML)
但是,下面這種寫(xiě)法會(huì)導(dǎo)致報(bào)錯(cuò):
import lxml selector = lxml.html.fromstring(HTML)
那么這里的lxml.html又是什么東西呢?
這種情況多常見(jiàn)于一些特別大型的第三方庫(kù)中,這種庫(kù)能處理多種類(lèi)型的數(shù)據(jù)。例如lxml它既能處理xml的數(shù)據(jù),又能處理html的數(shù)據(jù),于是這種庫(kù)會(huì)劃分子模塊,lxml.html模塊專(zhuān)門(mén)負(fù)責(zé)html相關(guān)的數(shù)據(jù)。
自己來(lái)實(shí)現(xiàn)多種導(dǎo)入方法
我們現(xiàn)在自己來(lái)寫(xiě)代碼,實(shí)現(xiàn)這多種導(dǎo)入方法。
我們創(chuàng)建一個(gè)文件夾DocParser,在里面分別創(chuàng)建兩個(gè)文件main.py和util.py,他們的內(nèi)容如下:
util.py文件:
def write(): print('write 函數(shù)被調(diào)用!') main.py文件: import util util.write()
現(xiàn)在我們把main.py的導(dǎo)入方式修改一下(結(jié)果與上面相同):
from util import write write()
現(xiàn)在,我們來(lái)創(chuàng)建一個(gè)文件夾microsoft,里面再添加一個(gè)文件parse.py:
from util import write write()
此時(shí)我們?cè)?main.py中對(duì)它進(jìn)行調(diào)用:
def read(): print('我是 microsoft 文件夾下面的 parse.py 中的 read函數(shù)')
我們也可以用另一種方法:
from microsoft import parse parse.read()
但是,你不能直接導(dǎo)入microsoft
import microsoft
microsoft.parse.read
無(wú)論你使用的是import xxx還是from xxx.yyy.zzz.www import qqq,你導(dǎo)入進(jìn)來(lái)的東西,要不就是一個(gè)模塊(對(duì)應(yīng)到.py 文件的文件名),或者是某個(gè).py 文件中的函數(shù)名、類(lèi)名、變量名。
無(wú)論是import xxx還是from xxx import yyy,你導(dǎo)入進(jìn)來(lái)的都不能是一個(gè)文件夾的名字。
可能有這樣一種情況,就是某個(gè)函數(shù)名與文件的名字相同,例如:
在 microsoft文件夾里面有一個(gè)microsoft.py文件,這個(gè)文件里面有一個(gè)函數(shù)叫做microsoft,那么你的代碼可以寫(xiě)為:
from microsoft import microsoft`
microsoft.microsoft()
但請(qǐng)注意分辨,這里你導(dǎo)入的還是模塊,只不過(guò)microsoft.py文件名與它所在的文件夾名恰好相同而已。
以上是“Python中import與from import有什么區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。