Python模塊管理的入門詳解,初學者福利

我在寫第一行Python之前,以爲自己是一個C/C++、JAVA程序員,每天寫着大段大段 “高端” 代碼樂在其中。

這會順便去以前的博客掐了一段10年前寫過的一段C++的代碼,如果沒有備註的話今天我都不這麼看得懂當初在寫什麼了。

// 文件下載 int fwrite(void *buffer, size_t size, size_t nmemb, void *stream){ struct FtpFile *out = (struct FtpFile *)stream; if (out && !out->stream) { out->stream = fopen(out->filename, “wb”); if (!out->stream) { return -1; } } return fwrite(buffer, size, nmemb, out->stream); }

在我寫了2年C++代碼之後,雖然做了一些桌面應用產品,但是我自己一直都不好意思說自己會C和C++,總覺得智商受到了挑戰,沒學好。

直到因爲一個Web項目開始寫Python之後,我發覺世界簡單了很多,好像Python是專門爲我這種天生智力不足的程序員準備的,用起來順手多了。

原因只有一個,我其實是一個 “二手程序員“,更喜歡拿來主義,直接用別人做好的、現成的東西組裝一下就能用。

就跟現在網上流行的說法:後端程序員是CRUD BOY,搞算法的是調參俠,前端程序員是切圖員等等諸如此類,主要是爲了調侃平時絕大部分程序員做的應用都偏業務層面,沒有太多高精尖的技術可言,沒有底層組件的研究、沒有什麼芯片開發、新的圖像技術突破等等,當然這絕大部分也包括我在內。

不過我們不用爲此感到羞愧,因爲即使是拿來主義,也要明白通過什麼方式拿來並使用。

今天來講講Python的模塊管理,看看我們是怎麼直接用別人現成代碼的。

正在學習的小夥伴,推薦我們的Python學習扣qun:784758214 ,看看前輩們是如何學習的!從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF,實戰源碼】,零基礎到項目實戰的資料都有整理。送給每一位python的小夥伴!每天都有大牛定時講解Python技術,分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地

知識點:

  • python的 “main函數”

  • import 的使用方式

  • 模塊、包、庫的概念

  • init.py的用處

Python的 “main函數”

在很多語言裏,都有一個叫做main函數的東西,通常用於定義一個程序的入口,意思就是當程序啓動時要乾的事情。

在C語言裏差不多長成這樣。

int main( void ) { return 0; }

在JAVA裏就挺瑣碎了。

public class AClass {   public static void main(String[] args) {   System.out.println(“hello world”);   } }

這些語言都用了一個明確的內置函數名(main) 去確定程序的入口,那麼Python有main函數嗎?

事實上是沒有的,Python沒有一個內置函數來定義程序的入口,而是用到了一下這種方式。

以上7行代碼我們來分別解讀一下。

首先運行程序後會執行第4行的print(‘start’),然後第5行用了一個邏輯判斷,來定義了一個僞main函數,並且打印hello world,以及執行fun1函數。

我們看到邏輯判斷裏用了一個__name__ 的內部變量,它的值是什麼呢?

默認情況下一個python源文件在被執行時,它的__name__變量的值就是 字符串格式的 main,大家可以自行打印試驗一下。

那麼爲什麼需要有這麼一個東西呢?我們不用它一樣可以按照順序執行代碼啊?

在這裏我們再來看一個例子。

我對剛纔那個one.py文件做了下改進,增加了一行代碼,用於打印了當前模塊的__name__ 值。

然後我新增了一個叫 two.py的文件,我們來看看two.py的內容和執行結果

我們用到了一個import的語句,它的用處就是導入其他的py文件,作爲當前程序的一個模塊。

但是我們發覺當我導入one這個模塊時,它只打印了它的__name__ 值和start字符串,並沒有執行別的東西。

然後第二行代碼我們同樣輸出了當前two.py 文件裏 name 的值。

看到這裏不知道各位有沒有發覺一個規律,**那就是如果一個Python程序文件被其他的程序文件通過import語句導入之後,不會執行被導入文件中的“main”函數,因爲它的__name__值已經不是__main__了,**我們可以簡單粗暴的認爲,誰的程序文件當前在被Python執行,誰纔有main函數,其他的文件只能作爲當前程序文件的一個模塊存在。

反過來也是一樣,我們也可以在one.py裏去import two。

