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>