模塊初始與time、datetime及random
模塊初始
模塊的概念(本質為一個py文件)
python模塊可以將代碼量較大的程序分割成多個有組織的、彼此獨立但又能互相交互的代碼片段,這些自我包含的有組織
的代碼段就是模塊,模塊在物理形式上表現為以.py結尾的代碼文件
一個文件被看作一個獨立的模塊,一個模塊也可以被看作是一個文件
模塊的文件名就是模塊的名字加上擴展名.py
每個模塊都有自己的名稱空間
python允許“導入”其他模塊以實現代碼重用,從而也實現了將獨立的代碼文件組織成更大的程序系統
python中,模塊也是對象
在一個模塊的頂層定義的所有變量都在被導入時成為了被導入模塊的屬性
模塊的分類
分為三部分:內置模塊、第三方模塊,自定義模塊
模塊的好處
分模塊的好處:
- 避免寫重復代碼
- 可以多次利用
- 拿來即用
模塊的導入(imort)
import time,os # 單行導入
import time #多行導入(推介寫法)
import os
模塊導入發生的事情
- 當前的名稱空間中開辟一個新的空間(test)
- 將模塊中所有的代碼執行
- 通過模塊名.進行查找函數(工具)
模塊的別名
import time as t #將time命名為t
t.strftime() # t.可直接調用函數方法# 做一兼容性
choose = input(msg)
if choose == "1":import meet as t
elif choose == "2":import test as tfrom datetime import datetime as t
from import 也支持重新命名
for import
導入模塊中的某些方法:
from datetime import datetime
# 導入模塊中的某種方法
form import和import的區別:
唯一的區別就是:使用from...import...則是將spam中的名字直接導入到當前的名稱空間中,所以在當前名稱空間中,直接使用名字就可以了
from...import...的方式有好處也有壞處
- 好處:使用起來方便了
- 壞處:容易與當前執行文件中的名字沖突
form import執行文件與模塊同名的變量,會有覆蓋效果
from import as *
from import as *導入模塊中未限制的所有方法
可以使用__all__進行限制
__all__=['name','read1'] #這樣在另外一個文件中用from spam import *就這能導入列表中規定的兩個名字
模塊的導入順序
內存中已經加載的模塊 > 自定義模塊 > 內置模塊 > 第三方模塊
- 在第一次導入某個模塊時,會先檢查該模塊是否已經被加載到內存中(當前執行文件的名稱空間對應的內存),如果有則直接引用(ps:python解釋器在啟動時會自動加載一些模塊到內存中,可以使用sys.modules查看)
- 如果沒有,解釋器則會查找同名的內置模塊
- 如果還沒有找到就從sys.path給出的目錄列表中依次尋找文件。
# 導入路徑:# 使用相對路徑:
from day15.t1 import meet # day15.t1 meet相對路徑
print(meet.name)# 使用絕對路徑:
# 錯誤示例:# from r"D:\" import meet# from ../# 正確的絕對路徑:
from sys import path
path.insert(0,"D:\\") # 將導入模塊的絕對路徑插入系統路徑中
import meet
print(meet.name)
模塊的兩種用法:
- 作為腳本(在終端中運行python文件)
- 作為模塊(導入或使用)
time模塊
time模塊方法及用法
import time
print(time.time()) # 當前時間,浮點數
time.sleep(2) # 休眠2秒,本質為阻塞
time.strftime("%Y-%m-%d %H:%M:%S",結構化時間) # 將結構化時間轉化成字符串時間
time.gmtime(時間戳) # 將時間戳轉化成格林尼治結構化時間
time.mktime(結構化時間) # 將結構化時間轉化時間戳
time.strptime(字符串時間,"%Y-%m-%d %H:%M:%S") # 將字符串時間轉換成結構化時間
time.localtime() # 將時間戳轉化成當地的結構化時間
python中時間日期格式化符號:
%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鐘數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身
time模塊計算兩個時間的時間差:
計算時間差:import time
true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time=time_now-true_time
struct_time=time.gmtime(dif_time)
print('過去了%d年%d月%d天%d小時%d分鐘%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,struct_time.tm_mday-1,struct_time.tm_hour,struct_time.tm_min,struct_time.tm_sec))
其他方法:
#結構化時間 --> %a %b %d %H:%M:%S %Y串
#time.asctime(結構化時間) 如果不傳參數,直接返回當前時間的格式化串
>>>time.asctime(time.localtime(1500000000))
'Fri Jul 14 10:40:00 2017'
>>>time.asctime()
'Fri Jul 26 18:34:59 2019'#時間戳 --> %a %b %d %H:%M:%S %Y串
#time.ctime(時間戳) 如果不傳參數,直接返回當前時間的格式化串
>>>time.ctime()
'Fri Jul 26 18:34:59 2019'
>>>time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017'
datetime模塊
獲取當前日期和時間:
from datetime import datetime
print(datetime.now()) # 獲取對象數據類型為對象
# 結果:
'2019-07-26 18:39:46.300129'
獲取指定的時間和日期:
from datetime import datetime
dt = datetime(2018,5,20,13,14)
print(dt)
# 結果:
'2018-05-20 13:14:00'
datetime與時間戳的轉換:
from datetime import datetimedt = datetime.now()
new_timestamp = dt.timestamp() # 轉化成時間戳
print(new_timestamp)
#結果:1543931750.415896import time
from datetime import datetimenew_timestamp = time.time()
print(datetime.fromtimestamp(new_timestamp)) # 轉化成datetime時間
# 結果:
'2019-07-26 18:46:13.833992'
str與datetime的轉換:
很多時候,用戶輸入的日期和時間是字符串,要處理日期和時間,首先必須把str轉換為datetime。轉換方法是通過datetime.strptime()
實現,需要一個日期和時間的格式化字符串:
from datetime import datetimet = datetime.strptime('2018-4-1 00:00','%Y-%m-%d %H:%M')
print(t)
'''
結果: 2018-04-01 00:00:00
'''# 如果已經有了datetime對象,要把它格式化為字符串顯示給用戶,就需要轉換為str,轉換方法是通過`strftime()`實現的,同樣# 需要一個日期和時間的格式化字符串:```
from datetime import datetime
now = datetime.now()
print(now.strftime('%a, %b %d %H:%M'))
# 結果:
'Mon, May 05 16:28'
datetime加減:
對日期和時間進行加減實際上就是把datetime往后或往前計算,得到新的datetime。加減可以直接用+
和-
運算符,不過需要導入timedelta
這個類:
from datetime import datetime, timedelta
now = datetime.now()
now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
可見,使用timedelta
你可以很容易地算出前幾天和后幾天的時刻。
指定datetime時間:
current_time = datetime.datetime.now()
print(current_time.replace(year=1977)) # 直接調整到1977年
print(current_time.replace(month=1)) # 直接調整到1月份
print(current_time.replace(year=1989,month=4,day=25)) # 1989-04-25 18:49:05.898601
random模塊
print(random.random()) # 0 ~ 1
print(random.uniform(1,10)) # 1 ~ 10
print(random.randint(1,50)) # 1 ~ 50(閉區間)
print(random.randrange(1,5,2)) # randrange(起始,終止,步長)
print(random.choice([1,2,3,4,5,])) # 選擇一個元素
print(random.choices([1,2,3,4,5,],k=2)) # 選擇兩個元素,會有重復
print(random.sample((1,2,3,4,5),k=2)) # 選擇兩個元素,不會有重復(除非只有兩個)lst = [1,2,3,4,5,6,7,8,9,0]
random.shuffle(lst) # 順序打亂
print(lst)