Python
===
此篇彙整"常使用"的基礎語法及重點,適於初學者輔助學習。
安裝可去<font color="#8b008b">Anaconda</font>官網載,有較完整工具使用
https://www.anaconda.com/products/individual
並打開<font color="#c71585">spyder</font>即可開始寫程式
[Chapter 01 - 變數與型別](#變數與型別)
[Chapter 02 - 運算子們](#運算子們)
[Chapter 03 - 輸入與輸出](#輸入與輸出)
[Chapter 04 - 判斷語句](#判斷語句)
[Chapter 05 - 流程控制](#流程控制)
[Chapter 06 - 數學函式庫](#數學函式庫)
[Chapter 07 - 字串用法](#字串用法)
[Chapter 08 - 亂數](#亂數)
[Chapter 09 - 複合資料](#複合資料)
[Chapter 10 - 函式定義](#函式定義)
[Chapter 11 - 檔案處理](#檔案處理)
## *變數與型別*
<b>變數</b>可想作是<u>裝資料的容器</u>,將資料儲存起來
變數定義規則首字不能為數字,特殊符號僅接受底線_,大小寫視為不同,可以為中文字,最好是有意義的單字組合
| 型別 | 名稱 |
| -------- | -------- |
| int | 整數 |
| float | 浮點數 |
| str | 字串 |
| bool | 布林值 |
```python
a = 5 # 宣告a變數為整數型別
b = 'hello' # 為字串型別,用單引或雙引括的就是字串
c = "45" # 仍是字串
d = False # 布林值
e = 3.14 # 浮點數
a = '"world"' # 這時a變成字串型態,實際上a為"world",當需要在字串裡添加引號可以錯開使用
```
**強制轉型**
我們使用<font color='red'>型別()</font>來轉換資料型別
```python
# 字串轉浮點數
a = "792.5" # 原字串
a = float(a) # 數值
# 浮點數轉整數
b = 2.236 # 小數
b = int(b) # b為整數2
```
<span><br><br></span>
## *運算子們*
| 算數運算子 | 意義 | 關係運算子 | 意義 | 邏輯運算子 | 意義 |
| ---------- | ---- | ---------- | ---- | ---------- | ---- |
| + | 加法 | > | 大於 | and | 且 |
| - | 減法 | >= | 不小於 | or | 或 |
| * | 乘法 | == | 相等 | not | 反轉 |
| / | 除法 | != | 不相等 | | |
| // | 整數除法 | < | 小於 | | |
| % | 取餘數 | <= | 不大於 | | |
| ** | 指數 | | | | |
<font color='red'>※ 注意別把 = 和 == 搞混了</font>
前者是指派符號(assign),將右式的結果塞給左邊變數
後者才是"相等"的概念,比較兩個東西是否相等
後續當然還有其他運算子,不過對於初學者上述已足夠使用
```python
a = 25 * 3 # 75
a = 5 ** 2 # 5的2次方 25
b = 35 / 3 # 11.666666666666666
b = 35 // 3 # 11
b = 18 % 4 # 餘數為2
c, d = 30, 12 # Python 可使用這種寫法分別給值c = 30, d = 12
e = (c % 3 == 0 and c % 5 == 0) # True e同時可被3和5整除
e = (d < 0 or d > 10) # True or其中一項成立即成立
e = not d != 12 # True 原本假False, 反轉變為True
```
<font color='orange'>▲ 小叮嚀:運算子也有順序性,若不知道順序,只要將你想優先執行的敘述用()刮起來就行了</font>
<span><br><br></span>
## *輸入與輸出*
在Python中輸入與輸出的函式分別是<font color='#20b2aa'>input()</font>和<font color='#20b2aa'>print()</font>
*<h4>input() -> 用鍵盤讀入一行訊息</h4>*
回傳的是字串型態str
```python
s = input() # 鍵盤輸入
print(type(s)) # str type()可查看型別
s = input('這是提示字串: ')
# 這是提示字串: □ □為你輸入內容,意即可指定在輸入前,要顯示什麼訊息
# 若輸入的內容用空白隔開,想分別存入兩個變數,假設以下是你輸入的內容
# 6 3.14
r, pi = input().split()
# r會拿到"6" pi會拿到"3.14"這裡都是str型態,接下來做強制轉型
r, pi = int(r), float(pi) # 如果是要轉成數值,可統一使用eval()
# r, pi = eval(r), eval(pi)
print((r ** 2) * pi) # 計算圓面積113.04
# 介紹一下eval()的功用是可以把字串型態的運算式的結果計算出來
print(eval("1000 - 7")) # 993
print(eval("39.52")) # 39.52
```
*<h4>print() -> 輸出訊息</h4>*
```python
# 3種常用寫法
# 1. 用sep end 修改輸出模樣
a = 9
# 多個輸出,隔開,相當於在每個之間插一個空白
print(34.5, a, "HELLO", "WORLD") # 34.5 9 HELLO WORLD
print(34.5, a, "HELLO", "WORLD", sep='=') # 34.5=9=HELLO=WORLD
print(34.5, a, "HELLO", "WORLD", end='~fin') # 34.5 9 HELLO WORLD~fin
# sep不寫預設是多個之間以空白隔開(sep=' ')
# end不寫預設會換行(end='\n') \n為換行字符
# 2. %
b = 37.9254
c = "test"
print('%s = %.2f' % (c, b)) # test = 37.92
# 將後面變數分別填充進有%格式符號的地方,以下有整理
# %.2f為保留小數點後2位 %f預設留6位
# 3. format
print('{} = {:.2f}'.format(c, b)) # test = 37.92
# 將後面變數分別填充進有{}的區域
# 改變小數點位數,相當於先打個:再把%後面格式接起來,其餘狀況只需留{}佔位就好
# 2和3很像,任君挑選
```
| 格式 | 對應型別 |
| ---- | -------- |
| %d | int |
| %f | float |
| %s | str |
<span><br><br></span>
## *判斷語句*
在Python中,是以縮排Tab來區別層次的
```python
# 單一語句
if 條件句(通常為布林敘述):
Statement
# 二擇一
if 條件句:
Statement
else: # 其餘不符合狀況
Statement
# 多擇一
if 條件句:
Statement
elif 條件句:
Statement
.
.
.
elif 條件句:
Statement
else: # 上述皆不符合的狀況
Statement
# 巢狀架構(判斷裡還有判斷都算是)
if condition:
if condition:
Statement
else:
Statement
else:
if condition:
Statement
else:
Statement
```
```python
score = eval(input('請輸入成績: '))
if score >= 0 and score <= 100:
if score >= 90:
print('A')
elif score >= 75:
print('B')
elif score >= 60:
print('C')
else:
print('Failed')
else:
print('分數範圍有誤')
```
<span><br><br></span>
## *流程控制*
```python
range(start, end[, step])
```
```python
range(1, 9) # 1, 2, 3, 4, 5, 6, 7, 8 不包含end
range(9, -3, -2) # 9, 7, 5, 3, 1, -1
```
### For Loop
```python
for var in range(..):
Statement
for i in range(3, 7):
print(i)
# 3
# 4
# 5
# 6
# for 還有其他的用法可見複合資料區
```
### While Loop
```python
while condition:
statement
# 無窮迴圈
while True:
...
if condition: # 截止條件
...
break
...
```
```python
# for while 轉換
for i in range(1, 11, 3):
print(i)
i = 1
while i < 11:
print(i)
i += 3
```
### Break & Continue
```python
# break 跳出當層迴圈
for i in range(0, 5):
print(i)
if i == 2:
break
# 0
# 1
for i in range(0, 3):
for j in range(0, 3):
if j == 1:
break # i的迴圈仍繼續,只跳出j的迴圈
print('({}, {})'.format(i, j))
# (0, 0)
# (1, 0)
# (2, 0)
```
```python
# continue 略過continue後面當前迴圈執行,進行下一次迴圈
for i in range(0, 5):
if i == 2:
continue
print(i)
# 0
# 1
# 3
# 4
```
<span><br><br></span>
## *數學函式庫*
使用時記得要import math
| 函式 | 意義 |
| -------- | -------- |
| math.pow(a, b) | a的b次方 |
| math.sqrt(a) | 根號a |
| math.ceil(a) | 比a大的最小整數 |
| math.floor(a) | 比a小的最大整數 |
三角函數的都有math.sin() math.cos() ... 要注意參數單位為弧度
https://www.tutorialspoint.com/python3/python_numbers.htm
```python
import math
b = 49
print(math.sqrt(b)) # 7.0
print(math.pi) # 3.141592653589793
print(math.sin(math.pi/2)) # sin90度 = 1.0
print(math.factorial(5)) # 階層120
print(math.gcd(56, 42)) # 最大公因數14
```
<span><br><br></span>
## *字串用法*
```python
print('123' + '456') # 123456
print('=' * 10) # ==========
```
| 字串 | a | p | p | l | e |
| -------- | -------- | -------- | --- | --- | --- |
| 正索引 | 0 | 1 | 2 | 3 | 4 |
| 負索引 | -5 | -4 | -3 | -2 | -1 |
```python
s = 'pineapple'
print(s[3]) # e
print(s[-2]) # l
print(len(s)) # 9
# slicing
print(s[5:7]) # pp
print(s[:4]) # pine 索引4以前
print(s[-5:]) # apple 索引-5以後
print(s[1::2]) # iepl 索引1到最後,每隔2個單位
# in & not in
print('d' in s) # False 檢查d字元在不在pineapple裡
print('f' not in s) # True
# for loop
for c in s:
print(c, end='-')
# p-i-n-e-a-p-p-l-e-
# 錯誤用法
s[2] = 'b' # 會出錯 字串不能修改
```
```python
# function
s = 'This is a book.'
print(s.count('o')) # 2
print(s.find('is')) # 2 回傳第一個找到的索引
print(s.replace('This', 'That')) # 產生新字串That is a book.
print(s.upper()) # THIS IS A BOOK.
s2 = 'apple,banana,cat,dog'
print(s2.split(',')) # ['apple', 'banana', 'cat', 'dog']串列
s3 = 'Hello*&'
print(s3.strip('*&')) # Hello修掉頭尾
# function若有添加is,回傳布林
print(s.iscapitalize()) # True 開頭是否大寫
print(s.title()) # False 檢查每個單詞開頭是否都大寫
print(s2.islower()) # True 是否皆為小寫
s4 = 't32'
print(s4.isdigit()) # False 是否皆為數字
print(s4.isalnum()) # True 是否只含數字或字母
print(s4.isalpha()) # False 是否皆為字母
```
<span><br><br></span>
## *亂數*
使用時記得要import random
| 函式 | 意義 |
| -------- | -------- |
| random.random() | 隨機一個0~1(不含1)的小數 |
| random.randint(1, 100) | 隨機一個1~100的整數 |
| random.uniform(a, b) | 隨機一個a~b的浮點數 |
| random.randrange(...) | 跟range用法差不多,隨機一個 |
<span><br><br></span>
## *複合資料*
### List串列
以<b><font color='purple'>[]</font></b>為特徵的資料集,元素可以穿插不同型別的data
**<font color='red'>索引、取子成員方式皆與字串相同</font>**
```python
li = [25, 34, 'pp', 3.14, [9, 2]]
print(li[1]) # 34
print(li[-1]) # [9, 2]
print(li[4][2]) # 2
print(li[1:4]) # [34, 'pp', 3.14]
print(len(li)) # 5
print('pp' in li) # True
li[2] = 'aa'
print(li) # [25, 34, 'aa', 3.14, [9, 2]]
print(['Hi'] * 4) # ['Hi', 'Hi', 'Hi', 'Hi']
print([6, 5, 4] + [3, 2, 1]) # [6, 5, 4, 3, 2, 1]
```
```python
# function
li2 = [] # 產生空串列或list()
li2.append(89) # 添加元素
li2.append(32)
li2.append(14)
li2.append(77)
li2.append(32)
li2.append(28)
print(li2) # [89, 32, 14, 77, 32, 28]
print(max(li2)) # 89 找到串列中最大元素
print(min(li2)) # 14
print(sum(li2)) # 272 加總
print(li2.count(32)) # 2
print(li2.index(77)) # 3 該元素的索引位置
li2.reverse() # 翻轉
print(li2) # [28, 32, 77, 14, 32, 89]
li2.insert(1, 55) # 55插入索引1
print(li2) # [28, 55, 32, 77, 14, 32, 89]
li2.remove(28) # 刪除元素
li2.pop(-2) # 刪除該索引的元素
print(li2) # [55, 32, 77, 14, 89]
li2.sort() # 預設由小到大 若要由大到小把參數reverse=True
print(li2) # [14, 32, 55, 77, 89]
li2.clear() # 清空串列
```
```python
# for
for ele in li2:
print(ele, end=' ')
# 14 32 55 77 89
# enumerate() 可取得正索引和元素
for idx, ele in enumerate(li2):
print('li2[%d] = %d' % (idx, ele))
# li2[0] = 14
# li2[1] = 32
# li2[2] = 55
# li2[3] = 77
# li2[4] = 89
```
### Tuple元組
以<b><font color='purple'>()</font></b>為特徵的資料集,元素可以穿插不同型別的data>為特徵的資料集,元素可以穿插不同型別的data
簡單來說與List的功用一樣,但是僅能讀不能改,也幾乎沒有函數可用
List與Tuple互相轉換,用list()、tuple()把資料括起來即可
### Dict字典
以<u>key</u>鍵與<u>value</u>值所組成的字典,以<b><font color='purple'>{}</font></b>表示之
<b>dic = {key1: value1, key2: value2, ...}</b>
```python
dic = dict() # 空字典或{}
dic['ball'] = '球' # 新增內容
dic['rabbit'] = '兔子'
dic['cup'] = '杯子'
print(dic) # {'ball': '球', 'rabbit': '兔子', 'cup': '杯子'}
print(dic['cup']) # 杯子
```
| function | meaning |
| -------- | -------- |
| keys() | 所有鍵 |
| values() | 所有值 |
| items() | 所有鍵與值 |
```python
for key, value in dic.items():
print('鍵: {}, 值: {}'.format(key, value))
# 鍵: ball, 值: 球
# 鍵: rabbit, 值: 兔子
# 鍵: cup, 值: 杯子
```
https://www.runoob.com/python/python-dictionary.html
<span><br><br></span>
## *函式定義*
```python
def function_name(parameters):
# do somethings
```
```python
def fun(): # 無參數
print('Hello World!')
fun() # 函式呼叫, 打印Hello World!
def fun2(a, b): # 有參數
return a + b # 有回傳值,可以在呼叫後把結果給變數
c = fun2(3, 5)
print(c) # 8
# 多回傳值
def fun3(a, b):
if b == 0:
print("除數不能為0")
return 0, 0
return a // b, a % b
Q, R = fun3(41, 5)
print("商: %d, 餘數: %d" % (Q, R))
# 商: 8, 餘數: 1
# 預設參數
def fun4(li, n=0):
# 假設這是個決定要由後刪除n個串列元素的函數
if n <= len(li):
for i in range(n):
del li[-1]
nums = [1, 2, 3, 4, 5]
fun4(nums) # 可
print(nums) # [1, 2, 3, 4, 5]
fun4(nums, 3)
print(nums) # [1, 2]
# 九九乘法
def mul9x9(a=9, b=9):
for i in range(1, a+1):
for j in range(1, b+1):
print('%dx%d=%d' %(i, j, i*j), end=' ')
print()
mul9x9()
# 1x1=1 1x2=2 1x3=3 1x4=4 1x5=5 1x6=6 1x7=7 1x8=8 1x9=9
# 2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 2x6=12 2x7=14 2x8=16 2x9=18
# 3x1=3 3x2=6 3x3=9 3x4=12 3x5=15 3x6=18 3x7=21 3x8=24 3x9=27
# 4x1=4 4x2=8 4x3=12 4x4=16 4x5=20 4x6=24 4x7=28 4x8=32 4x9=36
# 5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 5x6=30 5x7=35 5x8=40 5x9=45
# 6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 6x7=42 6x8=48 6x9=54
# 7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 7x8=56 7x9=63
# 8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 8x9=72
# 9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
mul9x9(1)
# 1x1=1 1x2=2 1x3=3 1x4=4 1x5=5 1x6=6 1x7=7 1x8=8 1x9=9
mul9x9(b=3, a=4)
# 1x1=1 1x2=2 1x3=3
# 2x1=2 2x2=4 2x3=6
# 3x1=3 3x2=6 3x3=9
# 4x1=4 4x2=8 4x3=12
```
```python
# recursive遞迴(函式呼叫自己)
# 費式數列
def fib(n):
if n <= 1: # 截止條件,防遞迴函數無窮執行
return n
return fib(n-1) + fib(n-2) # 持續展開下去,最後會回到原點得到結果
print(fib(5)) # 5
```
```
fib(5)
/ \
fib(4) fib(3)
/ \ / \
fib(3) fib(2) fib(2) fib(1)
/ \ / \ / \
fib(2) fib(1) fib(1) fib(0) fib(1) fib(0)
/ \
fib(1) fib(0)
```
<span><br><br></span>
## *檔案處理*
```python
f = open(檔名, mode='r') # 預設讀取
```
| mode | 意義 |
| -------- | -------- |
| 'r' | 讀取 |
| 'w' | 寫入 |
| 'a' | 附加 |
### 讀取
假如與python檔同個目錄下有test.txt的檔,內容如下
```
My name is Hank.
Nice to meet you.
```
```python
f = open('test.txt', 'r')
print(f.read(7)) # My name讀取前7字元
print(f.read(4)) # is 下4個字元
f.close() # 記得養成習慣關檔
```
```python
f = open('test.txt', 'r')
print(f.readline()) # My name is Hank. 第一行
print(f.readline()) # Nice to meet you. 第二行
f.close()
```
```python
f = open('test.txt', 'r')
print(f.readlines()) # ['My name is Hank.\n', 'Nice to meet you.']
# 回傳每一行的串列
f.close()
```
### 寫入
```python
f = open('abc.txt', 'w') # 若同目錄沒該檔案會開個abc.txt,反之會將其資料覆蓋
f.write('Write down the first sentence.\n')
str_seq = ["ABC\n", "END"]
f.writelines(str_seq)
f.close()
```
執行後查看同目錄下的abc.txt
```
Write down the first sentence.
ABC
END
```
### 附加
與寫入只差在後者每次開檔會把資料清空,前者會從檔案結尾繼續接
```python
f = open('abc.txt', 'a')
f.write("\nI'm new in here.")
f.close()
```
abc.txt
```
Write down the first sentence.
ABC
END
I'm new in here.
```
<center><h1 style="color: #8b4513;">Fin ~</h1></center>