---
# System prepended metadata

title: 2022-11-19 第三天 Python入門實作班上課記錄
tags: [已轉移]

---

# 2022-11-19 第三天 Python入門實作班上課記錄
###### tags: `python`

#### 猜數字
1. 隨機產生四個不重覆數字
2. 建立一個可以一直猜的迴圈
3. 一個用來記錄次數的變數
4. 接收使用者的輸入
5. 比對答案，並告知幾A幾B
6. 紀錄次數
7. 猜對離開，並顯示結果(猜了幾次)
```python=
import random

a = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
random.shuffle(a)
answer = a[0] + a[1] + a[2] + a[3]
print(f'答案是:{answer}')

guess_count = 0  # 紀錄猜了幾次

while True:
    player = input('請猜一個四位數的數字(0~9)，不可重複:')
    guess_count += 1 # 增加猜的次數

    # 判斷書入的是不是數字
    try:
        int(player)
    except:
        # print('輸入的不是數字，請重新猜')
        raise Exception('亂猜，不能玩')

    # 判斷是不是四個數字，如果不是，請使用者重猜
    if len(player) != 4:
        print('數字不四個，請重新猜')
        continue
        
    # 判斷數字有沒有重複(如果有重複，請使用者重猜)
    if len(set(player)) > 4:
        print('數字有重覆，請重新猜')
        continue

    # 猜對
    if answer == player:
        break

    # 比較
    how_many_A = 0
    how_many_B = 0

    # 比對有幾個A
    if answer[0] == player[0]:
        how_many_A += 1
    if answer[1] == player[1]:
        how_many_A += 1
    if answer[2] == player[2]:
        how_many_A += 1
    if answer[3] == player[3]:
        how_many_A += 1

    if player[0] in answer and player[0] != answer[0]:
        how_many_B += 1
    if player[1] in answer and player[1] != answer[1]:
        how_many_B += 1
    if player[2] in answer and player[2] != answer[2]:
        how_many_B += 1
    if player[3] in answer and player[3] != answer[3]:
        how_many_B += 1

    print(f'{how_many_A}A{how_many_B}B, 你已經猜了{guess_count}次')

print(f'猜對了，總共猜了{guess_count}次')
```
> **進階練習:**
> 1. 判斷使用者輸入的數字是不是四個
> 2. 判斷使用者輸入的數字有沒有重覆

## 例外(exception)捕捉
```python=
# 例外(exception)捕捉
a = 0

try:
    a = int(input('請輸入一個數字:'))
    a /= 0
except ValueError: # 如果try裡面的程式碼都正常執行的話，except裡面的程式碼不會被執行
    print('Ooops, 轉型失敗')
except ZeroDivisionError:
    print('除數不能不能為0')

print(f'你輸入的數字是:{a}')
```
#### raise
```
raise Exception('Message')
```
raise可以用來產生一個例外，把程式中斷，通常只有在程式的錯誤無法被糾正的情況下。

#### 練習
1. 幫猜數字遊戲加上判斷使用者輸入如果不是數字，就請重猜。

## `range()`函式
`range()`用來產生一個連續整數
```
print(list(range(1, 10, 2)))

times = 0
while times < 10:
    print('*', end='')
    times += 1
print()

for i in range(10):
    print('*', end='')
```

## 函式
建立函式，並傳入參數:
```python=
def compare(a1, a2):  # 參數對於函式來說，就是函式內部的變數，外部無法存取
    print(a1, a2)

compare(1, 2)
compare('a', 'b')
compare(True, False)
```
> **注意:**
> 1. 函式定義時有幾個參數，呼叫時就要傳入幾個參數
> 2. 函式需要被呼叫才會執行函式內的程式碼

#### 預設參數和指定參數
```python=
# 定義沒有參數的函式
def func1():
    print('Hi')
    print('World')

func1() # 呼叫函式
a = func1()
print('func1=', a)

def func2():
    print('Hi')
    print('World')

    return 'OK'  # 回傳資料給呼叫端

func2()
a = func2()
print('func2=', a)

# 預設參數
def my_func(a, b, c = '沒傳c', d = '沒傳d'):
    print(f'a={a}')
    print(f'b={b}')
    print(f'c={c}')
    print(f'd={d}')

my_func('t', 'e')

# 指定參數，傳入的參數順序可以跟定義不同
my_func(c = '1', d = '2', a = '3', b = '4')

print('test', end='')
```

