成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python小記(一):import和from。。。import區(qū)別?

番茄西紅柿 / 3076人閱讀

摘要:而當(dāng)我們時(shí)這個是一個類我們稱呼它為函數(shù)。后兩者是常量用于忽略換行符和大小寫。這就會導(dǎo)致很多難以覺察的潛在。結(jié)論無論是使用還是第一個要求是代碼能夠正常運(yùn)行其次根據(jù)代碼維護(hù)性團(tuán)隊(duì)編碼風(fēng)格來確定選擇哪一種方案。

系統(tǒng)自帶模塊(庫)

```cppimport retarget = 'abc1234xyz're.search('(/d+)', target)
但有時(shí)候,你可能會看到某些人這樣寫代碼:```pythonfrom re import searchtarget = 'abc1234xyz'search('(/d+)', target)

那么這兩種導(dǎo)入方式有什么區(qū)別呢?

我們分別使用type函數(shù)來看看他們的類型:

>>> import re>>> type(re)<class 'module'>>>> from re import search>>> type(search)<class 'function'>

可以看到,直接使用import re導(dǎo)入的re它是一個module類,也就是模塊。我們把它成為正則表達(dá)式模塊。而當(dāng)我們from re import search時(shí),這個search是一個function類,我們稱呼它為search 函數(shù)。
一個模塊里面可以包含多個函數(shù)。
如果在你的代碼里面,你已經(jīng)確定只使用search函數(shù),不會再使用正則表達(dá)式里面的其他函數(shù)了,那么你使用兩種方法都可以,沒什么區(qū)別。
但是,如果你要使用正則表達(dá)式下面的多個函數(shù),或者是一些常量,那么用第一種方案會更加簡潔清晰。

例如:

import rere.search('c(.*?)x', flags=re.S)re.sub('[a-zA-Z0-9]', '***', target, flags=re.I)

在這個例子中,你分別使用了re.search,re.sub,re.S和re.I。后兩者是常量,用于忽略換行符和大小寫。
但是,如果你使用from re import search, sub, S, I來寫代碼,那么代碼就會變成這樣:

import research('c(.*?)x', flags=S)sub('[a-zA-Z0-9]', '***', target, flags=I)

看起來雖然簡潔了,但是,一旦你的代碼行數(shù)多了以后,你很容易忘記S和I這兩個變量是什么東西。而且我們自己定義的函數(shù),也很有可能取名為sub或者search,從而覆蓋正則表達(dá)式模塊下面的這兩個同名函數(shù)。這就會導(dǎo)致很多難以覺察的潛在 bug。
再舉一個例子。Python 的 datetime模塊,我們可以直接import datetime,此時(shí)我們導(dǎo)入的是一個datetime模塊,

輸出為:class‘module’

但是如果你寫為from datetime import datetime,那么你導(dǎo)入的datetime是一個type類:

輸出為:classtype

因?yàn)檫@種方式導(dǎo)入的datetime,它就是Python 中的一種類型,用于表示包含日期和時(shí)間的數(shù)據(jù)。

這兩種導(dǎo)入方式導(dǎo)入的datetime,雖然名字一樣,但是他們的意義完全不一樣,請大家觀察下面兩種寫法:

import datetimenow = datetime.datetime.now()one_hour_ago = now - datetime.timedelta(hours=1)from datetime import datetime, timedeltanow = datetime.now()one_hour_ago = now - timedelta(hours=1)

第二種寫法看似簡單,但實(shí)則改動起來卻更為麻煩。例如我還需要增加一個變量today用于記錄今日的日期。

對于第一段代碼,我們只需要增加一行即可:

today = datetime.date.today()

但對于第二行來說,我們需要首先修改導(dǎo)入部分的代碼:

from datetime import datetime, timedelta, date
然后才能改代碼:today = date.today()

這樣一來你就要修改兩個地方,反倒增加了負(fù)擔(dān)。

第三方庫

在使用某些第三方庫的代碼里面,我們會看到類似這樣的寫法:

from lxml.html import fromstring

