# 第二天 Python入門實作班上課記錄
###### tags: `python`
#### 定義一個list和一個set
```python=
a = [1, 2, 3, 1] # list
b = {1, 2, 3, 1} # set
a.append(99) # list 新增資料
print(a[2])
b.add(99)
b.add(9)
b.add(99)
b.remove(1)
for value in b:
print(value)
```
說明:
1. list與set可以透過左右兩邊的括號分辨,中括號為list,大括號為set
2. set只能透過for-in迴圈取出裡面的元素值
#### dict(字典)
```python=
name = input('請輸入姓名:')
score = int(input('請輸入國文成績:'))
scores = {'aaron':99}
scores['test'] = 100
scores[name] = score
del scores['aaron']
print(scores)
```
說明:
1. 字典dict內的每一筆資料都是由key和value組成
2. value可以透過索引運算子+key來取得
3. 指派一個值到dict時,如果該key不存在,則為新增資料,否則為修改資料
#### Tuple
```python=
a = (1, 2, 3)
b = [1, 2, 3]
c = 1, 2, 3,
d = 1
e = 1,
print(d)
print(e)
```
1. Tuple左右兩邊為小括號
2. Tuple特性和list幾乎相同,差別在Tuple在建立後無法修改內容
3. 第一行和第三行是建立tuple的兩種方式
#### random模組
```python=
import random
a = random.randint(1, 10) # 產生1~10之間的隨機整數
print(a)
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
random.shuffle(b)
print(b)
```
說明:
1. `random.randint()`用來產生指定的兩個數字之間的隨機整數
2. `random.shuffle()`用來將list內的元素打亂
#### 小試身手-猜拳遊戲
```python=
import random
SCISSORS = 1
STONE = 2
PAPER = 3
pc = random.randint(1, 3) # 1 = 剪刀, 2 = 石頭, 3 = 布
print('電腦出:', ['剪刀', '石頭', '布'][pc - 1])
player = int( input('請出拳(1=剪刀, 2=石頭, 3=布):') )
if pc == SCISSORS and player == STONE:
print('你贏了')
elif pc == SCISSORS and player == PAPER:
print('你輸了')
elif pc == STONE and player == SCISSORS:
print('你輸了')
elif pc == STONE and player == PAPER:
print('你贏了')
elif pc == PAPER and player == SCISSORS:
print('你贏了')
elif pc == PAPER and player == STONE:
print('你輸了')
else:
print('平手')
```
#### 常用的字串操作方法
```python=
a = 'today Is a nICe day';
print(a.upper()) # 將字串內英文字元全部轉為大寫
print(a.lower()) # 將字串內英文字元全部轉為小寫
print(a.capitalize()) # 將字串內第一個英文字元轉為大寫
print(a.title()) # 將字串內每個英文單字的第一個字元轉為大寫
print(len(a)) # 計算字串長度
a = 'abcdefghijk'
print(','.join(a)) # 將字串內的每個字元之間都加上逗點
print(a + '3') # 將兩個字串串接在一起
print('a' * 10) # 將字串的內容重覆10次
name = 'aaron'
age = 18
# f-string: 將字串與變數組合在一起
print(f'My name is {name}, I\m {age + 10} years old')
```
#### 索引切片運算子
```python=
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(a[0:3])
print(a[3:]) # 取到最後一個
print(a[:2]) # 從第一個取
print(a[:])
print(a[:-1])
print(a[-3:-1])
print(a[-1:-3])
print(a[::2])
print(a[::-1])
# a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(a[-3:-1:-1])
print(a[-1:-3:-1])
```
執行結果:
```
[1, 2, 3]
[4, 5, 6, 7, 8, 9, 0]
[1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[8, 9]
[]
[1, 3, 5, 7, 9]
[0, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[]
[0, 9]
```
> 注意:
> 當最後一個step為負數時,其掃描方向為由右置左,需注意start需大於end參數,否則會取不到值
#### range()方法: 產生一串指定範圍的數字
```python=
print(list(range(10, 0, -1)))
for j in range(2, 10):
for i in range(1, 10):
print(f'{j} x {i} = {j * i}')
```
說明:
1. range()通常會和for-in迴圈搭配,用來指定迴圈執行的次數
#### while迴圈
```python=
a = 0
while a < 3:
print('*')
a += 1
```
#### 迴圈內可以使用的兩個指令
- break: 結束回圈
- continue: 忽略迴圈剩下程式碼,重頭執行
#### 猜數字遊戲
```python=
import random
answer = random.randint(0, 5)
while True:
player = int(input('猜一個數字:'))
if answer == player:
print('猜對了, 遊戲結束')
break
else:
print('猜錯.')
```
說明:
1. `while True:`為一個無窮迴圈
2. 第八行當使用者猜對數字時使用`break`指令跳離迴圈
#### 將一個list內的偶數加總
```python=
a = [1, 44, 5, 78, 93, 21]
total = 0
for val in a:
if val % 2 == 1:
continue
total += val
print(f'偶數的總和為{total}')
```
#### 將一個list內的奇數挑出來顯示到畫面上
```python=
a = [1, 2, 3, 4, 5, 6, 7]
i = 0
while i < len(a):
i += 1
if i >= len(a):
break
if i % 2 == 0:
continue
print(a[i])
```
#### 計算階層
```python=
fact_val = 1
for val in range(2, 4): # 3的階層
fact_val *= val
print('3的階層為:', fact_val)
fact_val = 1
for val in range(2, 5): # 4的階層
fact_val *= val
print('4的階層為:', fact_val)
```
#### 計算階層(函式版)
```python=
def fact(num): # 定義函式, 有num參數
fact_val = 1
for val in range(2, num + 1): # 某個階層
fact_val *= val
print(f'{num}的階層為:{fact_val}')
fact(3) # 呼叫fact函式
fact(4) # 呼叫fact函式
fact(5) # 呼叫fact函式
```
#### 一個可以對調兩個變數的函式
```python=
def swap(a, b):
return b, a
# 將a, b兩個變數內容對調
a = 2
b = 3
a, b = swap(a, b)
print(f'a={a}, b={b}')
```
#### return: 讓函式可以回傳資料
```python=
def test():
a = 3
b = 5
return 'x'
t = test()
print(t)
```
> 補充:
> 如果函式內沒有return,當使用指派(=)運算子去接收函式時會得到`None`
#### 一個極簡的函式
```python=
def a():
print('Hello')
a()
a()
a()
```
說明:
1. 函式需有呼叫的動作才會執行函式內的程式碼
2. 函式呼叫只需要使用函式名稱+小括號(如果小括內有參數需傳入參數)
#### 本日最終時戰練習: AB猜數字遊戲
玩法:
1. 產生0~9之間隨機四個不重複數字作為答案
2. 讓玩家猜四個數字,需檢查數字不可以重複(例如: 1233是無效的)
3. 如果玩家猜的四個數字內有和答案一樣且位置也一樣則以多少A來提示有幾個數字正確
4. 如果數字猜對,但位置不對,則以多少B來提示玩家(不包含位置正確的數字)
```python=
import random
a = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
random.shuffle(a)
print("After shuffle", a)
answer = a[0] + a[1] + a[2] + a[3]
print('答案:', answer)
guess_count = 0 # 猜了幾次
while True:
user = input('猜四個數字(0~9)之間不重複數字:') # 2. 使用者猜數字
guess_count += 1 # 猜的次數加一
if len(set(user)) < 4:
print('不可以有重複數字,已猜了', guess_count, '次')
continue
# 猜對了,結束遊戲
if user == answer:
print('恭喜,猜對了,總共猜了', guess_count, '次')
break
# 比較
how_many_A = 0 # 幾A
how_many_B = 0 # 幾B
if answer[0] == user[0]:
how_many_A += 1
if answer[1] == user[1]:
how_many_A += 1
if answer[2] == user[2]:
how_many_A += 1
if answer[3] == user[3]:
how_many_A += 1
if user[0] in answer and user[0] != answer[0]:
how_many_B += 1
if user[1] in answer and user[1] != answer[1]:
how_many_B += 1
if user[2] in answer and user[2] != answer[2]:
how_many_B += 1
if user[3] in answer and user[3] != answer[3]:
how_many_B += 1
print(f'{how_many_A}A{how_many_B}B, 你已經猜了{guess_count}次')
```