天天看點

《手把手陪您學Python》30——子產品

在上一篇《手把手陪您學Python》29——匿名函數中,我們介紹了匿名函數的格式和用法。

使用函數的優點之一是可以将自定義函數的代碼塊與主程式分離,使整個代碼結構更清晰,可讀性更高。同時,自定義函數的使用,還能夠實作代碼段的複用,避免實作同一作用的代碼段在整個程式中多次重複出現。

但我們之前學習的函數都是在一個程式或者檔案中展現的,雖然可以複用,但也僅僅隻能在這一個程式或者檔案中複用。如果想在多個程式或者檔案中複用同一個函數,在我們目前介紹的方法中是無法實作的。

今天我們就介紹一種方法,可以将函數存儲在獨立的檔案中,通過導入,就可以實作在不同程式或者檔案中重複使用同一個函數,而無需在每個程式或檔案中重複編寫相同的函數代碼。

這種方法就是——子產品。

子產品是一個儲存函數的獨立檔案,使用import語句,可以在目前運作的程式中使用子產品中的代碼。

1、子產品的意義和價值

通過将函數存儲在獨立的檔案中,可以無需考慮函數的實作過程,而讓我們專注于更高階的代碼邏輯中。不僅能夠讓我們複用自己編寫的自定義函數,還能夠與其他程式員共享這些子產品(或者說函數),甚至還能夠讓我們使用其他更進階的函數庫。

在這個系列文章的第一篇——《手把手陪您學Python》1——為什麼要學Python?中,我們介紹過,庫是Python最為獨特的特性之一。

在Python中,不僅有官方提供的很多内置庫,還有外部開發者為Python開發的諸多第三方庫。有了這些“庫”的加持,很多的複雜而又強大的功能就不需要我們這些使用者自己程式設計實作了。隻要在Python中調用這些庫,就能夠輕而易舉地實作很多強大的功能,比如圖形處理、自然語言分析、網絡爬蟲、機器學習等等。

這裡所說的庫就是指函數庫,一個由多個函數構成的大型子產品。而調用這些庫的過程,就是我們今天要講的使用import語句導入子產品的過程。

是以說,雖然今天的内容學習了解起來非常簡單,但它卻是将我們這些Python初學者,與整個Python強大世界連接配接的紐帶。有了這些庫的加持,隻要我們能夠掌握一些基本的Python語句和結構,就能夠實作很多強大功能,而這對于别的程式設計語言來說,是十分難以想象的。

像我們在下一階段要學習的Numpy、Pandas就是資料分析領域中最為基礎和重要的兩個庫。通過導入和使用Numpy、Pandas,不僅可以讓我們掌握使用Python進行資料分析的方法,還能夠超越Excel,成為資料分析的大神!

是以,讓我們一起加油吧!!!

2、建立子產品

要讓函數是可導入的,就得先建立子產品。

子產品是擴充名為.py的檔案,包含要導入到程式中的代碼。

由于Jupyter Notebook儲存檔案的擴充名是.ipynb,是不能夠作為子產品儲存和導入的,是以在制作子產品檔案時,需要我們使用PyCharm軟體編寫代碼和儲存子產品。在導入子產品進行使用時,可以随意使用Jupyter Notebook或PyCharm。

下面就讓我們一起建立一個包含buy_iphone()和buy_ipad兩個函數的子產品:

In [1]: def buy_iphone(amount, model, *others):   # 使用了不定長函數
            print("\n購買{}台{},型号及顔色等要求如下:".format(amount, model))
            for other in others:
                print("- {}".format(other))
        def buy_ipad(amount, model, *others):
            print("\n購買{}台{},型号及顔色等要求如下:".format(amount, model))
            for other in others:
                print("- {}".format(other))
           

将這個代碼段在PyCharm中儲存為apple.py(預設就是儲存為.py),這就是我們建立的第一個子產品,包含着我們一會兒可以多次用于導入的函數。

3、導入子產品的方法

導入子產品的方法有很多種,下面就對每種方法進行逐一的介紹。

a、導入整個子產品

在apple.py所在的目錄中,建立一個名為shopping_a.py的檔案。(如果用Jupyter Notebook建立,檔案名就是shopping_a.ipynb,都可以。)

使用import語句導入剛才建立的子產品,就可以調用裡面的函數了。

