函數
遞歸函數
什麼是遞歸函數?
在一個函數的內部調用自身的函數,稱爲遞歸函數。
注意:
分解:原問題可以分解爲若干個子問題,且子問題爲原問題較小規模的實例。
解決:遞歸求解子問題,當子問題的規模足夠小,則直接求解。
合併:將子問題的解一層層的合併返回,直到返回結束,得到原問題的解
由上可以得到,遞歸必須要有一個結束條件(規模足夠小,直接求解),而且需要一個遞歸的公式(子問題爲原問題較小規模的實例)。滿足以上條件纔是一個合理的遞歸函數,否則容易出現死循環。
匿名函數
匿名函數又稱lambda 表達式 或 lambda 函數,可以作爲參數傳遞。
格式: lambda 參數列表 : 表達式
爲列表中的字典排序問題
tmp_list = [{"name": "dragon", "age": 18}, {"name": "Dragon", "age": 20}]
tmp_list.sort(key=lambda x: x["name"]) # 根據name 鍵排序
print(tmp_list)
tmp_list.sort(key=lambda x: x["age"]) # 根據age 鍵排序
print(tmp_list)
列表推導式
作用:輕量級循環創建列表
定義格式: tmp_list = [表達式 for 臨時變量 in range(起始位置,結束位置,步長)]
有列表 [1,2,3,…10],將其變成[[1,2,3],[4,5,6],[7,8,9],[10]]
# 首先生成[1,2,3,...10]
a = [x for x in range(1, 11)]
print(a)
# 然後通過列表推導式產生下標,
# 通過表達式 使用下標 對a進行切片
# 得到目標列表
b = [a[x:x + 3] for x in range(0, len(a), 3)]
print(b)
文件
爲什麼需要文件?
因爲文件可以長期保存數據,省時省力。
文件的操作
文件的操作有 打開、關閉、讀取、寫入。
路徑
訪問文件需要知道文件的位置,也就是文件的路徑。
路徑分爲絕對路徑和相對路徑。
絕對路徑
絕對路徑是指從根目錄開始的路徑,window理解爲從盤符開始的路徑。
相對路徑
一般是相對於當前目錄(或文件夾)的路徑,不是從根目錄開始的路徑,window理解爲不是從盤符開始的路徑。
文件的打開模式
主要的 r(只讀)、w(只寫)、a(追加)
r 模式
- 默認模式,只讀模式
- 文件不存在,則程序報錯
- 文件存在,可以進行讀取
- w 模式
- 只寫模式
- 文件不存在,則創建一個新文件進行寫入
- 文件存在,每次打開都覆蓋原文件,然後寫入。
- a 模式
- 追加模式,特殊的 w 模式
- 文件不存在,則創建一個新文件進行寫入
- 文件存在,沒有內容,則直接寫入;有內容存在,在內容的末尾,進行追加寫入。
訪問模式 | 說明 |
---|---|
r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
w | 打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
a | 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
rb | 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。 |
wb | 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
ab | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
r+ | 打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
w+ | 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
a+ | 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。 |
rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
wb+ | 以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 |
ab+ | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。 |
打開與關閉文件
import os
# 文件路徑
file_path = "DragonFang.txt"
src_name = None
# 是不是一個文件
if os.path.isfile(file_path):
src_name = open("DragonFang.txt") # 是文件直接打開,默認r 模式
else:
src_name = open("DragonFang.txt", "w") # 不是文件,創建文件
src_name.close() # 使用完關閉文件
寫入與讀取文件
write()
向文件中寫入內容。
f = open('DragonFang.txt', 'w') # 以只寫模式打開
f.write('Hello DragonFang!') # write 將文件內容寫入文件
f.close() # 關閉文件
讀取
read()
- 一次性讀取全部內容
- 在一次打開操作之後,多次read(),除了第一次可以得到內容,其它得到的都是空字符串
read(x)
- 一次性讀取 x 個字節的內容
- 在一次打開操作之後,且內容讀取完畢,再次使用read(x) ,將得到空字符串
readline()
- 一次性讀取一行的內容
- 在一次打開操作之後,且內容讀取完畢,再次使用readline(),將得到空字符串
readlines()
- 一次性讀取全部內容,放到一個列表中,每一行的內容當做列表的一個元素
- 在一次打開操作之後,多次readlines(),除了第一次可以得到內容,其它得到的都是空列表
文件的相關操作
import os
# 文件的相關操作
# 文件的重命名,原文件不存在報錯
os.rename("Dragon.txt", "DragonFang.txt")
# 刪除文件,文件不存在報錯
os.remove("Dragon.txt")
# 判斷指定資源是不是一個文件,是返回True,不存在不報錯
os.path.isfile("Dragon.txt")
文件夾的相關操作
import os
# 創建文件夾,當文件夾不存在時創建,文件夾存在時報錯
os.mkdir("Dragon")
# 刪除文件夾,當文件夾存在時刪除,文件夾不存在時報錯
os.rmdir("Dragon")
# 獲取當前工作目錄
os.getcwd()
# 改變默認工作目錄,"./" 表示當前目錄 "../"表示上級目錄
os.chdir("../")
# 獲取目錄列表
os.listdir("./")
# 判斷指定路徑是不是文件夾,是返回True,路徑不存在不會報錯
os.path.isdir("")
到此結 DragonFangQy 2018.4.7