模塊:模塊是一系列常用功能的集合體,一個py文件就是一個模塊1、從文件級別組織程式,更方便管理隨著程式的發展,功能越來越多,為了方便管理,我們通常將程式分成一個個的文件,這樣做程式的結構更清晰,方便管理。這時我們不僅僅可以把這些文件當做腳本去執行,還可以把他們當做模塊來導入到其他的模塊中,實現了功能 ...
模塊:
模塊是一系列常用功能的集合體,一個py文件就是一個模塊。
一、模塊的作用:
1、從文件級別組織程式,方便管理,隨著程式的發展,功能越來越多,我們通常將程式分成一個個py文件,這樣做程式的結構更清晰,方便管理。這時我們不僅可以把這些文件當做腳本去執行,還可以把他們當做模塊來導入到其他的模塊中,實現了功能的重覆利用。
2、拿來主義,提升開發效率
同樣的原理,我們也可以下載別人寫好的模塊然後導入到自己的項目中使用,這種拿來主義,可以極大地提升我們的開發效率,避免重覆造輪子。每個模塊都是一個獨立的名稱空間,定義在這個模塊中的函數,把這個模塊的名稱空間當做全局名稱空間,這樣我們在編寫自己的模塊時,就不用擔心我們定義在自己模塊中全局變數會在被導入時,與使用者的全局變數衝突。
二、導入模塊:
import 模塊1,模塊2,模塊3
可以用import以逗號分隔的方式導入多個模塊,但是為了代碼的可讀性不建議這麼寫,建議分開寫。如:
import 模塊1
import 模塊2
import 模塊3
多行導入,易於閱讀,易於編輯,易於搜索,易於維護。
import 導入過來的功能都需要使用模塊點的方法執行。如下:
import time print(time.localtime()) # 以模塊名time.locatime()的方式調用
import 模塊名 as 別名 為模塊起別名,如下:
import time as datetime_ # 為模塊起別名 print(datetime_.localtime())
import 導入的是整個模塊,當我們知道要導入這個模塊的某個功能時,我們可以直接導入該模塊下的某個功能,而不需要將該模塊下的所有功能全部導入。
這時我們可以使用:from 模塊名 import 函數名這樣就可以導出該模塊下的函數了,而不用導入整個模塊。如下:
from time import localtime # 導出time模塊下的localtime函數 print(localtime()) # 這樣就不需要使用模塊名.的方式調用函數了
from 模塊 import 函數1,函數2,函數3 #也可以導入多個函數,如下:
from time import localtime,strftime,time # 導出time模塊下的多個函數 ntime = localtime(time()) print(strftime("%Y-%m-%d %H:%M:%S",ntime))
from 模塊名 import 函數名 as 別名:函數名 as 別名 可以更改多個。
from time import localtime as localtime_,time as time_ # 起別名 print(localtime_(time_()))
from 模塊名 import * 導出模塊下所有函數,不推薦使用。
from time import * # 導出time模塊下的所有函數 print(localtime(time()))
小結:以time模塊為例。
1、import time 可以導出time模塊下的所有函數,在使用這些函數時需要使用 time.函數名 的方式來調用函數。
from time import * 導出time模塊下的所有函數,直接使用函數名的方式來調用,不使用模塊名.函數名的方式調用。
2、import 模塊1,模塊2,模塊3 雖然可以這樣寫,但是不建議這麼寫,這麼寫可讀性不是很好,也不利於修改和查找。同理
from 模塊名 import 函數名1,函數名2 這麼寫也是不可取的。
3、import 模塊名 as 別名 給模塊起別名
from 模塊名 import 函數名 as 別名 給函數起別名
4、import 模塊名 as 別名,模塊名2 as 別名 可以這麼寫
from 模塊名 import 函數名 別名,函數名 as 別名 雖然可以這麼寫但是我們儘量不要這麼寫。
擴展知識:
__all__ = ['可以被導入的內容'] 用這種方式強制from 模塊名 import *只導出指定的內容。
如下圖所示:__all__ = ["fun"] 只允許import * 導出fun()函數,而不允許調用fun_2()函數。
if __name__ == '__main__'的意思是,當.py文件被直接運行時,if __name__ == '__main__'之下的代碼塊將被運行。
當.py文件以模塊形式被導入時,if __name__ == '__main__'之下的代碼塊不被運行。多用於測試模塊內函數是否運行正確。
以上圖可以看出我們導入模塊後,fun_2()被調用了,但if __name__ == '__main__'的代碼沒有被執行。所以,以後我們在寫模塊時,如果要測試哪個函數最好是在
if __name__ == '__main__'里進行,以免測試後忘記註釋或刪除調用,導致在引用該模塊時執行裡面的函數。
三、模塊的搜索順序:
記憶體中已經載入的模塊 - > 內置模塊 - > sys.path路徑中包含的模塊。
下麵是列印當前Python環境下的路徑:
import sys print(sys.path) # 列印當前python環境變數
如果要添加其它盤符中的模塊,需要把模塊的路徑載入到Python的環境中去。
import sys sys.path.insert(0,r"模塊路徑") # 將一個模塊路徑插入到當前Python環境變數 print(sys.path) # 列印當前python環境變數
四、編譯Python文件
為了提高載入模塊的速度,提高的是載入速度而絕非運行速度。python解釋器會在__pycache__目錄中下緩存每個模塊編譯後的版本,格式為:module.version.pyc。如下圖所示
這種命名規範保證了編譯後的結果多版本共存,Python檢查源文件的修改時間與編譯的版本進行對比,如果過期就需要重新編譯。這是完全自動的過程。並且編譯的模塊是平臺獨立的,所以相同的庫可以在不同的架構的系統之間共用,即pyc是一種跨平臺的位元組碼,類似於JAVA或.NET。是由python虛擬機來執行的,但是pyc的內容跟python的版本相關,不同的版本編譯後的pyc文件不同,2.5編譯的pyc文件不能到3.5上執行,並且pyc文件是可以反編譯的,因而它的出現僅僅是用來提升模塊的載入速度的,不是用來加密的。
小結:
1、模塊名區分大小寫,fun.py與FUN.py代表的是兩個模塊。
2、在速度上從.pyc文件中讀指令來執行不會比從.py文件中讀指令執行更快,只有在模塊被載入時,.pyc文件才是更快的 。
3、只有使用import語句時才將文件自動編譯為.pyc文件,在命令行或標準輸入中指定運行腳本則不會生成這類文件。
五、time模塊
在電腦中時間共有三種形式:
1、時間戳:通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”,返回的是float類型。
2、格式化字元串時間(Format String):人類能讀懂的時間如:2018-1-1 14:10
3、結構化時間:元組(struct_time) struct_time元組共有9個元素(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)。如下圖所示:
tm_year(年) |
如:2018(年) |
tm_mon(月) |
1 - 12 |
tm_mday(日) |
1 - 31 |
tm_hour(時) |
0 - 23 |
tm_min(分) |
0 - 59 |
tm_sec(秒) |
0 - 61 |
tm_wday(周) |
0 - 6(周一是0) |
tm_yday(一年中的第幾天) |
1 - 366(天) |
tm_isdst(是否是夏令時) |
0不是,1是,-1未知 |
python中日期,時間格式化:
Directive |
Meaning |
%a |
簡寫周(如周一(Monday):簡寫成Mon) |
%A |
周的全寫(如周一(Monday):Monday) |
%b |
月的簡寫(如2月(February):簡寫Feb) |
%B |
月的全寫(如2月(February):February) |
%c |
預設顯示(如當前日期:Mon Feb 18 15:03:38 2019). |
%d |
一個月的第幾天(1 - 31) |
%H |
時 (0,24) |
%I |
時(1,12) |
%j |
一年中的第幾天(1,366) |
%m |
月(1,12) |
%M |
分(0,59) |
%p |
對應AM/PM |
%S |
秒(0,61) |
%U |
一年中第幾周 (0,53) |
%w |
一周的第幾天 (0,6)0是周一 |
%W |
一年中第幾周 (0,53)與%U類似 |
%x |
預設年月日如:02/18/19(月/日/年) |
%X |
預設時分秒如:15:23:46(時:分:秒) |
%y |
去掉世紀年份(0,99)如:2019顯示19 |
%Y |
完整的年份 |
%z |
列印時區 |
%Z |
時區(如果不存在列印空) |
%% |
列印字元% |
time模塊的時間轉換:
我們知道了time模塊時間有三種表現形式:時間戳、結構化時間、字元串時間。我們可以根據下麵這張圖進行轉換。
時間戳到字元串時間的轉換:
import time nTime = time.time() # 獲取時間戳 structTime = time.localtime(nTime) # 將時間戳轉換結構化時間 strTime = time.strftime("%Y-%m-%d %H:%M:%S",structTime) # 將結構化時間轉換成字元串時間 print("字元串時間:",strTime) # 列印字元串時間 # 列印內容如下 字元串時間: 2019-02-18 15:40:17
字元串時間回退到時間戳:
import time strTime = "2019-02-18 15:40:17" print("字元串時間:",strTime) struct_Time = time.strptime(strTime,"%Y-%m-%d %H:%M:%S") # 將字元串時間轉換成結構化時間 nTime = time.mktime(struct_Time) # 將結構化時間轉換成時間戳 print("時間戳:",nTime) # 列印內容如下 字元串時間: 2019-02-18 15:40:17 時間戳: 1550475617.0
六、datetime模塊
列印當前時間:
from datetime import datetime print(datetime.now(),type(datetime.now())) # 獲取當前時間 # 列印內容如下 2019-02-18 15:47:38.337810 <class 'datetime.datetime'>
指定日期,時間並創建一個datetime的類:
from datetime import datetime dt = datetime(2019,2,18,15,50,0) # 指定日期,時間 print(type(dt),dt) # 列印內容如下 <class 'datetime.datetime'> 2019-02-18 15:50:00
datetime類轉換時間戳:
from datetime import datetime dt = datetime.now() # 獲取時間類 new_timestamp = dt.timestamp() # 將時間類轉換成時間戳 print(new_timestamp) # 列印內容如下 1550476362.400201
將時間戳轉換成字元串時間:
from datetime import datetime nTime = datetime.timestamp(datetime.now()) # 時間戳 print(datetime.fromtimestamp(nTime)) # 將時間戳轉換成類 # 列印內容如下 2019-02-18 15:53:50.835115
將str轉換成datetime:
from datetime import datetime nTime = datetime.strptime("2019-1-15","%Y-%m-%d") # 將字元串時間轉換成時間類 print(type(nTime),nTime) # 列印內容如下 <class 'datetime.datetime'> 2019-01-15 00:00:00
將datetime轉換成str:
from datetime import datetime nTime = datetime.now() # 獲取時間類 strTime = datetime.strftime(nTime,"%Y-%m-%d %H:%M:%S") # 將時間類轉換成字元串 print(type(strTime),strTime) # 列印時間如下 <class 'str'> 2019-02-18 15:56:13
datetime的加減法:需要使用timedelta類。
from datetime import datetime,timedelta nTime = datetime.now() # 系統當前時間 print("當前時間:",nTime) otherTime = nTime - timedelta(days=1) # 當前時間減去1天 print("減去一天後的時間:",otherTime) # 列印內容如下 當前時間: 2019-02-18 15:57:48.071684 減去一天後的時間: 2019-02-17 15:57:48.071684
timedelta可選參數,就不一一舉例了,有興趣的朋友可以自己嘗試。
days: float = ...,
seconds: float = ...,
microseconds: float = ...,
milliseconds: float = ...,
minutes: float = ...,
hours: float = ...,
weeks: float = ..., *,
fold: int = ..