---
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!
:::