python(基礎--模組[遞迴])
模組(是一個名稱空間,也是一個模組物件)
補充:容器 ->資料的封裝
函式 ->語句的封裝
類 ->方法和屬性的封裝
含義:模組是一個包含所有你定義的函式和變數的檔案,其後綴名是.py。模組可以被別的程式引入,以使用該模組中的函式等功能。這也是使用 python 標準庫的方法。(模組就是程式)
作用:1封裝程式碼
2實現程式碼的重用
import 語句(隱性運算)
含義:匯入整個模組,包括聲稱一個以模組名命名的名稱空間
想使用 Python 原始檔,只需在另一個原始檔裡執行 import 語句,語法如下:
import module1[, module2[,… moduleN]
使用模組中的函式名時,使用格式為module1.函式
from … import 語句
from modname import name1[, name2[, … nameN]]
含義:只匯入指定模組的部分屬性到當前的名稱空間
這個宣告不會把整個模組(from後的模組)匯入到當前的名稱空間中,它只會將import後的函式引入進來。(可直接使用,不需要在用)
from … import * 語句
把一個模組的所有內容全都匯入到當前的名稱空間也是可行的,
from modname import *
但是那些由單一下劃線(_)開頭的名字不在此例。大多數情況, Python程式設計師不使用這種方法,因為引入的其它來源的命名,很可能覆蓋了已有的定義。(不建議使用)
Import … as…
匯入一個模組(名稱空間),並且給這個名稱空間起一個別名
注意:使用了as後,只能使用別名,不能使用原始名稱
Import和from的區別
注意:1import將整個模組物件賦值給一個變數名
2from將一個或多個變數名賦值給匯入此模組的模組中的同名物件(若當前名稱空間已經有了一個相同數屬性,from之後被覆蓋)
Import語句匯入指定的模組時,系統執行的步驟:
1.找到模組檔案
在指定路徑下搜尋模組檔案
2.編譯成位元組碼
檔案匯入時就會編譯,因此,頂層檔案的pyc位元組碼檔案在內部使用後會被丟棄,只有被匯入的檔案才會留下.pyc檔案(pyc檔案就是.py檔案編譯後的檔案)
3.執行模組的程式碼來建立其所定義的物件
模組檔案中的所有語句會依次執行,從頭到尾,而此步驟中任何對變數名的賦值運算,都會產生所得到的模組檔案屬性
注意:1.模組只有在第一次匯入時才會執行如上步驟
2.後續匯入操作只不過是提取記憶體中已載入的模組物件
3.reload()可用於重新載入模組
深入模組
模組除了方法定義,還可以包括可執行的程式碼。這些程式碼一般用來初始化這個模組。這些程式碼只有在第一次被匯入時才會被執行。
每個模組有各自獨立的符號表,在模組內部為所有的函式當作全域性符號表來使用。
name__屬性
一個模組被另一個程式第一次引入時,其主程式將執行。如果我們想在模組被引入時,被引入的模組中的某一程式塊不執行,我們可以用__name__屬性來使該程式塊僅在該模組自身執行時執行。(是在被引用的模組進行判斷, name__是否等於__main
if name == “main”:
print(“主程式”)
else:
print(“不是主程式”)
注意:在引入某模組時候,是先將被引入的模組的程式碼執行一遍,在從主程式上進行順序執行。
搜尋路徑:
含義:在程式匯入模組的時候,系統會到預設路徑中去搜索,找到了就匯入,找不到就報錯。
以下程式碼顯示系統的搜尋路徑:
import sys
print(sys.path)
試行結果:
[‘E:\project’, ‘E:\project’, ‘E:\project\venv\Scripts\python36.zip’, ‘E:\Anaconda3\DLLs’, ‘E:\Anaconda3\lib’, ‘E:\Anaconda3’, ‘E:\project\venv’, ‘E:\project\venv\lib\site-packages’, ‘E:\project\venv\lib\site-packages\setuptools-39.1.0-py3.6.egg’, ‘E:\project\venv\lib\site-packages\pip-10.0.1-py3.6.egg’, ‘D:\PyCharm 018.1.4\helpers\pycharm_matplotlib_backend’]
將要匯入的模組的路徑新增到系統的搜尋路徑中(一般將模組匯入到site-packages資料夾中 ):
sys.path.append(“路徑”)
包(package)
含義:包是一個有層次的檔案目錄結構,它定義了一個由模組和子包組成的Python應用程式執行環境
包的建立流程:
1建立一個資料夾,用於存放相關的模組,資料夾的名字即包的名字
2 在資料夾中建立_init_.py的模組檔案,內容可以為空(必須建立,用來告訴python,把這個資料夾當作一個包)
3 將相關的模組放入資料夾中
在程式中匯入包:
Import 包名.模組名
補充:init.py的模組檔案通常為空,僅用於扮演包初始化的掛鉤,替目錄產生模組名稱空間以及使用目錄匯入時實現from * 行為的角色
dir(模組名) 函式
內建的函式 dir() 可以找到模組內定義的所有名稱。以一個字串列表的形式返回
模組名.all()
類似於一個刪除方法,可將這麼模組中能被外界呼叫的方法以一個列表的形式打印出來
注意:1並不是所有的模組都有all屬性
2當一個模組有all屬性時,當在程式中使用了, from 模組名 import * 形式匯入到當前名稱空間,則模組匯入的只是all屬性中所有的屬性。
如果沒有all屬性時,from 模組名 import * 形式匯入了所有帶下劃線_的屬性全部匯入到當前名稱空間中
補充:1匯入一個模組時, 使用”模組.file”可以檢視該模組在系統中存在的路徑
2 help(模組名) ,print(模組名.doc) 可檢視該模組的說明
3使用print(locals())可檢視當前作用域中定義的屬性
標準模組
有些模組直接被構建在解析器裡,這些雖然不是一些語言內建的功能,但是他卻能很高效的使用,甚至是系統級呼叫也沒問題。
這些元件會根據不同的作業系統進行不同形式的配置,
OS模組:
Operating System (作業系統)
我們並不關心什麼作業系統使用什麼模組,怎麼選擇由os模組去選擇
OS.putenv
In [8]: os.putenv(“path”,r"E:\張同\張同_作業")
In [9]: os.system(“20180822.txt”)
Out[9]: 0
輸入和輸出
三種輸出值的方式: 表示式語句和 print() 函式,檔案物件的 write() 方法,標準輸出檔案可以用 sys.stdout 引用。
• str(): 函式返回一個使用者易讀的表達形式。
• repr(): 產生一個直譯器易讀的表達形式
遞迴(分治思想)
特徵:1.有呼叫函式自身的行為
2.有正確的返回條件
import sys
sys.setrecursionlimit(100)
設定遞迴的最大次數