Python學習筆記五(函數、文件)

函數

遞歸函數

什麼是遞歸函數?

在一個函數的內部調用自身的函數,稱爲遞歸函數。
注意:

分解:原問題可以分解爲若干個子問題,且子問題爲原問題較小規模的實例。
解決:遞歸求解子問題,當子問題的規模足夠小,則直接求解。
合併:將子問題的解一層層的合併返回,直到返回結束,得到原問題的解

由上可以得到,遞歸必須要有一個結束條件(規模足夠小,直接求解),而且需要一個遞歸的公式(子問題爲原問題較小規模的實例)。滿足以上條件纔是一個合理的遞歸函數,否則容易出現死循環。

匿名函數

匿名函數又稱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

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