python開發中,每個.py文件均可以看做是一個模塊,模塊內部的函數或者方法能夠被其餘模塊調用,至於函數或者方法是具體如何實現的,調用者不須要關心。python
假如項目中既含有UI也有邏輯代碼還有功能實現,若是全寫在一個py文件,可能會有幾萬甚至十幾萬行代碼,顯得代碼很臃腫,爲了方便代碼閱讀和維護,咱們能夠將項目拆分爲多個模塊,不一樣的模塊實現不一樣的功能,這樣分工合做開發效率也高,並且就算出現bug也方便定位。git
python中有一些內置模塊咱們直接調用,好比:sys、time、json等,具體使用方法咱們在調用模塊中詳細講解;github
安裝第三方開源模塊,能夠直接cmd打開控制檯或者打開pycharm終端運行 pip install <模塊名> 便可,前提是anacoanda已經安裝正確,例如:學習爬蟲的時候須要安裝requestjson
1微信 |
pip install requestide |
除了前面兩種模塊,咱們也能夠本身寫模塊來供本身調用,具體實現什麼功能有本身決定,在後面的模塊調用中會有詳細講解,值得注意的是:模塊名字不能和內置模塊名字同樣,會形成衝突;函數
使用 import關鍵字 導入模塊,並放置在代碼最開始位置;同一個模塊無論執行了多少次 import <模塊名>,實際上只會被導入一次。學習
爲了講解關於模塊的調用方法,假如咱們有一個計算加減乘除的模塊文件calculator.py,代碼以下:測試
1spa 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(我的博客地址): shuopython.com @WeChat Official Account(微信公衆號):猿說python @Github:www.github.com
@File:calculator.py @Time:2019/10/11 21:25
@Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累! """
# 定義一個全局變量 name = "calculator"
# 加法 def add(x,y): return x+y
# 減法 def sub(x,y): return x-y
# 乘法 def multiplication(x,y): return x*y
# 除法 def division(x,y): return x/y
# 使用內置函數eval計算表達式的結果,若是表達式有誤,直接拋異常 def get_result(input_str): try: return eval(input_str) except Exception as e: print("表達式輸入異常!") return None |
若是已經忘記python 異常處理的小夥伴請參考: python 異常處理詳細講解
新建一個py文件,用於調用模板文件 calculator.py 中的函數,代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 導入模塊 import calculator
# 調用calculator模塊中的add函數 : 模塊名.函數名 或者 模塊名.變量名 result = calculator.add(2,5) print(result)
# 調用calculator模塊中的sub函數 : 模塊名.函數名 或者 模塊名.變量名 result = calculator.sub(2,5) print(result)
# 調用calculator模塊中的multiplication函數 : 模塊名.函數名 或者 模塊名.變量名 result = calculator.multiplication(2,5) print(result)
# 調用calculator模塊中的add函數 : 模塊名.函數名 或者 模塊名.變量名 result = calculator.division(2,5) print(result)
# 調用calculator模塊中的get_result函數 : 模塊名.函數名 或者 模塊名.變量名 result = calculator.get_result("3+2*8-40") print(result)
# 調用calculator模塊中的name變量 : 模塊名.函數名 或者 模塊名.變量名 print(calculator.name) |
輸出結果:
1 2 3 4 5 6 |
7 -3 10 0.4 -21 calculator |
注意:調用模塊中的函數時須要指明函數或者變量來自哪一個模板:<模塊名>.函數名 <模塊名>.變量名
作一個簡單理解,從哪一個模塊導入哪些函數或者變量,外部導入模塊後調用時只能調用導入的函數或者變量,模塊中沒有導入的變量或者函數不能調用,示例代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
''' 從模塊calculator中導入add,sub兩個函數, 意味着調用calculator模塊時,只能調用add,sub兩個函數, calculator 模塊中的其餘變量或者函數沒法調用 '''
from calculator import add,sub
# 在代碼頂部已經聲明add函數從calculator導入,能夠直接使用,不須要帶上模板名 result = add(2,5) print(result)
# 在代碼頂部已經聲明sub函數從calculator導入,能夠直接使用,不須要帶上模板名 result = sub(2,5) print(result)
# 錯誤寫法:該模塊並無導入name變量 # result = multiplication(2,5)
# 錯誤寫法:該模塊並無導入name變量 # result = division(2,5)
# 錯誤寫法:該模塊並無導入name變量 # result = calculator.get_result("3+2*8-40")
# 錯誤寫法:該模塊並無導入name變量 # print(calculator.name) |
這種寫法表示直接導入模塊中的全部內容,意味着模塊中的函數或者變量均可以使用,該寫法實際上和第二種導入方法相似,示例代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 導入calculator 模塊中全部函數和變量 from calculator import *
# 在代碼頂部已經聲明導入calculator模塊全部內容,能夠直接使用,不須要帶上模板名 result = add(2,5) print(result)
# 在代碼頂部已經聲明導入calculator模塊全部內容,能夠直接使用,不須要帶上模板名 result = sub(2,5) print(result)
# 在代碼頂部已經聲明導入calculator模塊全部內容,能夠直接使用,不須要帶上模板名 result = multiplication(2,5) print(result)
# 在代碼頂部已經聲明導入calculator模塊全部內容,能夠直接使用,不須要帶上模板名 result = division(2,5) print(result)
# 在代碼頂部已經聲明導入calculator模塊全部內容,能夠直接使用,不須要帶上模板名 result = get_result("3+2*8-40") print(result)
# 在代碼頂部已經聲明導入calculator模塊全部內容,能夠直接使用,不須要帶上模板名 print(name) |
輸出:
1 2 3 4 5 6 |
7 -3 10 0.4 -21 calculator |
使用該方法導入模塊時有一個缺陷:若是同時導入多個模塊文件,若是模塊中的函數或者變量重名,編譯器也不知道具體是用哪個模塊重名的函數或者變量,會形成意想不到的bug,每每這種bug最難查找!
利用上面的calculator模塊,再加上前面的python基礎知識,其實咱們已經能夠寫一個簡單的計算器了,惟獨沒有界面而已,至於界面後面會有pyqt5的教程,暫時不作過多講解。計算器代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 導入內置模塊time,計算耗時,默認單位秒 import time # 導入calculator 模塊 import calculator
while True: # 獲取表達式 input_str = input("請輸入表達式:") if input_str == 'q': # 輸入 q 退出程序 break time_start = time.clock() print(calculator.get_result(input_str)) time_end = time.clock() # 將 秒 轉爲 毫秒 print("計算耗時:{}毫秒".format((time_end-time_start)*1000))
print("退出計算,程序結束!") |
測試結果:
1.注意模塊的幾種導入方式,python開發中推薦使用寫法一的方式導入:import <模塊名>;
2.注意內置函數和內置模塊的區別:內置函數是任何模塊均可以直接調用,內置模塊須要import模塊以後才能調用模塊裏面的函數;
3.不一樣的模塊中能夠存在相同的變量名或者函數名,可是不能與內置函數名或者內置模塊名字重複,避免形成衝突;