欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python import與from import使用和區(qū)別解讀

 更新時間:2021年09月22日 15:02:50   作者:Jeff.Ye  
Python程序可以調(diào)用一組基本的函數(shù)(即內(nèi)建函數(shù)),比如print()、input()和len()等函數(shù)。接下來通過本文給大家介紹Python import與from import使用及區(qū)別介紹,感興趣的朋友一起看看吧

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

```cpp
import re
target = 'abc1234xyz'
re.search('(\d+)', target)
但有時候,你可能會看到某些人這樣寫代碼:

```python
from re import search
target = 'abc1234xyz'
search('(\d+)', target)

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

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

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

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

例如:

import re
re.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 re
search('c(.*?)x', flags=S)
sub('[a-zA-Z0-9]', '***', target, flags=I)

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

輸出為:class‘module'

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

輸出為:class‘type'

因為這種方式導入的datetime,它就是Python 中的一種類型,用于表示包含日期和時間的數(shù)據(jù)。

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

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)

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

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

today = datetime.date.today()

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

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

這樣一來你就要修改兩個地方,反倒增加了負擔。

第三方庫

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

from lxml.html import fromstring

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

from lxml import html

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

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

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

動手試試

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

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

但是我們還可以寫為:

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

但是,下面這種寫法會導致報錯:

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

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

自己來實現(xiàn)多種導入方法
我們現(xiàn)在自己來寫代碼,實現(xiàn)這多種導入方法。
我們創(chuàng)建一個文件夾DocParser,在里面分別創(chuàng)建兩個文件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的導入方式修改一下(結(jié)果與上面相同):

from util import write
write()

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

from util import write
write()

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

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

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

from microsoft import parse
parse.read()

但是,你不能直接導入microsoft

import microsoft
microsoft.parse.read

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

無論是import xxx還是from xxx import yyy,你導入進來的都不能是一個文件夾的名字。

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

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

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

結(jié)論

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

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

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

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

到此這篇關(guān)于Python import與from import使用和區(qū)別解讀的文章就介紹到這了,更多相關(guān)Python import和from import區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python四種出行路線規(guī)劃的實現(xiàn)

    python四種出行路線規(guī)劃的實現(xiàn)

    路徑規(guī)劃中包括步行、公交、駕車、騎行等不同方式,今天借助高德地圖web服務(wù)api,實現(xiàn)出行路線規(guī)劃。感興趣的可以了解下
    2021-06-06
  • 在python中實現(xiàn)同行輸入/接收多個數(shù)據(jù)的示例

    在python中實現(xiàn)同行輸入/接收多個數(shù)據(jù)的示例

    今天小編就為大家分享一篇在python中實現(xiàn)同行輸入/接收多個數(shù)據(jù)的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 使用Python實現(xiàn)Excel文件轉(zhuǎn)換為SVG格式

    使用Python實現(xiàn)Excel文件轉(zhuǎn)換為SVG格式

    SVG(Scalable Vector Graphics)是一種基于XML的矢量圖像格式,這種格式在Web開發(fā)和其他圖形應(yīng)用中非常流行,提供了一種高效的方式來呈現(xiàn)復雜的矢量圖形,本文將介紹如何使用Python轉(zhuǎn)換Excel文件為SVG格式,需要的朋友可以參考下
    2024-07-07
  • Python3簡單爬蟲抓取網(wǎng)頁圖片代碼實例

    Python3簡單爬蟲抓取網(wǎng)頁圖片代碼實例

    這篇文章主要介紹了Python3簡單爬蟲抓取網(wǎng)頁圖片代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python+OpenCV繪制多instance的Mask圖像

    Python+OpenCV繪制多instance的Mask圖像

    Mask圖像中,不同值表示不同的實例(instance)。本文將詳細為大家講講如何利用OpenCV繪制多instance的Mask圖像,感興趣的可以學習一下
    2022-06-06
  • python實現(xiàn)感知機模型的示例

    python實現(xiàn)感知機模型的示例

    這篇文章主要介紹了python實現(xiàn)感知機模型的示例,幫助大家更好的理解和學習python 機器學習的相關(guān)知識,感興趣的朋友可以了解下
    2020-09-09
  • django執(zhí)行原始查詢sql,并返回Dict字典例子

    django執(zhí)行原始查詢sql,并返回Dict字典例子

    這篇文章主要介紹了django執(zhí)行原始查詢sql,并返回Dict字典例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 對Python中的條件判斷、循環(huán)以及循環(huán)的終止方法詳解

    對Python中的條件判斷、循環(huán)以及循環(huán)的終止方法詳解

    今天小編就為大家分享一篇對Python中的條件判斷、循環(huán)以及循環(huán)的終止方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 基于Python實現(xiàn)人像雪景小程序

    基于Python實現(xiàn)人像雪景小程序

    這篇文章主要介紹了通過Python實現(xiàn)的人像雪景小程序,小程序還會自動生成每一幀雪花飄落的圖片,跟GIF動態(tài)雪花人像圖,還不用自己錄制視頻看效果。感興趣的可以跟隨小編一起學習一下
    2021-12-12
  • Django基礎(chǔ)知識與基本應(yīng)用入門教程

    Django基礎(chǔ)知識與基本應(yīng)用入門教程

    這篇文章主要介紹了Django基礎(chǔ)知識與基本應(yīng)用,結(jié)合實例形式分析了Django框架基本的項目創(chuàng)建、啟動、查看版本等操作,并結(jié)合一個簡單的blog應(yīng)用示例分析了Django的基本使用方法,需要的朋友可以參考下
    2018-07-07

最新評論