通過以上的例子我們至少學到兩個東西。

  • 第一是Python程序文件可以被其他程序文件在自己內部直接import(引用),引用的對象我們就稱之爲模塊

  • 第二是我們可以利用Python “main” 函數這個特性去做不少事情,例如我寫一個模塊文件,包括很多類,很多函數,然後在main裏面去對當前模塊進行測試和調用。當前模塊被其他程序引用時,不會執行"main"函數裏的測試代碼,保證了測試和被調用兩不誤。

import用法

現在我們來仔細說說import的用法,先看個漫畫。

這個漫畫其實很大程度在說Python程序員如何用拿來主義做好一個“二手程序員”的,因爲有大量現成的模塊可以使用時,就沒必要再自己寫了,重複造輪子不符合程序員懶惰的性格。

關於import導入模塊,有兩種語法,我們都分別介紹一下。

第一種:當one.py和two.py在同一目錄下時,我們想在 two中import one。

one.py myname = ‘myname is one’

two.py import one print(one.myname)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ogXHpcq6-1589866552632)(https://upload-images.jianshu.io/upload_images/20062408-92f5138181f1f75f.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

第二種:當需要import的模塊存在於別的目錄時,例如下面這種目錄結構。

我打算在 two.py 中 import 跟他同一層目錄下的test/pkg_1.py

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zjidAuWn-1589866552652)(https://upload-images.jianshu.io/upload_images/20062408-a88d55126283d5a7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

於是語法變成了這樣,在import前面加了一個from,它的中文意思其實就是 “從test 引入 pkg_1“。

如果我們想在test目錄裏再加一層目錄,那麼該如何import呢?

簡單的說我們只需要用 “.” 號替代目錄結構中的下劃線即可,有多少個層級就用多少個"."號

例如 我想引入 test/test2/china/sichuan/city.py這個文件。

那麼就應該寫成 from test.test2.china.sichuan import city,注意 city不用加文件名。

其實關於這兩種方式我們要講的還很多,不過鑑於這是一個初學者的教程系列,我們暫時講到這即可。

import總的來說就是用來引入其他Python文件的鑰匙,通過它我們可以解放大腦和雙手,儘量去import現成的模塊來用。

同時也可以將我們寫好的代碼通過模塊管理的方式組織得更加科學,便於其他人直接import使用。

模塊、包、庫

在以上的例子中我們其實已經可以瞭解到一些關於模塊和包的概念裏。

簡單的說,一個py文件其實就是一個**模塊(module)**當我們通過import 語句對一個Python程序文件進行引用時,我們將其稱之爲模塊。import之後可以直接使用模塊中的變量,函數和類等等一切現成的代碼。

的意思很簡單,我們只要發現某個目錄下包含有__init__.py 文件,就可以稱當前目錄是一個包,所謂包,意思就是將一堆模塊放在一起,然後申請一個命名空間,等着隨時被 from import使用。

至於,其實是一個概念,爲了和其他的語言做叫法上的兼容,在Python裏,它就是以模塊或者包的形式出現的。

init.py 文件

在編輯器裏大家看目錄結構可能不直觀,我換個方式給大家看看剛纔我們這幾個Python文件的目錄結構。

one.py和two.py在根目錄,test目錄下有一個pkg_1.py和__init__.py的文件。

那麼__init__.py是幹嘛的呢?

簡單的說它的用處就是聲明一個文件夾爲一個包,通常__init__.py文件裏面沒有任何內容,只需要這麼一個空文件存放在文件夾裏即可。

那麼有人會問,爲什麼test下的test2目錄裏爲什麼不用加上__init__.py呢?諸位請看以下代碼。

我們可以看到 test.test2 被聲明成一個包之後,在第3行打印它的名稱,在第4行打印它的類型。

我們會發現 test.test2本質是就是一個模塊類產生的對象 (class ‘module’ ),只是它有一個叫namespace的東西,我們現在可以理解爲,當一個模塊對象擁有這個namespace的時候,它就是一個包,可以通過它去import包裏面的其他模塊。

同時我們也打印了被引入的 pkg_2模塊,它同樣是一個模塊類產生的對象,只是我們看到它有一個from xxxx.py的內容,表明這個模塊是來自於本地某個Python文件裏。

總結:

Python的improt機制是我們構建大型程序的基石,不管是用大量網上的現成模塊還是去組織自己的代碼模塊。在本文,我們對於模塊的機制講得還不夠深入,未來在進階教程裏我們會深入到Pyhton模塊機制內部,看看它究竟是怎麼工作了,目前來說我們只要學到如何通過import引入文件並使用即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章