Python基礎17-模塊與包基礎02、常用模塊之time、random

目錄

名字衝突與避免

設置BASE_DIR保證程序能找到模塊位置

time

random


名字衝突與避免

在test.py裏寫下面一段代碼,用正則表達式包re進行匹配,匹配出123開頭的字符。如果我們在test.py同級寫一個re.py,那麼Python解釋器在進行導入時就會報錯。因爲Python把執行文件所在目錄放進了sys.path裏面,python先找到執行文件所在目錄裏的re.py而不去找python內置的re.py。

因此,寫代碼的時候應注意文件命名,避免與python內置模塊衝突。

以上實驗對time、sys等不起作用,因爲time、sys等模塊是用C語言直接實現的,是內嵌進Python解釋器中的。

import re

print(re.findall(r'123', '123456'))
# ['123']

設置BASE_DIR保證程序能找到模塊位置

我們知道Python從sys.path裏面找模塊位置。那麼,寫好的程序部署到其他環節下就會找不到自定義模塊。如何保證程序一定能找到模塊的位置呢?

我們把上一篇博文中的程序修改一下,建立兩個包。bin包下是程序入口bin.py。my_module包時自定義模塊,其中main.py實現邏輯,calc.py實現公用的算法。當bin.py放在bin包下的時候,Python將D:\dev\day21\bin加到sys.path裏面,所以找不到和bin同級別的my_module包。此時,bin.py下的from my_module import main就會報錯找不到my_module。

解決這個問題的辦法是,把這個項目的根基目錄D:\dev\day21加進sys.path裏面。以後大家都可以用from pkg.subpkg的方式找到所有自定義的模塊。爲了防止同一個程序在不同環境(計算機)上運行導致的路徑不一致(別的計算機上可能是/usr/local/dev/day21),需要找到一個和運行的計算機無關,只與我程序有關的計算路徑的辦法。

具體做法是,通過程序入口bin.py,找到bin.py的絕對路徑,再向上找2層父目錄就得到了day21的路徑,將這個day21的路徑加入sys.path即可。

__file__ 變量的值是被執行文件的文件名bin.py。os.path.abspath(__file__)得到bin.py的絕對路徑。對bin.py絕對路徑,找所在目錄(上一層),再找所在目錄(再上一層),得到day21的路徑,這就是BASE_DIR,加入到sys.path即可。此時在day21下面找my_module就能找到了。

# bin.py

import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

from my_module import main

if __name__ == '__main__':
    main.run()

time

time模塊裏面的函數都與時間相關。我們已經用過time.sleep(2)函數來是線程睡眠2秒。time提供的其他函數,可以獲取用於計算的時間戳,用於取數的結構化時間,還提供了時間和字符串相互轉換的函數等有用工具,具體的例子見下面代碼和註釋。

import time

# 時間戳 做計算用
# 1970-01-01 00:00:00 - now
print(time.time())
# 1578209561.4799075 sec


# 當地時間,結構化時間,取數用
t = time.localtime()
print(t)
print(t.tm_year, t.tm_wday)
# time.struct_time(tm_year=2020, tm_mon=1, tm_mday=5,
# tm_hour=15, tm_min=38, tm_sec=11, tm_wday=6, tm_yday=5, tm_isdst=0)
# 2020 6


# 格林尼治時間,結構化時間,取數用
t = time.gmtime()
print(t)
# time.struct_time(tm_year=2020, tm_mon=1, tm_mday=5,
# tm_hour=7, tm_min=38, tm_sec=11, tm_wday=6, tm_yday=5, tm_isdst=0)


# 將結構化時間轉換爲時間戳
t = time.mktime(time.localtime())

# 將結構化時間轉換爲字符串
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
# 將字符串轉換爲結構化時間
print(time.strptime('2019-12-24 17:50:01', '%Y-%m-%d %H:%M:%S'))

# 直接將結構化時間打印出可讀性較好的當前時間,不能自定義格式
print(time.asctime())
# 直接將時間戳打印出可讀性較好的當前時間,不能自定義格
print(time.ctime())
# Sun Jan  5 16:10:55 2020
# Sun Jan  5 16:10:55 2020

# 另一種比較友好的顯示時間的函數
import datetime

print(datetime.datetime.now())
# 2020-01-05 16:10:55.715002

 

random

random模塊提供與隨機數和隨機操作相關的函數。生成某個區間內的隨機整數、隨機浮點數、從有序對象裏面隨機取出元素、從有序對象裏面隨機取樣n個元素、打亂有序對象元素的順序等等。用法舉例見下面代碼和註釋。

import random

# 產生0-1之間的隨機浮點數
print(random.random())
# 產生任意區間的隨機浮點數
print(random.uniform(2.3, 7.9))



# 產生[1,9]之間的隨機整數
print(random.randint(1, 9))
# 產生[1,9)之間的隨機整數
print(random.randrange(1, 9))



s = ['mysql', 'oracle', 'db2']
# 從有序對象中隨機選取一個
print(random.choice(s))
# mysql
# 隨機取樣,從有序對象中隨機取n個組成取樣
sample = random.sample(s, 2)
print(sample)
# ['db2', 'oracle']



# 打亂次序
li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(li)
print(li)
# [1, 5, 4, 3, 6, 9, 7, 2, 8]

 

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