Python_模塊導入_包操作_內置模塊_詳細解讀(9)

一、模塊

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])


執行結果
在這裏插入圖片描述

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