selector = fromstring(HTML)
但是我們還可以寫為:

from lxml import html

selector = html.fromstring(HTML)
但是,下面這種寫法會導(dǎo)致報(bào)錯:

import lxml
selector = lxml.html.fromstring(HTML)
那么這里的lxml.html又是什么東西呢?

這種情況多常見于一些特別大型的第三方庫中,這種庫能處理多種類型的數(shù)據(jù)。例如lxml它既能處理xml的數(shù)據(jù),又能處理html的數(shù)據(jù),于是這種庫會劃分子模塊,lxml.html模塊專門負(fù)責(zé)html相關(guān)的數(shù)據(jù)。

動手試試

在使用某些第三方庫的代碼里面,我們會看到類似這樣的寫法:

 from lxml.html import fromstring selector = fromstring(HTML)

但是我們還可以寫為:

from lxml import htmlselector = html.fromstring(HTML)

但是,下面這種寫法會導(dǎo)致報(bào)錯:

import lxmlselector = lxml.html.fromstring(HTML)

那么這里的lxml.html又是什么東西呢?
這種情況多常見于一些特別大型的第三方庫中,這種庫能處理多種類型的數(shù)據(jù)。例如lxml它既能處理xml的數(shù)據(jù),又能處理html的數(shù)據(jù),于是這種庫會劃分子模塊,lxml.html模塊專門負(fù)責(zé)html相關(guān)的數(shù)據(jù)。

自己來實(shí)現(xiàn)多種導(dǎo)入方法
我們現(xiàn)在自己來寫代碼,實(shí)現(xiàn)這多種導(dǎo)入方法。
我們創(chuàng)建一個文件夾DocParser,在里面分別創(chuàng)建兩個文件main.py和util.py,他們的內(nèi)容如下:

util.py文件:

def write():    print('write 函數(shù)被調(diào)用!')main.py文件:import utilutil.write()

現(xiàn)在我們把main.py的導(dǎo)入方式修改一下(結(jié)果與上面相同):

from util import writewrite()

現(xiàn)在,我們來創(chuàng)建一個文件夾microsoft,里面再添加一個文件parse.py:

def read():    print('我是 microsoft 文件夾下面的 parse.py 中的 read函數(shù)')

此時(shí)我們在 main.py中對它進(jìn)行調(diào)用:

from microsoft import parseparse.read()

我們也可以用另一種方法:

from microsoft.parse import readread()

但是,你不能直接導(dǎo)入microsoft
import microsoft
microsoft.parse.read

無論你使用的是import xxx還是from xxx.yyy.zzz.www import qqq,你導(dǎo)入進(jìn)來的東西,要不就是一個模塊(對應(yīng)到.py 文件的文件名),或者是某個.py 文件中的函數(shù)名、類名、變量名。

無論是import xxx還是from xxx import yyy,你導(dǎo)入進(jìn)來的都不能是一個文件夾的名字。

可能有這樣一種情況,就是某個函數(shù)名與文件的名字相同,例如:

在 microsoft文件夾里面有一個microsoft.py文件,這個文件里面有一個函數(shù)叫做microsoft,那么你的代碼可以寫為:

