---
# System prepended metadata

title: Python學習筆記 第三回(下)
tags: [筆記]

---

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