#### 練習
1. 建立一個函式max, 傳入兩個整數參數，然後回傳較大的那個
```python=
def max(num1, num2):
    if num1 > num2:
        return num1
    else:
        return num2

a = max(222, 333)
print(a)
a = max(987, 654)
print(a)
```
2. 建立一個函式swap，傳入兩個參數後，交換順序回傳。
```python=
def swap(a1, a2):
    return a2, a1  # ('apple', 'aaron')

a = 'aaron'
b = 'apple'
a, b = swap(a, b)

print(f'a={a}')
print(f'b={b}')
```

## 
1. 寫一函式get_score:
    - 有一個參數msg
    - 呼叫input()並把msg給input當題示串
    - 將input函式收到的字串轉成int型態
    - 回傳轉型成int型態的整數
```python=
a = get_score('請輸入一個整數:')
print('你輸入的是:', a, type(a))

a = get_score('請再輸入一個整數:')
print('你輸入的是:', a, type(a))
```
2. 建立一個無窮迴圈，裡面呼叫get_score()，請把回傳的整數都存到一個叫data的list裡面。
```python=
def get_score(msg):
    a = input(msg)
    b = int(a)

    return b

data = []

while True:
    num = get_score('請輸入一個數字:')
    data.append(num)

    print(data)
```

3. 當使用者輸入非數字時，離開迴圈
```python=
def get_score(msg):
    a = input(msg)
    b = int(a)

    return b

data = []

while True:
    try:
        num = get_score('請輸入一個數字:')
    except:
        break

    data.append(num)

    print(data)
```

4. 當離開迴圈後, 顯示:
    - 最大值
    - 最小值
    - 最大奇數值
    - 最小偶數值
    - 平均值
    
```
def get_score(msg):
    a = input(msg)
    b = int(a)

    return b

data = []

while True:
    try:
        num = get_score('請輸入一個數字:')
    except:
        break

    data.append(num)

    print(data)

print('目前的資料為:', data)
data.sort()
print('排序後資料為:', data)
print('最大數字為:', data[-1])
print('最小數字為:', data[0])

for n in data:
    if n % 2 == 0:
        print('最小偶數為:', n)
        break

data = data[::-1]

for n in data:
    if n % 2 == 1:
        print('最大奇數為:', n)
        break

print('平均值為:', sum(data) / len(data))
```
> **補充:**
> 最大奇數可以使用單行語法改寫:
> `print('最大奇數為:', [n for n in data[::-1] if n % 2 == 1][0])`
## 字串處理
- join
- replace
- split
- upper
- lower
- capitalize
- title
- strip
```
# - join
# - replace
# - split
# - upper
# - lower
# - capitalize # 字串第一個英文字母變大寫
# - title      # 字串每一個英文單字第一個字母變大寫
# - strip

a = '  Aaron,test,123     '

b = '.'.join(a)
print(b)

b = a.replace('o', 'K')
print(b)

b = a.split(',')
print(b)

b = a.upper()
print(b)

b = a.lower()
print(b)

b = a.capitalize()
print(b)

b = a.title()
print(b)

b = a.strip()
print(b)
```

#### 練習
```python=
a = '2022年11月19日 23:00'  # => 2022-11-18

b = a.replace('年', '-')
b = b.replace('月', '-')
b = b.replace('日', '')
b = b.split(' ')[0]
print(b)
```
或連續呼叫:
```python=
print(a.replace('年', '-').replace('月', '-').replace('日', '').split(' ')[0])
```

## 一級函式
```
def max(a1, a2):
    if a1 > a2:
        return a1
    else:
        return a2

a = max  # 這裡沒有小括號

print(a(3, 7))

def a1():
    print('Hi, I\'m Aaron')

def a2():
    print('Hi, I\'m Andy')

def a3():
    print('Hi, I\'m Andy')

def a4(x):
    x()

a4(a1)  # None
a4(a2)
a4(a3)
```

## LAMBDA
```python=
def max(a1, a2):
    if a1 > a2:
        return a1
    else:
        return a2
```
可以用lambda改寫:
```python=
max = lambda a1, a2: a1 if a1 > a2 else a2
```
呼叫方式跟函式一樣:
```python=
print(max(3, 4))
```

## 檔案處理
#### 寫入檔案
```python=
while True:
    student = []

    student.append(input('請輸入姓名:'))
    student.append(input('請輸入國文成績:'))
    student.append(input('請輸入英文成績:'))
    student.append(input('請輸入數學成績:'))

    with open('school.txt', 'a') as my_file:
        my_file.write(','.join(student) + '\n')
        
```
#### 讀入檔案
```python=
with open('school.txt', 'r') as my_file:
    for line in my_file:
        student = line.replace('\n', '').split(',')
        print(student)
```