系統模塊 sys
系統模塊全都是運行時系統相關的信息
import sys
sys.path # 模塊搜索路徑 path[0] 是當前腳本程序的路徑
sys.modules # 已加載模塊的字典
sys.version # 版本信息
sys.version_info # 版本信息的命名元組
sys.platform # 操作系統平臺名稱信息
sys.argv # sys.argv綁定用戶啓動程序時命令行參數的列表
sys.copyright # 獲取python版權相關的信息
sys.builtin_module_names # 獲取python內建模塊的名稱(字符串元組)
sys.stdin # 標準輸入文件對象,多用於input()
sys.stdout # 標準輸出文件對象,多用於print()
sys.stderr # 標準錯誤輸出文件對象,多用於輸出錯誤信息
# sys的方法
sys.exit([arg]) # 退出程序,正常退出是sys.exit(0)
sys.getrecursionlimit() # 得到遞歸嵌套層次限制(棧的深度)
sys.setrecursionlimit(n) # 得到和修改遞歸嵌套層次限制(棧的深度)
自定義模塊
# 此模塊是用戶自定義模塊
# mymod1.py 文件
def myfun1():
print("正在調用mymod1裏的 myfun1()")
def myfun2():
print("正在調用mymod2裏的 myfun2()")
name1 = 'xiaomaomao'
name2 = "xiaoxiaomao"
# 導入mymod1並調用相應的數據和函數
# test_mymod1.py文件
import mymod1 # 導入模塊
from mymod1 import name2
mymod1.myfun1()
mymod1.myfun2()
print(mymod1.name1)
print(name2)
自定義模塊的模塊名必須符合標識符的命名規則(同變量名)
模塊有各自獨立的作用域
# mymod1.py 文件
def myfun1():
print("正在調用mymod1裏的 myfun1()")
def myfun2():
print("正在調用mymod2裏的 myfun2()")
name1 = 'xiaomaomao'
name2 = "xiaoxiaomao"
# mymod2.py 文件
def myfun1():
print("mymod2.myfun1()")
name1 = "shishi"
# 導入mymod1, mymod2並調用相應的數據和函數
# 各模塊內的變量不會衝突
import mymod1 # 導入模塊
from mymod1 import name2
import mymod2
mymod1.myfun1()
mymod1.myfun2()
print(mymod1.name1)
print(name2)
mymod2.myfun1()
print(mymod2.name1)
模塊化編程的優點:
(1) 有利於多人合作開發
(2) 使代碼更易於維護
(3) 提高代碼的複用率
(4) 有利於解決變量名衝突問題
模塊的加載與導入
import 語句搜索模塊的路徑順序
(1) 搜索程序運行時的路徑(當前路徑)
(2) sys.path 提供的路徑
(3) 搜索內置模塊
sys.path 是一個存儲模塊搜索路徑的列表
(1) 可以把自定義的模塊放在相應的路徑下可以導入
(2) 可以把自己模塊的路徑添加在sys.path列表中
# 模塊加載方法(2)
import sys
sys.path.append("模塊路徑")
import 模塊
模塊的加載過程
(1) 在模塊導入時,模塊的所有語句會執行
(2) 如果一個模塊以及導入,則再次導入時不會重新執行模塊內的語句
模塊的重新加載:
import mymod3
import imp
imp.reload(mymod3) # 重新加載mymod3模塊
mymod3.myfun4()
模塊被導入和執行的過程
(1) 先搜索相關的路徑找模塊(.py)
(2) 判斷是否有此模塊對應的.pyc文件,如果存在.pyc文件且.py文件新,則直接加載.pyc文件
(3) 否則用.py文件生成.pyc後再進行加載
pyc 模塊的編譯文件:
編譯 解釋執行
mymod1.py --------> mymod1.pyc --------> python3
模塊的屬性
屬性的實質是變量(是模塊內的全局變量)
模塊內預置得到屬性:
doc 屬性:用來綁定模塊的文檔字符串
'''這是模塊的文檔字符串的標題
這是文檔字符串的內容
此模塊包含兩個函數和兩個變量'''
def f1():
'''這是函數的文檔字符串'''
pass
print(__doc__)
print(f1.__doc__)
# 在控制檯中輸入help(mymod.py)就可以查看模塊以及函數的文檔字符串
file 屬性:file 綁定模塊對應的文檔路徑名
(1) 對於內建模塊,不綁定路徑(沒有__file__屬性)
(2) 對於其他模塊,綁定路徑的字符串
name 屬性:用來記錄模塊的自身名字
作用:
(1) 記錄模塊名
(2) 用來判斷是否爲主模塊(最先運行的模塊)
說明:當此模塊爲主模塊時,name 綁定 ‘main’; 當次模塊不是主模塊時,此屬性綁定模塊名。
模塊的__all__列表
模塊中的__all__列表是一個用來存放可導出屬性的字符串列表
作用:當用from import * 語句導入時,只導入__all__列表內的屬性
示例:
'''
此模塊示意__all__列表的作用和用法
'''
# 限制用from mymod6 import * 時只導入f1, var1
__all__ = ['f1', 'var1']
def f1():
pass
def f2():
pass
def f3():
pass
var1 = "hello"
var2 = "world"
模塊的隱藏屬性
模塊中以’_'開頭的屬性,在from import * 語句導入時,將不被導入,通常稱這些屬性爲隱藏屬性。
示例:
'''
此模塊示意模塊內的隱藏屬性
'''
def f1():
pass
def _f2():
'''
此函數在被其他模塊用from import * 導入時將不會被導入
'''
pass
var = "變量1"
_var2 = "變量2" # _var2也是隱藏變量,也不會被導入
隨機模塊 random
作用:用於模擬或生成隨機輸出的模塊
# 隨機模塊
import random as R
R.random() # 返回一個[0, 1)之間的隨機實數
R.uniform(a, b) # 返回[a, b)區間內的隨機實數
R.randrange([start,] stop[,step]) # 返回range(start, stop, step)中的隨機數
R.choice(seq) # 從序列中返回隨意元素
R.shuffle(seq[, random]) # 隨機指定序列的順序(亂序序列)
R.sample(seq, n) # 從序列中選擇n個隨機且不重複的元素
R.getrandbits(nbit) # 以長整型的形式返回用nbit位來表示的
R.seed(a=None) # 用給定的數a設置隨機種子
包 package
包是將模塊以文件夾的形式進行分組管理的方法
作用:將一系列模塊進行分類管理,有利於防止命名衝突,可以在需要時加載一個或部分模塊而不是全部模塊
示例:
__init__.py
menu.py
games/
__init__.py
contra.py
supermario.py
tanks.py
office/
__init__.py
excel.py
word.py
init.py文件:(1) 常規包中必須存在的文件 (2) init.py會在包加載時被自動調用
作用:編寫此包的內容;在內部填寫文檔字符串;在__init__.py內可以加載此包所依賴的一些其他模塊
包的導入:
用三條import語句可以導入包(同模塊的導入規則)
import 包名 [as 包別名]
import 包名.模塊名 [as 模塊新名]
import 包名.子包名.模塊名
from 包名 import 模塊名 [as 模塊新名]
from 包名.子包名 import 模塊名 [as 模塊新名]
from 包名.子包名.模塊名 import 屬性名 [as 屬性新名]
from 包名 import *
from 包名.模塊名 import *
包的相對導入
包的相對導入是指包內模塊的相互導入
語法:from 相對路徑包或模塊 import 屬性或模塊名
或 from 相對路徑包或模塊 import *
相對路徑:
. 代表當前目錄
… 代表上一級目錄
… 代表上兩級目錄
以此類推
注:相對導入時不能超出包的外部
示例:
# mypack/games/contra.py
def play():
print("正在玩contra")
print("contra模塊被加載")
def gameover():
# 用絕對路徑導入
# from mypack.menu import show_menu
# 用相對路徑導入
from ..menu import show_menu
show_menu()
包的加載路徑
與模塊的加載路徑相同
(1) 當前文件夾
(2) sys.path給出的路徑