Python學習筆記五

系統模塊 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給出的路徑

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