--- title: 'Python學習筆記' disqus: hackmd --- Python 學習筆記之路 Part.3(下) = > 上一回(第二回)講了數據大小的比較、轉換 > [第一回](<https://hackmd.io/@wr2rCYhVRSeVzSIPcixIiQ/Hk5UQ9b-a>) > [第二回](<https://hackmd.io/wVM476iMRIqXglr77AA61g> "Title") > [第三回(上)](<https://hackmd.io/@wr2rCYhVRSeVzSIPcixIiQ/SJqSEHrGT> "Title") > 此回要接續上篇,著重介紹:文件處理 目錄 == [TOC] 傳入參數 == ### 函數多個回傳值(return) > 有些時候在一個function內,我們會希望有多個函數值能夠回傳出來,使用多個variable進行接收即可 ```gherkin= # 函數多return值 # return後的語句不會被執行 # 返回出來的值為tuple # 返回多個值, 用多個變量去接收就可以了 def test_return(): return 1,2,3 x, y, z = test_return() print(type(test_return())) print(x, y, z) ``` ### 傳入參數 > 利用位置參數傳入 ```gherkin= def user_info(name, age, gender): print(f"姓名{name}, 年齡是:{age}, 性別為:{gender}") user_info('小名', 18, '男生') ``` >關鍵字傳入 ```gherkin= # 可以不按照順序 # 可與位置參數一起使用 user_info('小王', gender = '女生', age = '29') ``` > 默認參數 可以看到將預設值先放到前面,結果會顯示錯誤 ```gherkin= # 如果不傳入參數則使用本來的默認參數 # 傳入參數的話就用傳入的 # 特別注意, 設置默認參數必須是在最後面 # 如果將默認參數調至前方則會出現錯誤 # Correct def user_info(name, age, gender ='南'): print(f"姓名{name}, 年齡是:{age}, 性別為:{gender}") user_info('小天', 13) user_info('小天', 13, gender = '女' ) # Error def user_info(name = '小天', age, gender): print(f"姓名{name}, 年齡是:{age}, 性別為:{gender}") ``` > 不定長參數輸入 當你不知道到底要傳入幾個可以直接利用*作為語法輸入,而透過這個語法傳入的所有參數,都會被認列為tuple ```gherkin= # 不定長定義的形式參數, 會做為元組存在 # 作用: 當你不知道使用者要輸入多少個parameter時可以用 # 位置傳遞的不定長:使用*作為語法 def user_info(*args) : print(f"args的參數類型是{type(args)}, 內容是:{args}") user_info(1,2,3, '小名', '男生') ``` > 不定長的參數傳入 ```gherkin= # 關鍵字傳遞的不定長:使用**為語法 # 利用key = value的形式 # 傳出的類型會是dict def user_info_k(**kwargs): print(f"kwargs的參數類型是{type(kwargs)}, 內容是:{kwargs}") user_info_k(1,2,3, '小名', '男生') # 錯誤 user_info_k(name = '小王', age = 11, gender = 'boy', addr = '四川') ``` ### 匿名函數 通常我們會用在一行的測試內容,或是函數不大的情況下,既便捷又輕鬆 ```gherkin= ### 匿名函數 # lamda函數 # def 所定義出來的函數具有名稱 # lamda 所定義的函數不具有名稱, 只能臨時使用一次 # 語法: lamda (傳入參數):(函數體) # 注意 :lamda函數只能寫一行, 不能使用多行;lamda默認內部是return def test_func(compute): result = compute(1, 2) print(f"結果是{result}") test_func(lambda x, y: x+y) test_func(lambda x, y: x * y) ``` Documents coding == > 利用coding技術將內容翻譯成0 v 1存入 > > 許多可用編碼:UTF-8, GBK, Big5...等 > > UTF-8是目前全球通用的coding ### How to read documents >Open files in Python 語法:open(name, mode, encoding) 注意:這個是已經存在的file name: 打開目標file的名稱 mode: 設置打開文件的模式, 有只讀(r)、寫入(w)、追加(a)...等 encoding:編碼模式(UTF-8) EX: f = ('python.txt', 'r', encoding = UTF-8) #### 示範 > 請先在桌面或你喜歡的地方新增一個test.txt文件 > 第一列輸入:123456789 > 第二列輸入:987654321 ```gherkin= # 打開file f = open("你的路徑", "r", encoding=("UTF-8")) print(type(f)) # 閱讀file # read、readlines # read(num), num表示你要讀取多少個字節, 不給字節num則讀取全部 print(f"讀取10個字節後的結果為: {f.read(10)} ") ## 注意!連續使用read, 會從上一次read的結尾讀取 ## 所以你很有可能上面程式碼讀取了123456789,接下來卻讀不到123456789 ## 那是因為你已經在第一次讀取過了,所以會從尾端開始讀取 print(f"讀取全部字節後的結果為: {f.read()} ") ``` ##### readlines()/readline() ```gherkin= # 一、readlines() lines = f.readlines() # 讀取文件的全部行, 封裝到[list]中 print(f"讀取全部字節後的類型是:{type(lines)}, 結果為: {lines} ") # 二、readline() # 一次讀取一行 line1 = f.readline() line2 = f.readline() line3 = f.readline() print(f"第一行數據是:{line1}\n第二行數據是:{line2}\n第三行數據是:{line3}") ``` #### 用for迴圈讀取資料 ```gherkin= # # 利用for循環得到文件行 for i in f: print(i) import time print(time.localtime()) # Close file # 語法:close() # 若沒有關閉文件, 則會一直占用Python內的空間 f.close() ``` #### 寫入文件 ```gherkin= # 使用wirte就可以進行操作 # 語法:f.write # 注意:write是先寫在內存裏頭, 並沒有寫進硬碟裡面 # 要寫入硬碟中可以使用flush()更新 # 頻繁的調用write寫入硬碟會倒置效率下降 # 文件若不存在, 會直接創造一個, 最後要使用close進行更新 # f.close也有相同效果, 內置close功能 f = open("你想創建的位置", "w", encoding="UTF-8") f.write("Hello world") f.flush() f.close() # 打開一個存在的文件 # w寫入模式會把裡面已有的內容清空並覆蓋 f = open("你想創建的位置", "w", encoding="UTF-8") f.write("挑戰畢業即百萬年薪") f.close() # # a模式(add模式) # # 若file不存在會創建文件,所以會直接製造一個新的test2.txt文件 # # 若file存在會在已有的基礎上, 在file內容後增加 f = open("你想創建的路徑\test2.txt", "a", encoding="UTF-8") f.write("Hello world") f.write("我愛你") f.write("\n挑戰年薪500萬") f.flush() ``` 結語 == 上下篇長度其實都不長,只是我認為這樣分段對於我在找尋筆記會比較好處理。 第四回開始就是跟ERROR相處,知道如何利用try、except去使用。 :::info **Find this document incomplete?** Leave a comment! :::