## 先來回答上週遇到的問提 - 在官網安裝python & 在vscode安裝python ## 什麼是 python? - Python 是一種直譯式、物件導向、功能強大的高階程式語言,其設計強調程式碼的可讀性以及簡潔的語法,使用空格縮排來劃分程式碼區塊,不像其他常見的程式語言大多使用大括號或關鍵詞。 - Compiler(編譯器)和Interpreter(直譯器) - 如果要讓程式輸出:`hello` ```python= # 這是python print("Hello!") ``` ```cpp= // 這是c #include <stdio.h> int main(){ printf("Hello World!\n"); return 0; } ``` ```java= // 這是java public class Hello { public static void main(String[] args) { System.out.println("Hello!"); } } ``` ## Python有什麼功能? * 數據分析與處理 * Web開發應用 * 人工智慧應用 ## python 常見 data type - 資料型態 - int - float - string:任意的文字內容。 - boolen:表達正確(True)或錯誤(False)。 - 查看型態:type() - 容器 - list:有順序且可以變動的資料集合。 - tuples:有順序且不可變的資料集合。 - sets:無順序的資料集合。 - dict:key-value pair的集合。 ```python= print(type(10)) # <class 'int'> #整數 print(type(3 + 5j)) # <class 'complex'> #複數 print(type('hello python')) # <class 'str'> #字串 print(type(True)) # <class 'bool'> #布林值 ``` ## 下註解 - 註解雖然會出現在程式碼裡面,但是並不會被執行,是個很適合為程式新增說明的手段 - 如果不好好寫註解的話,肯定會被一個月後的自己討厭 - 助教不會討厭不寫註解的人,但你的分數會討厭你 ```python= # 這是單行註解 # 多行註解的方式:全選後一次註解 ``` ## 變數與賦值(variable & assignment) - 變數就是為了方便在程式中調用記憶體中的值而取的名字 ```python= # eg x = 5 x = x+1 print(x) # 可以將 x = x+1 寫成 x+=1 → syntax sugar(語法糖) ``` - ![upgit_20240813_1723540788.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/08/upgit_20240813_1723540788.png) - 可以用type()函數來查看變數的資料型態 ## 變數的命名規則 https://zh.wikipedia.org/zh-tw/%E5%91%BD%E5%90%8D%E8%A7%84%E5%88%99_(%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)#Python_and_Ruby ## 格式化基本輸出 - python的輸出非常簡單, print()裡面可以放任何東西(字串、變數、int…) ```python= # 基本語法 print(13, sep="", end="") print('Hello World!') # Hello World! print('Hi, my name is', 'Simon') # Hi , my name is Simon print(123) # 123 # value: 要輸出的值,可以是多個,用逗號分隔。 # sep: 用於分隔多個值的字符串,預設是空格 " "。 # end: 在輸出結束後添加的字符串,預設是換行符 "\n"。 ``` ![image](https://hackmd.io/_uploads/BkI9oKpaA.png =70%x) ```python= # 範例 print("要走進學校", "需要很大的勇氣", sep="。", end="。") # 要走進學校。需要很大的勇氣。 ``` ```python= # 格式化輸出 score = 90 name = "助教" count = 1 print("%s你的第 %d 次物理考試成績是 %d" % (name, count, score)) print(f"{name}你的第 {count} 次物理考試成績是 {score}") # 助教你的第 1 次物理考試成績是 90 ``` ## 格式化基本輸入 ```python= # 預設輸入為string name = input("請輸入姓名") print(name) # 如果是要輸入int num = int(input("請輸入數值")) ``` ## 基本數學運算 ```python= print(10+5) print(10-5) print(10*5) print(10/5) # 2.0(python它會自動判斷格式) print(10%5) # 0 # 餘數、整除 print(9%5) # 4 print(9//5) # 1 # 次方 print(3**2)z X # 科學記號 print(1.23E+6) # 1230000.0 print(1.23E-4) # 0.000123 ``` ### 甚麼時候會用到mod? - 迴圈中的循環計數 ```python= elements = ['A', 'B', 'C'] index = 5 print(elements[index % len(elements)]) # 輸出: 'C' ``` - 星期計算:假設要計算某天的後 100 天是星期幾 ```python= current_day = 3 # 例如今天是星期三 (3) days_later = 100 future_day = (current_day + days_later) % 7 print(f"100 天後是星期 {future_day}") ``` ## 進制互換 ```python= # 二進位 x=0b1101 print(x) # 13 # 十進位轉二進位 print(bin(13)) # 0b1101 # 八進位、十進位、 print(oct(47)) # 0o57 # 十六進位 print(hex(47)) # 0x2f ``` ## 數據型態互換 - 整數 (int) 與 浮點數 (float) 互換 - 整數當然可以換小數點 - 小數換整數的話,python是無條件捨去 ```python= print(int(12.34)) # 輸出: 12 # 四 print(float(12)) # 輸出: 12.0 ``` - 整數 (int) 與 布林值 (bool) 互換 - int(True):布林值 True 轉換為 1。 - int(False):布林值 False 轉換為 0。 - 布林值 (bool) 與 字串 (str) 互換 - str(True):將布林值 True 轉換為字串 "True"。 - str(False):將布林值 False 轉換為字串 "False"。 - bool():任何非空字串轉換為 True,空字串 "" 轉換為 False。 ```python= print(str(True)) # 輸出: 'True' print(str(False)) # 輸出: 'False' print(bool("Hello")) # 輸出: True print(bool("")) # 輸出: False ``` ## ASCII 碼 - ASCII 碼 是一種用來表示文字和符號的編碼標準,每個字符(如字母、數字、符號等)都對應著一個唯一的 數字代碼。 - ASCII 碼表 包含 128 個字符,對應的數值範圍是 0 到 127,其中: - 控制字符(例如換行、回車、退格等),對應 ASCII 值 0 到 31 以及 127。 - 可打印字符,包括字母、數字和符號,對應 ASCII 值 32 到 126。 - 那這個ASCII可以幹嘛?像是文本保存、鍵盤輸入及網路通訊協定都是靠他們歐 ![image](https://hackmd.io/_uploads/r1Yubq66R.png) ```python= print(chr(97)) # a print(ord("a")) # 97 print(ord("A")) # 65 ``` ```python= # 字符驗證 char = input("請輸入一個字符: ") if ord(char) >= 65 and ord(char) <= 90: print(f"{char} 是大寫字母") elif ord(char) >= 48 and ord(char) <= 57: print(f"{char} 是數字") else: print(f"{char} 是其他字符") ``` ## 字串 - 它就是ABC搂 - 可以使用單引號或雙引號來定義 - 不可變的:一旦創建,便不可修改,也就是說,當你嘗試修改實,它其實是創建一個新的字串對象 ```python= text = "Hello" # text[0] = "J" # 這會導致錯誤,因為字串是不可變的 new_text = "J" + text[1:] # 正確方式:創建新字串 print(new_text) # 輸出: Jello ``` - 字串是有序的:才會有索引跟切片 - 字串連接 ```python= print(111+333) print("111"+"333") ``` - 處理多於一行的字串 ```python= str1 = """ 變數、運算式、判斷式.ipynb 今天天起真好 """ ``` - 重複字串 ```python= # 使用 * 來重複字串。 repeat_str = "ha" * 5 print(repeat_str) # 輸出: hahahahaha ``` - 字串長度 ```python= # 使用 len() 函數來計算字串的長度。 sentence = "Hello, world!" print(len(sentence)) # 輸出: 13 ``` - 查找與替換 ```python= message = "Hello, Python!" index = message.find("Python") print(index) # 輸出: 7 new_message = message.replace("Python", "World") print(new_message) # 輸出: Hello, World! ``` - 字串的索引及切片 - 在 python 中,字串是有順序的,並且從 0 開始計算。 - 字串可以使用單引號也可以使用雙引號。 ```python= # indexing my_str = "helllo" print(my_str[0]) print(my_str[1]) print(my_str[-1]) print(my_str[-2]) # print(my_str[-10]) # index error # slicing x = "abcdefg" print(x[2:]) # cdefg print(x[:4]) # abcd print(x[2:6]) # cdef print(x[1:5:2]) # bd ``` - 附上有關於python string 的更完整函數,同學再去花時間try try see搂 https://www.youtube.com/watch?v=dNFI2c007Sw ![image](https://hackmd.io/_uploads/r1nMu5apA.png) ## 常用到的內建函數(built-in) - 恩...好多歐,那就請同學自己學習吧(笑 - 一個函數(function)一次只能返回一個值 - abs() - str() - pow() - max(), min() - int(), float(), round() - e, pi , sqrt() - floor(), ceil() - round() ![image](https://hackmd.io/_uploads/S1xy9c6T0.png) ## 處理字串的數學運算evel() - 可以把字串轉成程式碼去執行 ```python= print(eval("3+4")) print("abs(4)", abs(4)) print("max([1, 2, 3])", max([1, 2, 3])) ``` - 有時候我需要輸出程式碼字串跟執行結果,這樣就可以偷懶一下ww: ```python= def f(str): print(str, eval(str)) f("abs(4)") # abs(4) 4 f("max([1, 2, 3])") # max([1, 2, 3]) 3 ``` ## 比較運算符(comparison operator) ![upgit_20240418_1713383314.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/04/upgit_20240418_1713383314.png) ## 邏輯運算(logical operator) ![upgit_20240418_1713383360.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/04/upgit_20240418_1713383360.png) ![upgit_20240420_1713557595.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/04/upgit_20240420_1713557595.png) ## 位運算符(bitwise operator) - 位運算子允許我們對整數的二進位位元進行操作。這些運算子在某些特定情況下非常有用,例如位操作、旗標設定等。 ![upgit_20240418_1713383409.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/04/upgit_20240418_1713383409.png) ```python= # AND 運算 (`&`) a = 0b1010 # 10 (十進位) b = 0b1100 # 12 (十進位) print(a & b) # Output: 8 (二進位: 1000) # OR 運算 (`|`) # 將對應位元進行 OR 運算,只要有一個對應位元為 1,結果位元就為 1。 a = 0b1010 # 10 (十進位) b = 0b1100 # 12 (十進位) print(a | b) # Output: 14 (二進位: 1110) # XOR 運算 (`^`) # 將對應位元進行 XOR 運算,當對應位元不相同時,結果位元為 1。 a = 0b1010 # 10 (十進位) b = 0b1100 # 12 (十進位) print(a ^ b) # Output: 6 (二進位: 0110) # 取反運算 (`~`) # 將所有位元取反,即 0 變 1,1 變 0。需要注意的是,取反運算在 Python 中會產生一個負值。 a = 0b1010 # 10 (十進位) print(~a) # Output: -11 (二進位: 111..10101) # 左移運算 (`<<`) # 將位元向左移動指定的位數,相當於乘以 2 的指定次方。 a = 0b1010 # 10 (十進位) print(a << 2) # Output: 40 (二進位: 101000) # 右移運算 (`>>`) # 將位元向右移動指定的位數,相當於除以 2 的指定次方。 a = 0b1010 # 10 (十進位) print(a >> 1) # Output: 5 (二進位: 101) ``` ## membership operator(in, not in) - 這邊有兩種 - in, not in - is, not is ```python= arr = "ABCD" if "A" in arr: ... a = {"a", "b", "c"} if "a" in a: ... ``` - 參考教學: - https://www.youtube.com/watch?v=W7luvtXeQTA - https://www.youtube.com/watch?v=W7luvtXeQTA&t=2s - https://www.youtube.com/watch?v=mO_dS3rXDIs ## 判斷式--if語句 - if 語句是最基本的條件控制語句之一,用於根據條件執行不同的程式碼塊。 - 寫程式的時候,很常遇到某些情況,如:達成條件要做A,未達成要做B。這時候我們就可以用 if…else 來做到這件事情。 - 縮排:就是多出一些空格數(通常為4格) ```python= # 判斷奇偶數 x = 5 if x > 0: print("x is positive") elif x < 0: print("x is negative") else: print("x is zero") ``` ```python= password = input("請輸入密碼") if password == "123456" print("hello master") : ``` ![image](https://hackmd.io/_uploads/H1_FN5T6C.png) ## Lab03作業題目 - 繳交方式 : - 請到[https://140.116.179.59:8080](https://140.116.179.59:8080)完成作業題目 - 並將程式碼加上==註解(你的理解)==,很重要,否則助教有權利扣你分數 - 禁止抄襲,否則助教會來查水表 - 作業繳交期限:至09/30 12:00前 - 題目為基本題9題+一題加分題,共10題 - Lab03_01-Lab03_08:一題11分(==不符規定九折,未註解七折,遲交六折==) - Lab03_09:一題12分(==不符規定九折,未註解七折,遲交六折==) - 加分題直接列入期末成績計算 - github檔名格式: - 每一個檔案為:`Lab03_OO.py` - 所有檔案放入資料夾`學號_Lab03`在將資料夾上傳