# 東山程式研究社 教學講義 - Python篇
||RE:從零開始的python生活||
###### 本篇內容僅止於理論層面,實際的應用要自己多練習才行,練習非常的重要,光聽理論不練習等於是白學了,當然,所謂練習不一定是要去zerojudge之類的刷題,自己找點專案來做也是一個不錯的方法
###### 事前聲明:本篇多數內容源於作者本人的經驗,不保證完全正確,如有錯誤,敬請提出
## 基本概念 - 各種的數
> 寫程式的時候會有各種的'數',對於他們要有清楚的概念才能順利做開發喔
### 1.常數
> 程式中的常數就跟數學裡的常數一樣,就是`1`, `2`, `3`, `4`, `5`等數字
### 2.變數
> 程式中的變數對應到數學中最接近的就是`x`,本質上是以一個名字代表一個數字,小學高年級教的"設x為ooo的數量"就是類似變數的概念
### 3.函數
> 程式中的函數概念就類似數學中的`f(x)`,用`f`代表對於`x`的一連串操作
## 基本素養 - 命名
### 0.為什麼要學基本素養
> 子曰 : 「弟子入則孝,出則弟,謹而信,汎愛眾,而親仁。 行有餘力,則以學文」
> 意思是青年人在家要講求孝道,出外要友愛兄長,行為謹慎而說話信實,普遍關懷他人,並接近有仁德的人,做好這些事之後有餘力,再努力學習書本上的知識
> 做開發也是一樣的道理,要先有寫程式的基本素養,再去學習實際應用上的語法
### 1.變數命名
> 變數命名是一個很大的學問,想要學好程式語言的第一步就是學會怎麼給變數取個適當的名字
> (1) 變數的名稱是給人看得,因此最重要的就是要看的懂且容易理解,`a`, `b`, `c`, `d`就是看不懂的名稱,因此不是個好命名||~~如果說是和其他人一起開發的話這樣的命名一定會被揍~~||,不過有時候做個測試懶得想名字的話也是可以用啦
> (2) 變數為了讓人理解他的意思,因此經常會連接好幾個單字,這個時候就有各種做法了,假如要設定一個由`eat`和`apple`合起來的變數,那麼通常會用`EatApple`, `eatApple`, `eat_apple`等命名方式
> (3) 變數的名稱其實沒有強求要用英文,但平常也不會有人用中文去給變數命名
### 2.函數命名
> 函數命名其實跟變數命名大差不差,只不過通常函數跟變數會用兩種不同的命名風格,才不容易搞混
### 3.檔案命名
> 在開發專案時,通常會有一個主程式和其他的副程式,這個時候,主程式通常會叫做`main.py`(就算是其他語言也還是會用`main`)
> 其他的副程式通常會根據其功能來命名,切記,**不要用中文幫檔案命名**
## 基本素養 - coding style
> coding style是寫出漂亮的程式前最重要的一個素養,沒有好的coding style的話,不只整體不好看,更是會讓其他人在讀的時候很煩躁
### 1.基本的coding style
> (1) 在運算符號和變數的前後都要加上`space`,`,`的後面也要加上一個`space`
> (2) 當程式的長度拉長後,就會慢慢分成一區一區的,這個時候區與區之間通常會留一行空白,以方便區分
> (3) 注意,coding style有很多種流派,每一個人都不太一樣,重點在於不要讓人看得很煩躁
> ### 不好的coding style(擠成一坨,讓人看得很煩躁)
> ```python=1
> number1=1
> number2=5
> for i in range(10): #重複跑下面那一行10次
> number1=((number2+5)-(3+2/number1))/3-2
> print(number,end=' ')
> ```
> ### 好的coding style(運算子之間適度分開,增加可讀性)
> ```python=1
> number1 = 1
> number2 = 5
> for i in range(10): #重複跑下面那一行10次
> number1 = ((number2+5) - (3+2 / number1))/3 - 2
> print(number, end=' ') #一般來說=前後會加空格,但是用在屬性時就是例外
> ```
## 基本素養 - 註解
> 在做多人開發時,因為是大家一起合作,因此要看的懂別人寫的程式,以及要讓別人看得懂自己寫的程式,因此需要註解
> 寫註解的時候要盡量讓人能夠清楚明白該段程式在做什麼
> ```python=1
> w = float(input()) #把輸入的資料強制轉換成數字
> h = float(input())
> ans = w / h ** 2 #不寫註解的話就要花時間才知道這是在算bmi
> print(ans)
> ```
## 基本語法 - 變數(variable)
### 1.設定變數
> python設定變數不像C/C++那麼麻煩,只要`a = xxx`就行了
> 命名規則就跟其他語言一樣,不能和函數重複名稱、不能用數字開頭、不能有空格、不能用`+ - * /`等有意義的符號等等
### 2.變數的值
> 變數的值要改變的話,就跟設定時一樣,使用`=`
> 改變變數的數值時也可以用`a += 1`,意思是`a = a + 1`,也可以替換成`- * /`等運算子
> ```python=1
> num = 10
> num += 1
> print(num)
> ```
> ### 選項
> ```
> (A) 9
> (B) 10
> (C) 11
> ```
> 答案:||C||
>
## 基本語法 - 基本運算子
> 基本運算子簡單來講就是`+ - * /`這些,通常會跟變數一起用
### 1. +
> 非常的簡單,就是數學上的`+`
> ```python=1
> num = 10 + 1
> print(num)
> ```
> ### 選項
> ```
> (A) 9
> (B) 10
> (C) 11
> ```
> 答案:||C||
### 2. -
> 跟`+`差不多,就是數學上的`-`
> ```python=1
> num = 10 - 1
> print(num)
> ```
> ### 選項
> ```
> (A) 9
> (B) 10
> (C) 11
> ```
> 答案:||A||
### 3. *
> 反正就是乘
> ```python=1
> num = 10 * 2
> print(num)
> ```
> ### 選項
> ```
> (A) 5
> (B) 20
> (C) 100
> ```
> 答案:||B||
### 4. /
> 除以
> ```python=1
> num = 10 / 3
> print(num)
> ```
> ### 選項
> ```
> (A) 1
> (B) 3
> (C) 3.0
> (D) 3.33333
> ```
> 答案:||D||
### 5. //
> 也是除以,只不過小數無條件捨去
> ```python=1
> num = 10 // 3
> print(num)
> ```
> ### 選項
> ```
> (A) 1
> (B) 3
> (C) 3.0
> (D) 3.33333
> ```
> 答案:||B||
### 6. %
> 也是除以,不過是餘數
> ```python=1
> num = 10 % 3
> print(num)
> ```
> ### 選項
> ```
> (A) 1
> (B) 3
> (C) 3.0
> (D) 3.33333
> ```
> 答案:||A||
### 7. **
> 是次方
> ```python=1
> num = 10 ** 2
> print(num)
> ```
> ### 選項
> ```
> (A) 5
> (B) 20
> (C) 100
> ```
> 答案:||C||
## 基本語法 - I/O
### 1.print()
> 最基本的`print()`中要傳入一個`object`,以下以`"hello world"`為例
> ```python=1
> print("hello world")
> ```
> ### output
> ```
> hello world
> ```
> `print()`中總共可以傳入至少一個物件+四個屬性,分別是`object`, `sep`, `end`, `file`, `flush`,屬性如果不寫的話就是用預設值
> `object`是輸出的內容,也就是物件,是`print()`最重要的部分,多於一個的話要用`','`分隔
> `sep`是兩個或以上`obejct`之間的間隔,預設是空格
> `end`是本次輸出的結尾,預設是`\n`,也就是換行
> `file`是本次輸出夾帶的檔案,預設是`None`
> `flush`不常用到,我也不會用,總之預設是`False`
> ```python=1
> print("hello world", "python")
> print("hello world", "python", sep=',')
> print("hello world", "python", sep=',', end='!')
> ```
> ### output
> ```
> (A) hello world python
> hello world,python
> hello world,python!
>
> (B) hello world python
> hello,world,python
> hello world!python,
> ```
> 答案:||A||
### 2.input()
> 輸入就非常的簡單,就是`input()`,其中可以傳入內容,但就只是在輸入時印出來,通常用於給使用者指示
## 基本語法 - type(類型)
> 可以使用`type()`去取得變數的類型
> 可以使用`type_name()`去強制轉換格式(不要真的打`type_name(xxx)`那裡是要填自己要的type的),但是通常只用在`int`, `float`, `str`之間(有沒有其他的我不知道),其他type的話會因為格式問題跳出`TypeError`
> 實際上python的type遠不止以下這些,有些模組甚至會有自己的特殊的type,例如`discord.py`有一種獨立的type叫做`<class 'discord.message.Message'>`
### 1.int
> `int`是整數,全名是integer,和在C/C++的上限2^31^-1不同,python的`int`沒有上限(查資料查到的,實際我也沒有測到他的上限),如果把數值換成`int`的話,會無條件捨去到整數
> 或許有點用處的小知識 : 如果把文字的`'123'`轉換成`int`的話,它會確確實實的變成數字的`123`
> ```python=1
> print(int(1.9))
> ```
> ### 選項
> ```
> (A) 1
> (B) 1.9
> (C) 2
> ```
> 答案:||A||
### 2.float
> `float`是浮點數,也就是有小數點的數,在C/C++中浮點數有`float`和`double`,但是在python只有`float`
> 或許有點用處的小知識 : 如果說把整數轉變成`float`的話,數字後面會多一個`.0`
> 或許有點用處的小知識 : python的無限大是`float`
> ```python=1
> num = float(1)
> print(num)
> ```
> ### 選項
> ```
> (A) 1
> (B) 1.0
> (C) 1.0000
> ```
> 答案:||B||
### 3.str
> `str`是字串,全名是string,以`" "`或`' '`括起來,不像C/C++分成`char`跟`String`,python就只有`str`,值得注意的是`str`有需多性質跟`list`是通用的,但也有只屬於`str`本身的性質,後面會詳細講,||因為真的超級多,這裡寫不下||
> ```python=1
> print("hello,world".split) #split可以把str從指定的地方分開,這裡次從,的地方分開
> print("abcd"[0]) #str也可以有list的索引值的概念
> print("abcd".upper()) #upper可以把所有字母變大寫
> print("ABCD".lower()) #lower可以把所有字母變小寫
> ```
> ### output
> ```
> ['hello','world']
> 'a'
> ABCD
> abcd
> ```
### 3.1.f-string
> 屬於`str`的變種,本質上是一種`str`,特別的是可以用`{variable}`插入變數,寫法就是在`""`前面加一個`f`
> ```python=1
> number = 10
> print(f"number is {number}") #f-string
> print("number is {number}") #str
> ```
> ### output
> ```
> number is 10
> number is {number}
> ```
### 4.list
> `list`有很多種名稱,陣列、清單、串列之類的通通都是`list`,它就是一串的清單,處存很多的資料,其中,以索引值(`index`)來提取資料(第一項是`0`),以中括弧`[]`括起來,其中的資料被稱為元素(`element`)
> `list`的部分後面還會單獨拿出來仔細講,因為很重要,這裡只是簡單帶過
> ```python=1
> List = [1,2,3,4,4,4]
> print(List[0])
> del List[0] #del可以刪除list中指定位置的資料,這裡是刪掉list的第一項
> print(List)
> List.remove(4) #remove可以刪除list中所有指定的資料,這裡是刪掉所有的4
> print(List)
> ```
> ### output
> ```
> 1
> [2,3,4,4,4]
> [2,3]
> ```
### 5.tuple
> `tuple`跟`list`非常相似,差別在於`tuple`不可改變,且讀取速度比較快
> ```python=1
> t = (1,2,3)
> print(t[0])
> ```
> ### output
> ```
> 1
> ```
### 6.dict
> 全名dictionary,也很類似`list`,差別在於`dict`的索引由使用者自訂,前後以大括弧`{}`括起來
> ```python=1
> diction = {
> "apple":"banana",
> "melon":"mango"
> }
> print(diction["apple"]) #叫出diction裡面引索是"apple"的內容
> ```
> ### output
> ```
> 'banana'
> ```
### 7.bool
> 全名boolean,就是`True`跟`False`
> 有點用的小知識 : 除了`0`以外,其他的文字數字一蓋會被判定為`True`,只有`0`是`False`
> ```python=1
> print(type(True))
> ```
> ### output
> ```
> <class 'bool'>
> ```
### 8.range
>一般用在`for`迴圈||~~其實我根本就沒有在其他地方用過,這裡會講單純只是因為後面要提到了~~||,後面會有三個值,分別是最小值、最大值和差,並會形成一個數列
>```python=1
>r = range(0,5,2) #r = [0,2,4]
>print(r[0], r[1], r[2], sep='\n')
>```
>### output
>```
>0
>2
>4
>```
### 9.其他
> 以上只是舉了一些我有想到的type,實際上python還有很多各式各樣的類型,剩下的自己去發現吧(雖然就算不會那些type也不會怎樣)
## 基本語法 - 特殊字元
> 一律以`\`開頭,如果說真的要打反斜線的話,要打兩個`\`
> 通常用於輸出的時候
> 1.`\n`是換行,就是很單純的在輸出的時候換行
> 2.`\t`是`tab`,在輸出的時候印出一個縮排(通常是四個空格,有時候是兩個)
> 3.`\b`是倒退字元,作用跟鍵盤上的`backspace`一樣,就是往後退一格
> 4.`\0`是空字元,用於`str`的結尾
> 5.`\r`在輸出的時候會跳回當前那一行最前面,後面輸出的東西會把先前的覆蓋掉
> ```python=1
> text = "abc\ndef\tghi\bjkl\r12"
> print(text)
> ```
> ### output
> ```
> abc
> 12f ghjkl
> ```
## 基本語法 - if elif else(條件判斷)
### 1.運算子
> 運算子有很多種,也都有各自的用途,基本上分成邏輯運算子、比較運算子、算數運算子,在這一部份主要使用邏輯運算子跟比較運算子,算數運算子主要用於變數的操作,也就是數學上常用的`+ - * /`等
> 運算子的大重點 : 使用邏輯運算子跟比較運算子時,會有一個`bool`的回傳值,`if`之所以常常直接接判斷式就是後面運算子回傳的`True` `False`
> 條件判斷的大重點 : 要告訴電腦`if`, `elif`, `else`成立時要執行那些動作,因此使用縮排來標示其內容
> ### (1)邏輯運算子
> > 常見的有`and`, `or`, `not`,用於判斷兩邊的值
> > ```python=1
> > a = True and True
> > b = True and False
> > c = True and not False
> > d = True or False
> > print(a, b, c, d)
> > ```
> > ### 選項
> > ```
> > (A) True False True True
> > (B) True True False False
> > (C) False True True False
> > (D) False False False True
> > ```
> > 答案:||A||
> ### (2)比較運算子
> > 常見的有`==`, `>=`, `<=`, `!=`, `>`, `<`,用於判斷兩邊的數值
> > ```python=1
> > a = 1 == 1
> > b = 1 >= 2
> > c = 1 <= 2
> > d = 1 != 1
> > e = 2 > 1
> > f = 2 < 1
> > print(a, b, c, d, e, f, sep=',')
> > ```
> > ### 選項
> > ```
> > (A) True,False,True,True,True,False
> > (B) True,False,True,False,True,False
> > (C) False,False,True,True,False,True
> > (D) 1 == 1,1 >= 2,1 <= 2,1 != 1,2 > 1,2 < 1
> > ```
> > 答案:||B||
### 2.if
> `if`就跟英文的意思一樣,就是如果,`if`後面如果是`True`那麼就會執行接下來的動作,`False`則不執行,前面的那些運算子就是用來接在`if`後面,去判斷條件成不成立
> ```python=1
> a = 1
> if a == 1:
> print("good")
>
> if a == 2:
> print("bad")
> ```
> ### 選項
> ```
> (A) good
> (B) bad
> ```
> 答案:||A||
### 3.elif else
> `elif`是在前面的`if`不成立時,才會執行的判斷式,`else`是前面的所有判斷式都不成立時,就會直接執行裡面的內容
> ```python=1
> a = 1
> if a == 2:
> print("good")
>
> elif a == 3:
> print("bad")
>
> else:
> print("so so")
> ```
> ### 選項
> ```
> (A) good
> (B) bad
> (C) so so
> ```
> 答案:||C||
## 基本語法 - loop(迴圈)
> 迴圈是一個重複執行的結構,根據使用者的設定進行重複
> 迴圈的大重點-1 : `break`,當任何迴圈遇到`break`的時候就會馬上跳出迴圈
> 迴圈的大重點-2 : `continue`,當迴圈遇到`continue`時,會直接無視本次循環剩餘的部分,直接進到下一個循環
> 迴圈的大重點-3 : 迴圈是讓內部的區塊重複執行,因此必須讓電腦知道哪些部分是在迴圈內部,所以要縮排(按`tab`)
>
### 1.for
> `for`迴圈基本上是讓變數沿著某物件的索引值跑,直到跑完或是遇到`break`
> `in`後面如果是`list`的話就會從第一項跑到最後一項,`str`則是從第一個字元跑到最後一個,`range`的話就會是沿著生成的數列去跑,初學的話最常用的是`for i in range(n):`
> ```python=1
> for i in range(5): #讓i沿著range(5)跑
> print(i, end=',')
>
> print('\b') #最後會多一個, 用\b把它刪掉
> ```
> ### 選項
> ```
> (A) 1,2,3,4,5
> (B) 0,1,2,3,4
> ```
> 答案:||B||
### 補充:多重迴圈
> 多重迴圈簡單講就是好幾個迴圈包在一起,經常跟多維陣列一起用,直接看例子比較快
> 運行的順序會是`i=0`,然後`j`從`0`跑到`n`,接著`i=1`,循環至`i=n`
> ```python=1
> for i in range(2):
> for j in range(2): #注意這裡不要打for i in range,一定要i以外的東西,不然迴圈會出問題
> print(f"{i}, {j}", end='|')
> print()
> ```
> ### output
> ```
> 0, 0|0, 1|0, 2|
> 1, 0|1, 1|1, 2|
> 2, 0|2, 1|2, 2|
> ```
### 2.while
> `while`迴圈是只要後面跟的值是`True`且中途沒有遇到`break`就會持續運行的迴圈
> ```python=1
> times = 0
> run = True
> while run:
> times += 1
> if times == 10:
> run = False #run變成false後,下一個循環就不會開始,因為while後面的值不再是true
>
> print(times)
> ```
> ### 選項
> ```
> (A) 9
> (B) 10
> (C) 11
> ```
> 答案:||B||
## 基本語法 - list(更詳細的)
> `list`最簡單的概念在前面type的章節已經提過,這裡主要講應用方面
### 1.一維陣列
> 最簡單的`list`就是常見的`a = [0, 1, 2]`這種的,通常稱為一維陣列,常常會用火車、櫃子之類的東西去形容,總之就是一連串的資料,且使用索引值代表資料的位置
>
> | 0 | 1 | 2 | 3 | ... |
> | - | - | - | - | --- |
>
> 通常會搭配for迴圈去讀取資料
> ```python=1
> l = [0, 1, 2, 3]
> for i in l:
> print(i, end=' ')
> ```
> ### 選項
> ```
> (A) 0 1 2 3
> (B) 1 2 3 4
> ```
> 答案:||A||
### 2.延伸:二維陣列
> 簡單講就是`list`的各項元素仍然是`list`,可以把他畫成一個`n * m`的平面
> 舉個常見的例子,平常看到的圖片就是一個二維陣列,也就是平面||雖然說定義上來說圖片其實算是三維陣列,不過他的概念是二維的||,像是數學的矩陣一樣,經常用`i, j`代表其位置,也可以理解成一種座標,大致上會像下面那樣
>
> | | | |
> | - | - | - |
> | 0,0 | 0,1 | 0,2 |
> | 1,0 | 1,1 | 1,2 |
> | 2,0 | 2,1 | 2,2 |
> ```python=1
> l = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
> #l =
> #[0, 1, 2]
> #[3, 4, 5]
> #[6, 7, 8]
> for i in l:
> for j in i:
> print(j, end=' ')
> print()
> ```
> ### output
> ```
> 0 1 2
> 3 4 5
> 6 7 8
> ```
## 基本語法 - str(更詳細的)
> 前面大致提過了`str`的事情,這裡會更詳細的講
> 在C/C++中,有兩種字串,一種就是普通的`string`,另外一種則是`char`的陣列,就結論來說是一樣的東西,至於python的`str`則是有著部份`list`性質的格式
> 類似於`list`的部分主要是索引值(index),一個`str`可以畫成下面的樣子,使用方法參照前面`list`的部分
> | 0 | 1 | 2 | 3 | 4 |
> | - | - | - | - | - |
> | A | P | P | L | E |
>
> 除此之外,`str`也有一些專屬的性質,舉個簡單的例子`str.split()`可以將`str`從指定的字元切開,變成一個`list`
> ```python=1
> s = "hello, world"
> l = s.split(',')
> print(l)
> ```
> ### output
> ```
> ['hello', ' world']
> ```
> 應用上還有一個很重要的性質,`str`是可以直接疊加的,也就是`"a" + "b" = "ab"`等式成立,實際使用時經常會搭配`int`一起用,形成`"1" + "2" = "12"`的情況,再將`"12"`轉成`int`,就可以將數字直接用相加,不用`1 * 10 + 2`
> 一定要注意的地方 : 如果說想要把`str`轉成`int`,一定要確保他每一個字元都是數字,不然會跳`TypeError`
> ```python=1
> s1 = "10"
> s2 = "20"
> s3 = s1 + s2
> print(int(s3) - 1)
> ```
> ### output
> ```
> 1019
> ```
## 基本語法 - import
> `import`是python在做專案時最重要的東西,簡單來說,`import`就是裝外掛,從外部引進函式庫,然後在程式中運行,類似C/C++的`include`
> `import`主要分成兩類,一個是引入模組(module),另外一個是引入其他檔案(實際上這兩個是一樣的東西,只是分開來比較好講)
### 1.引入模組
> python在下載的時候就會有一些內建的模組,例如`random`, `time`, `math`...
> 如果要用其他的第三方模組(非官方)就需要另外下載,通常是用一個名為`pip`的套件(其實還有很多雜七雜八的下載方式,但這裡就不提了)
> ``` python=1
> import random as rand #引入random後,將後面要使用時的名稱設定成rand
>
> r = rand.randint(1,10) #r會是1~10的隨機數字
> print(r)
> ```
> ### output
> ```
> 5
> ```
### 2.引入檔案
> 引入檔案其實跟引入模組是一樣的概念,差別在於模組存在系統的資料夾裡面,檔案就是根據使用者的設定
> 引入檔案實際上是從檔案中引入函數,使用者可以在其他檔案自訂一些函數,然後引入到程式中使用,至於怎麼自訂函數後面會說
> ```python=1
> from function import * #星號代表引入所有該檔案中的函數,注意檔案名稱後面不用打.py
>
> number = 1
> number = function.plus(number,10) #這裡的plus函數就是在function.py裡面設定的
> print(number)
> ```
> ### output
> ```
> 11
> ```
## 基本素養 - 錯誤訊息(Error message)
> 在開發的時候,難免會有一些地方打錯之類的,這個時候系統就會跳出錯誤訊息,但是python的錯誤訊息寫得不明不白,因此就需要了解各種`Error`是怎麼發生的,在debug的時候才不會一頭霧水
### 1.錯誤類型
> 以下舉一些常見的錯誤類型(那個中文名稱是我亂翻的,一般都是講英文的)
> `SyntaxError`是語法錯誤,通常是函數的使用方法搞錯
> `IndexError`是索引值錯誤,如果要求的索引值超出`list`的範圍的話就會跳出來
> `ValueError`是值錯誤,最常發生在把文字轉成數字的時候
> `ModuleNotFoundError`是模組錯誤,在`import`不存在的模組時出現
> `ZeroDivisionError`是除零錯誤,在某數被除以`0`時出現
> `TypeError`是類型錯誤,最簡單的就是強制把`int`和`str`接在一起時出現
> `NameError`是名稱錯誤,大多數情況是呼叫了不存在的變數
> `ImportError`是引入錯誤,在`import`時呼叫了不存在的函數時出現
### 2.錯誤訊息
> 了解了各式錯誤類型後,就要學會怎麼看錯誤訊息,最基本的就是直接看錯誤訊息的最後幾行,他會跟你說什麼錯誤、錯在哪一行,知道錯在哪後,就去程式碼裡面找到那一行,然後修改,這就是最基本的debug
## 進擊的語法 - module應用
> 好用的module除了要會`import`以外,還要知道如何使用
> 以下列舉一些常用的內建module
### 1.random
> `random`是python內建的module,用於取隨機值,以下列舉一些常用的`random`的函數
> `random.randint(a, b)`可以取一個`n`, `a <= n <= b`
> `random.randrange(a, b, c)`可以從`range(a, b, c)`中隨機取一個值
> `random.choice(seq)`通常`seq`會接`list`,讓它從中隨機取一個`element`
### 2.time
> `time`是python內建的module,用於做時間相關的工作
> `time.gmtime()`取得從Unix Time(經度0^o^的`1970/1/1 00:00`)開始到當下經過的時間(秒數)
> `time.localtime()`類似`gmtime`,但是變成取當地時間
> `time.sleep(sec)`讓程式暫停`sec`的秒數
### 3.math
> `math`是python內建的module,用於數學相關工作
> `math.ceil(x)`將`x`向上取整||~~反向高斯符號~~||
> `math.comb(n, m)`計算數學的`C n取m`
> `math.fabs(x)`回傳`x`的絕對值
> `math.factorial(x)`回傳`x!`
> `math.log(x)`回傳log~e~x
> `math.log2(x)`回傳log~2~x
> `math.log10(x)`回傳log~10~x
## 進擊的語法 - def(自訂函數)
> 有時候寫程式的時候會遇到不斷重複的部分,這個時候就可以用`def`去將其設定為一個函數,這樣一來,使用的時候就會方便很多,下面的例子兩邊的輸出結果一模一樣,但是使用`def`的話看起來就會簡潔很多,如果要使用更多次的話也會比較方便
> ### 不使用def
> ```python=1
> x = [1, 2, 3]
> save = x[0]
> del x[0]
> x.append(save)
>
> y = [4, 5, 6]
> save = y[0]
> del y[0]
> y.append(save)
>
> print(x)
> print(y)
> ```
> ### 使用def
> ```python=1
> def operate(L):
> save = L[0]
> del L[0]
> L.append(save)
> return L
>
> x = [1, 2, 3]
> y = [4, 5, 6]
> x = operate(x)
> y = operate(y)
> print(x)
> print(y)
> ```
## 進擊的語法 - try/except(除錯用)
> 當程式在運行的時候,如果碰到`Error`就會直接結束,這個時候就要用到`try`和`except`了,他可以在出現`Error`時執行特定指令,並且繼續執行後面的程式
> ```python=1
> try:
> a = "abcd"
> b = int(a)
> print(b)
>
> except ValueError as err: #當try的範圍內出現錯誤且類型是ValueError時,執行except裡面的內容,如果不是的話,就會跟平常一樣跳出Error訊息
> print(err) #印出錯誤訊息
>
> print("keep running")
> ```
> ### output
> ```
> invalid literal for int() with base 10: 'abcd'
> keep running
> ```
## 進擊的語法 - class(物件類型)
> ### 補充 : 物件導向程式設計(object-oriented programming, OOP)
> >傳統的程式設計主要為直接向電腦發出指令去運作,物件導向程式設計則以物件為基本,每個物件都可以接收、處理、傳遞資料給其他物件,概念類似多個機器之間互向連接,形成一個工廠
> >常見的物件導向程式設計有python, C++, objective-C, C#, java script, java, PHP等
>
> `class`可以創建一種類別的物件,藉由創建出來的類別再去創建物件,一個物件可以有各種參數與功能
> ```python=1
> class sample: #創建名為sample的物件類型
> def __init__(self, num1, num2): #設定這個物件所要的參數 這裡分別是num1和num2 self就是物件本身
> self.num1 = num1
> self.num2 = num2
>
> def plus(self): #創建物件的功能
> return self.num1 + self.num2
>
> def minus(self):
> return self.num1 - self.num2
>
> samp = sample(10,20) #創建名為samp的物件 類型是sample 參數分別是10 20
> result1 = samp.plus() #使用物件的功能
> result2 = samp.minus()
> print(result1, result2)
> ```