In [2]: import apple
        apple.buy_iphone("1", "ihone 12", "型号:Pro Max", "顔色:藍色", "記憶體:128GB", "1年延保服務")
        apple.buy_ipad("2", "iPad", "型号:Air4", "網絡:WIFI", "顔色:綠色", "記憶體:256GB", "1年延保服務")
           

當運作這段代碼時,import apple讓Python打開apple.py檔案,并将其中所有函數都複制到目前程式中,也就實作了從其他檔案或者子產品調用函數的目的,其文法格式為:

import 子產品名

我們不需要了解這個複制、調用的過程是如何實作的,隻需要知道在shopping_a.py這個檔案的代碼中,可以使用apple.py中定義的所有函數了。

要調用被導入子產品中的某一特定函數,需要将被導入子產品的名稱和要使用的函數名稱之間用英文句點“.”進行連接配接,文法格式為:

子產品名.函數名()

這樣的文法格式,和我們之間介紹的“對象.方法()”非常類似,這也是Python程式易于編寫,可讀性高的一個展現。

上面的代碼中,apple.buy_iphone()和apple.buy_ipad()就是調用的apple.py中的兩個函數的過程。

運作上面的程式,可以得到下面的結果:

Out[2]: 
        購買1台ihone 12,型号及顔色等要求如下:
        - 型号:Pro Max
        - 顔色:藍色
        - 記憶體:128GB
        - 1年延保服務
        
        購買2台iPad,型号及顔色等要求如下:
        - 型号:Air4
        - 網絡:WIFI
        - 顔色:綠色
        - 記憶體:256GB
        - 1年延保服務
           

為了輸出結果的美觀,我們在子產品的函數中,都增加了轉義符“\n”,是以輸出的結果前都有個空行。由于輸出結果類似,在後面的執行個體中就不再展示輸出結果了,大家可以自行運作程式檢視輸入結果。

這就是第一種導入子產品的方法,隻需編寫一條import語句,并在其中指定子產品,就可以在程式中使用該子產品中的所有函數了。

b、導入特定函數

除了将整個子產品進行導入外,還可以導入子產品中的特定函數,這種導入方法的文法格式為:

from 子產品名 import 函數名

如果用逗号“,”分隔函數名,還可以根據需要,從子產品中導入任意數量的函數,其文法格式為:

from 子產品名 import 函數名1, 函數名2, 函數名n

對于我們之前建立的apple.py子產品,如果隻想導入buy_iphone()函數,可以再建立一個檔案shopping_b.py,并編寫如下代碼:

In [3]: from apple import buy_iphone
        buy_iphone("1", "ihone 12", "型号:Pro Max", "顔色:藍色", "記憶體:128GB", "1年延保服務")
           

可以看到,使用這種方法時,就不需要再使用“子產品名.函數名()”的文法格式了,而是像普通自定義函數一樣,直接使用函數名調用函數就可以了。

c、使用as給函數指定别名

由于要導入的子產品的函數名稱是已經定義好,或者說通用的,可能并不能滿足于我們某一個程式的命名規則,還有可以與我們現有程式中的函數名稱沖突。此時,就可以使用as關鍵字,給我們從其他子產品中調用的函數進行命名,相當于起了個“外号”,其文法格式為:

from 子產品名 import 函數名 as 别名

如果要導入多個函數并進行重命名,就可以寫為:

from 子產品名 import 函數名1 as 别名1, 函數名2 as 别名2, 函數名n as 别名n

對于之前建立的子產品,我們可以再建立一個檔案shopping_c.py,來實作這種導入功能:

In [4]: from apple import buy_iphone as ph, buy_ipad as pd
        ph("1", "ihone 12", "型号:Pro Max", "顔色:藍色", "記憶體:128GB", "1年延保服務")
        pd("2", "iPad", "型号:Air4", "網絡:WIFI", "顔色:綠色", "記憶體:256GB", "1年延保服務")
           

我們可以看到,通過給函數重命名(起别名),不僅可以解決合理命名的問題,還可以簡化函數的名稱,便于使用。當然,簡化也要在保證不影響可讀性的情況下進行。\

d、使用as給子產品指定别名

除了給函數指定别名,還可以給子產品指定簡化的别名,便于我們在導入整個子產品,并調用函數時使用,其文法格式為:

import 函數名 as 别名

當我們使用這種導入方法時,就可以在shopping_d.py中使用如下代碼:

