這裏寫自定義目錄標題
一、模塊
1、什麼是模塊
模塊:就是包含了一定功能的一個組件[組成的部件,類似零件!]
Python編程語言中,每個Python文件都是一個獨立的模塊,Python文件就是模塊
2、模塊的代碼規範
一般來講,開發項目的時候,需要將不同的功能進行劃分
比如:
項目:學生管理系統
程序入口: main.py
視圖模塊: views.py 學生登錄界面 系統界面
後臺處理:seriveces.py 處理賬戶檢測,用戶輸入處理
數據存儲:data.py 上級調用我,我反饋數據
在創建項目的時候嚴格,遵循調用原則,劃分誰是上級,誰是下級,不能下級調用上級的資源,比如 你一個數據存儲調用程序入口!這。。。QAQ
- 當然可以理解成:程序入口調用視圖模塊,然後調用後臺處理,後臺處理調用數據儲存。
- 實際開發中,可能視圖模塊也會調用數據存儲,上級調用下級可以,可以跨級調用,比如用戶登錄界面 顯示用戶名稱,這不就需要調用數據的嗎
3、模塊化開發的優點
模塊化開發項目,相對於傳統的開發一個學生管理系統:
- 便於維護,出現bug 可以明確知道在什麼地方修改
- 便於升級附加新功能
二、模塊如何引入另外一個模塊
1、絕對引入
下面的方法,使用的時候是在一個目錄路徑下
import 模塊名
import 模塊名 as 別名[自己取的名字]
from 模塊 import 變量/函數 # 不推薦的方法
使用方法:
import run 引入模塊run
import eat as a 引入模塊eat
from student import name 引入模塊student中的name
from student import show_info_student 引入模塊student中的 show_info_student 函數
import run #引入模塊run
run.show_runner_info() # 調用run模塊中的展示跑步者信息
print(run.name) # 調用run模塊中跑步者的名字
import eat as a #引入模塊eat 起名 a
a.show_eating_info()
print(a.name)
from student import name #引入模塊student中的name
print(name) # 直接打印
from student import show_info_student #引入模塊中show_info_student 函數
show_info_student() #直接使用
2、相對引入
大型項目開發會出的情況:
- 創建了很多文件夾
- 可能當前py文件引入的模塊在另外個文件夾中,路徑不在一塊!
我們先來了解下命令方式路徑表示:
. 一個點表示當前文件
.. 二個點表示上一級文件夾
使用方法,兩個…也是如此,也可以加路徑:
# 從當前文件中導入views模塊
from . import views
# 別名法
from . import views as v
# 相對引入具體數據 引入變量 和 函數 [ 不推薦這種方法]
from .views import name,show_login
使用方法都是導入的模塊名.[變量/函數],直接引入[變量/函數]直接使用即可,可以參考絕對引入。
三、包
1、什麼是包
每個文件夾都能當成一個包,在大型項目開發的時候,都基本具備這種操作方式,每個包中包含了_ _ init _ _.py文件,裏面內容可以裏面爲空
我們來看下圖,也看直接看總圖:
將mypackage展開,發現又多了兩個文件夾,以及兩個文件
展開subpackage1和subpackage2
2、包的引入操作
2.1 絕對引入 [ 不推薦]
# 引入mypackage包中的mydemo模塊
from mypackage import mydemo
# 引入mypackage包中的子包subpackage1中的subdemo1模塊
from mypackage.subpackage1 import subdemo1
print(mydemo.name)
mydemo.test()
print(subdemo1.name)
subdemo1.test()
mypackage 文件中[程序包中的文件] mydemo.py 模塊
"""
mypackage包
mydemo.py模塊
"""
name = "mypackage程序包中的mydemo.py模塊"
def test():
print("mypackage包中的test()函數執行了.")
subpackage1 文件中[程序包中的文件] subdemo1.py 模塊
"""
subpackage1包
subdemo1.py模塊
"""
name = "subpackage1程序包中的subdemo1.py模塊"
def test():
print("subpackage1包中的test()函數執行了.")
2.1.1 別名引入
當然,包的引入也可以別名引入
# from mypackage import mydemo as md
# 引入mypackage包中的子包subpackage1中的subdemo1模塊
# from mypackage.subpackage1 import subdemo1 as sd1
# from mypackage.subpackage2 import subdemo2 as sd2
# print(md.name)
# print(sd1.name)
# print(sd2.name)
2.1.2 直接引入 [ 需要搞清楚]
直接引入的時候,需要注意的事項!!!!特別重要,否則出錯!!!
你想想,我直接引入了文件夾,然後使用的爲啥不能點文件夾進去找到對應的文件
- 我僅僅是導入了 import mypackage
- 使用如:print(mypackage.subpackage1.subdemo1.name) 沒有這種用法
- 而之前的直接引入,正確的是是from mypackage.subpackage1 import subdemo1
- 說明個問題 不能導入文件夾[雖然也是包] ,不能在執行的時候繼續引入
import mypackage
print(mypackage.mydemo.name) # ?不能直接使用
print(mypackage.subpackage1.subdemo1.name) # ?不能直接使用
如何真想這麼用了?也就是直接引用,需要修改每個文件中的代碼
- 需要在mypackage包中的__init__.py模塊中,指定那些模塊可以被引入
- 修改mypackage/_ _ init _ _.py模塊
添加代碼:
from . import mydemo
from . import subpacakge1 - 修改subpackage1/ _ _ init _ _ .py模塊中代碼
添加代碼:
from . import subdemo1.py
可以看到可以執行了
2.1.3 偷懶引入
很多代碼都能看到,將mypackage一次性注入
main.py 中
# 將mypackage包中的所有數據一次性引入
from mypackage import *
print(mydemo.name)
print(subpackage1.subdemo1.name)
-
需要在mypackage包中的__init__.py模塊中,指定那些模塊可以被引入
-
修改mypackage/_ _ init _ _.py模塊
添加代碼:
_ _ all _ _ = [“mydemo”,“subpackage1” ] -
修改subpackage1/ _ _ init _ _ .py模塊中代碼
添加代碼:
from . import subdemo1 正確
_ _ all _ _ = [“subdemo1”] 這樣寫mian.py執行 報錯
針對於報錯的地方,我有點不太明白,爲什麼懶人引入,這樣搞最後一個包,初始化不能這樣寫
難道 form 文件名 import *,只能對於下一個包,然後最裏面的包初始化都得直接引入嘛- -,有點迷
2.2 相對引入 [推薦]
多好用啊,前面花裏呼哨,它不香嘛,其實看個人和具體情況使用,千萬別有這種思想
from .mypackage import mydemo
print(mydemo.name)
四、內建模塊 [ 列舉常用的 ]
1、random 模塊
import random
# randint():生成指定範圍內的隨機數
num = random.randint(1,10)
print(num)
# random(): 生成0-1直接的隨機小數
print(random.random())
# uniform(): 生成指定範圍內的隨機小數
print(random.uniform(1,10))
# randrange: 生成指定範圍內的隨機整數,可以指定步長
print(random.randrange(1,10,2))
# random.shuffle(): 可以打亂序列
lst = [1,2,3,4,5]
random.shuffle(lst)
print(lst)
# choice(): 隨機返回列表中的一個元素
lst = [1,2,3,4,5]
print(random.choice(lst))
# choices(): 隨機取出指定個數元素
print(random.choices(lst,k=2))
# shuff()打亂列表順序
random.shuffle(lst)
print(lst)
2、sys 模塊
import sys
# - sys.version 返回解釋器的版本號
print(sys.version)
# - sys.path 返回模塊的搜索路徑
print(sys.path)
# - sys.argv 接受命令行下的參數
3、string 模塊
string 模塊提供了系統中字符串的基本操作方式,描述了當前編程語言中使用到的字符 分類
import string
print(dir(string))
['Formatter', 'Template', '_ChainMap',
'_TemplateMetaclass', '__all__', '__builtins__',
'__cached__', '__doc__', '__file__', '__loader__',
'__name__', '__package__', '__spec__', '_re', '_string',
'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords',
'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation',
'whitespace']
import string
# 字母大小寫
print(string.ascii_letters)
# 字母小寫
print(string.ascii_lowercase)
# 字母大寫
print(string.ascii_uppercase)
# 數字
print(string.digits)
# 哈希
print(string.hexdigits)
還有好多,可以自己玩
4、time 模塊
在 Python 中,通常有這三種方式來表示時間
- 時間戳、時間元組(struct_time)、格式化的時間字符串
- 時間戳(timestamp) 時間戳表示的是從 1970 年 1 月 1 日 00:00:00 開始到現在的秒值。返回的是 float 類型 格式化的時間字符串(Format String): ‘1999-12-06’ 時間元組(struct_time)
- struct_time 元組共有 9 個元素共九個元素:(年,月,日,時,分,秒,一週的第幾日,一 年中第幾天,夏令時)
小結:
- 時間戳是計算機能夠識別的時間;
- 時間字符串是人能夠看懂的時間;
- 時間元組則是用來操作時間的;
時間元組屬性:
%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 當前時區的名稱
%% %號本身
import time
# 時間戳
print(time.time())
# 時間元組
ret = time.localtime()
print(ret)
print(ret[-2])
# 當前時間字符串
ret = time.localtime()
ret2 = time.strftime("%Y/%m/%d %H:%M:%S",ret)
print(ret2)
# 時間字符串轉換爲時間元組 strptime(時間字符串,"格式定義")
# 2019-08-08是2019年的第多少天?
ret = time.strptime("2019-08-08","%Y-%m-%d")
print(ret[-2])
執行結果