from microsoft import microsoft`
microsoft.microsoft()
但請注意分辨,這里你導(dǎo)入的還是模塊,只不過microsoft.py文件名與它所在的文件夾名恰好相同而已。

結(jié)論

無論是使用import還是from import,第一個要求是代碼能夠正常運(yùn)行,其次,根據(jù)代碼維護(hù)性,團(tuán)隊(duì)編碼風(fēng)格來確定選擇哪一種方案。

如果我們只會使用到某個模塊下面的一個函數(shù)(或者常量、類)并且名字不會產(chǎn)生混淆,可識別性高,那么from 模塊名 import 函數(shù)名這沒有什么問題。

如果我們會用到一個模塊下面的多個函數(shù),或者是我們將要使用的函數(shù)名、常量名、類名可能會讓人產(chǎn)生混淆(例如 re.S、re.I),那么這種情況下,import 模塊名然后再 模塊名.xxx來調(diào)用會讓代碼更加清晰,更好維護(hù)。

但無論什么情況下,都禁止使用from xxx import *這種寫法,它會給你帶來無窮無盡的噩夢。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/119990.html

相關(guān)文章

  • python小記

    摘要:提示由于水平有限,如發(fā)現(xiàn)有疑問或錯誤的地方請毫不客氣的提出討論我會在第一時(shí)間回復(fù)感謝在先重要的事情說三遍查看文檔的時(shí)候方法執(zhí)行一定添加查看文檔的時(shí)候方法執(zhí)行一定添加獲取幫助方法查看另一種方法查看中內(nèi)置方法問題描述在樹莓派支持的上面最后提示安 提示:由于水平有限,如發(fā)現(xiàn)有疑問或錯誤的地方請毫不客氣的提出、討論,我會在第一時(shí)間回復(fù),感謝在先 重要的事情說三遍 查看module文檔的時(shí)候方...

    baiy 評論0 收藏0
  • react-router 升級小記

    摘要:前言最近將公司項(xiàng)目的從版本升到了版本,跟完全不兼容,是一次徹底的重寫。升級過程中踩了不少的坑,也有一些值得分享的點(diǎn)。沒有就會匹配所有路由最后不得不說升級很困難,坑也很多。 前言 最近將公司項(xiàng)目的 react-router 從 v3 版本升到了 v4 版本,react-router v4 跟 v3 完全不兼容,是一次徹底的重寫。這也給升級造成了極大的困難,與其說升級不如說是對 route...

    isLishude 評論0 收藏0
  • Vuex 升級入坑小記

    摘要:升級入坑小記場景描述引入的版本為,開啟調(diào)試工具默認(rèn)升級后可以調(diào)試。遂升級,發(fā)現(xiàn)大量使用失效,報(bào),的中文文檔,沒有及時(shí)更新。機(jī)票訂單和用戶信息。 Vuex 升級入坑小記 場景描述 引入Vuex的版本為0.3,開啟調(diào)試工具默認(rèn)升級后可以調(diào)試Vuex。給作者一個大大的贊。為提高開發(fā)體驗(yàn)也是操碎了心 (??????)?? (8。安利下(Vue Devtools)。 Vue Devtools ...

    ziwenxie 評論0 收藏0
  • Vue2學(xué)習(xí)小記-給Vue2路由導(dǎo)航鉤子axios攔截器做個封裝

    摘要:寫在前面最近在學(xué)習(xí),遇到有些頁面請求數(shù)據(jù)需要用戶登錄權(quán)限服務(wù)器響應(yīng)不符預(yù)期的問題,但是總不能每個頁面都做單獨(dú)處理吧,于是想到提供了攔截器這個好東西,再于是就出現(xiàn)了本文。 1.寫在前面 最近在學(xué)習(xí)Vue2,遇到有些頁面請求數(shù)據(jù)需要用戶登錄權(quán)限、服務(wù)器響應(yīng)不符預(yù)期的問題,但是總不能每個頁面都做單獨(dú)處理吧,于是想到axios提供了攔截器這個好東西,再于是就出現(xiàn)了本文。 2.具體需求 用戶鑒...

    Tikitoo 評論0 收藏0
  • 微信公眾號開發(fā)小記——2.80端口上的服務(wù)

    摘要:微信在做一些操作是需要用到生成二維碼等而每天接口的調(diào)用上限為,需要自己做緩存文檔講了幾種方式,我覺得放在中拿比較妥當(dāng)。微信菜單會緩存分鐘,你可以取消關(guān)注,然后在關(guān)注查看菜單變化效果。 描述 微信公眾號開發(fā)基本分為2大種類型 1.用戶直接做了某些操作(回復(fù)信息、訂閱、掃碼、發(fā)語音、點(diǎn)按鈕等),此時(shí)這些信息微信會發(fā)送到微信服務(wù)器的80端口,這是一種開發(fā)類型;2.通過連接(按鈕、文章)引導(dǎo)用...

    frank_fun 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<