In [5]: import apple as a
        a.buy_iphone("1", "ihone 12", "型号:Pro Max", "顔色:藍色", "記憶體:128GB", "1年延保服務")
        a.buy_ipad("2", "iPad", "型号:Air4", "網絡:WIFI", "顔色:綠色", "記憶體:256GB", "1年延保服務")
           

導入子產品和調用函數的方式和介紹的第一種方法是一樣的,隻不過用簡化的子產品名稱a代替了原子產品名稱apple。

因為在一個程式中會導入的子產品遠比其中的函數要少的多,是以一般使用簡化子產品名稱的方式,而不是簡化函數名稱的方式來編寫代碼,這樣既達到了簡化代碼的目的,也不會影響程式的可讀性。

是以,這種導入方式也是Python中最為常用的導入方式,包括我們在資料分析中,就會經常用到:

import numpy as np

import pandas as pd

這樣的導入語句。

以及np.array(),pd.DataFrame()這樣的函數調用語句等。

e、導入子產品中的所有函數

使用“*”可以導入子產品中的所有函數,然後就可以像自定義函數一樣使用他們了,其文法格式為:

from 子產品名 import *

最後建立一個shopping_e.py的檔案,編寫如下代碼:

In [6]: from apple import *
        buy_iphone("1", "ihone 12", "型号:Pro Max", "顔色:藍色", "記憶體:128GB", "1年延保服務")
        buy_ipad("2", "iPad", "型号:Air4", "網絡:WIFI", "顔色:綠色", "記憶體:256GB", "1年延保服務")
           

由于導入了子產品中的所有函數,在程式中可以直接使用名稱調用每個函數,而無需再用“.”來引入了。

但是,當我們要使用不是我們自己編寫的子產品,特别是大型子產品時,最好不要采用這種導入方法。因為要導入的子產品中可能包括大量我們不确認的函數,其名稱可能會與我們目前程式中的函數名稱沖突。當遇到這種重複的函數名稱時,Python會覆寫其中的一部分函數,而不是分别導入所有的函數,可能導緻一些我們意料不到的結果。

是以,最好的方式還是導入整個子產品,并通過子產品名和函數名的組合方式,調用并使用函數。當然,如果需要,還可以指定子產品名稱,達到簡化代碼的目的。

以上就是通過導入子產品來調用其他檔案中函數的方法的介紹,同時,我們也了解了Python中強大的函數庫的調用原理,為我們後面學習資料分析及其他Python應用奠定了基礎。

下一篇,我們将要在調用函數的基礎上再進一步,看一看如何通過Python直接對其他檔案進行讀寫等操作,敬請關注。

《手把手陪您學Python》30——子產品

感謝閱讀本文!如有任何問題,歡迎留言,一起交流讨論^_^

要閱讀《手把手陪您學Python》系列文章的其他篇目,請關注公衆号點選菜單選擇,或點選下方連結直達。

《手把手陪您學Python》1——為什麼要學Python?

《手把手陪您學Python》2——Python的安裝

《手把手陪您學Python》3——PyCharm的安裝和配置

《手把手陪您學Python》4——Hello World!

《手把手陪您學Python》5——Jupyter Notebook

《手把手陪您學Python》6——字元串的辨別

《手把手陪您學Python》7——字元串的索引

《手把手陪您學Python》8——字元串的切片

《手把手陪您學Python》9——字元串的運算

《手把手陪您學Python》10——字元串的函數

《手把手陪您學Python》11——字元串的格式化輸出

《手把手陪您學Python》12——數字

《手把手陪您學Python》13——運算

《手把手陪您學Python》14——互動式輸入

《手把手陪您學Python》15——判斷語句if

《手把手陪您學Python》16——循環語句while

《手把手陪您學Python》17——循環的終止

《手把手陪您學Python》18——循環語句for

《手把手陪您學Python》19——第一階段小結

《手把手陪您學Python》20——清單

《手把手陪您學Python》21——元組

《手把手陪您學Python》22——字典

《手把手陪您學Python》23——内置序列函數

《手把手陪您學Python》24——集合

《手把手陪您學Python》25——清單推導式

《手把手陪您學Python》26——自定義函數

《手把手陪您學Python》27——自定義函數的參數

《手把手陪您學Python》28——自定義函數的傳回值

《手把手陪您學Python》29——匿名函數 

For Fans:關注“亦說Python”公衆号,回複“手30”,即可免費下載下傳本篇文章所用示例語句。

《手把手陪您學Python》30——子產品

亦說Python——Python愛好者的學習分享園地