關於字串、變數、布林值、迴圈的零散筆記。參考資源

  • x, y, z = 1, 2, 3 相當於 x, y, z = (1, 2, 3),對 Tuple 做 Unboxing
  • 跟 C# 一樣,_ 常用在可忽略、用不到的變數名稱,例如 x, _, z = (1, 2, 3)
  • 常數慣例用大寫,例如 PI = 3.14
  • 保留字(關鍵字)共 35 個(Python 3.12),可由 keyword.kwlist 取得,不能當成變數名稱
  • 軟關鍵字 keyword.softkwlist(['_', 'case', 'match', 'type'])、內建函式名稱,不建議用來當變數名稱
  • 變數以及函式命名慣用蛇式(names_like_this)、類別命名則用駝峰(‵MyClass`)
  • del var_name 可刪除變數
  • user_input = input() 讀取使用者終端機輸入內容
  • var_name: int = 123 def add(a: int, b: int) -> int 可提示型別,但僅供 IDE 跟人參考用,不具約束性
  • type(var_name) 可取得變數型別,type(123) 會傳回 <class 'int'>
  • 數值型別有 int、float、str、bool, complex (複數,3 + 2j,電子電機界 i 代表電流,故用 j 表虛部)
  • 數字表示:0b10 二進位、0o10 八進位、010 十六進位、1_000_000 千位標示。oct(10) 得到 '0o12'、hex(10) 等 'oxa'
    int('10', 16) 16 進位字串轉整數
  • 1 + '1' 不同型別不能相加(不要被 JavaScript 慣壞了),會 TypeError: unsupported operand type(s) for +: 'int' and 'str',但 1 + True 可以,是因為 Ture/False 是 1/0 的別名
  • bool() 轉換時,會當成 False 者:False、None、0, "", [], (), 等空容器
  • 字串用單引或雙引號都可以,\o ' " \ooo \xhh \uhhhh \Uhhhhhhhh \0 \n \r \t... 等規則與大部分語言相同
    r"\t' 類似 C# @"\t",不解析轉義(Escape)字串
    ''' 或 """ 可包夾有換行的字串內容
  • 字串可用加號串接,乘法會重複內容 n 之,"abc" * 3 等於 'abcabcabc'
  • 字串切片:
    n = 'Jeffrey'
    n[-1] # 'y'
    n[4:] # 'rey'
    n[1:3] # 'ef', 不含第 3 個
    n[:4] # 'Jeff'
    n[1::2] # 'efe',第一個起到結尾,每次跳兩格
    n[::-1] # 'yerffeJ'
    
  • n[4:] 相當於 n[4:None],Python 的 None 相當於 C#/JavaScript 的 null,None 是 <class 'NoneType'>
  • ASCII/Unicode 轉換:ord('黑')、char(40657)、'黑'.encode('big5')、'黑'.encode('utf-8') (會得到 bytes b'\xe9\xbb\x91',.decode('utf-8') 還原回字串)、b"hello" 可宣告 bytes 但限 ASCII
  • 非數字 float('nan') / math.nan,NaN 加減乘除都是 NaN,NaN 自己跟自己做 == 也不相等,但可用 math.isnan() 檢查
    特殊計算:NaN 零次方是 1,1 ** math.nan == 1
  • 正負無限大:float('inf') float('-inf') math.inf math.isinfo()
  • C# 的字串插補(String Interpolation) $"Hello, {name}!" 在 Python 叫格式化字串(Formatted String),又稱為「F 字串(f-strings)」,寫為 f"Hello, {name}!"
  • F 字串格式標示:
    f"{qty:,}"(千位號)、f"{qty:.2f}"(兩位小數)、f"{qty:,.2f}"(千位號+兩位小數)
    f"|{pi:20}|"左補空白到 20 位、f"|{pi:<20}|"(右補空白)、f"|{pi:>20}|"(左補空白,預設行為)、f"|{pi:<20}|"(置中)、f"|{pi:X>20}|(左補'X')
    f"{hour:02}:{minute:02}:{second:02}" 補零到兩位
    f"{10:b}"f"{10:o}"f"{255:x}"f"{big_value:.3e}" 二、八、16 進位、科學記號
    f"{the_day:%Y/%m/%d}" 日期
    f"{a + b =} " 顯示 'a + b = ' 接上 a + b 的數值
  • 字串函數:startswith()、endswith()、isupper()、islower()、isnumeric()、index() 找第一個符合的索引值,找不到會錯 ValueError: substring not found、rindex() 從後面開始找 、find()/rfind() 找不到傳 -1
    replace('t', '-') 置換、replace('t', '-', 1) 只取代 1 次、strip() 刪頭尾空白、strip("abc") 刪頭尾的 a 或 b 或 c
    split('-')split('-', 2) 拆兩個出來,後面不拆成保留整體
  • 邏輯判斷時寫 and or
  • 邏輯短路(Short-Circuit)
    m > 2 and print("m 大於 2") m < 0 or print("m 大於 0")
  • 由於 Python 不像 C#/JS 可用 隔出空的流程分支區塊,必要時縮排再放上 pass 佔位
  • Python 的 else if 要寫成 elif
  • Python 沒有 switch (吵了很久,但作者覺得 if elif else 就夠了),但有個功能更強大的 match,可以實現以下邏輯:
    match data:
    case int() | float():
        print("數字")
    case str():
        print("字串")
    case [uid, name, age]:
        print(f"人員:{uid} / {name} / {age}")        
    case {"gender": "female", "name": name}:
        print(f"{name} 女士您好!")        
    case x, y if y != 0:
        print(f"{x / y = }")        
    case _:
        print("其他型別")
    
  • Python 不用 for i = 0; i < 10; i++ 這種做法,會寫成 for n in range(10)
  • for .. in ... 可以用在任何 Iterable 物件上,像是 List、Array、string,並可配合 enumerate() :
    import numpy as np
    for n in [1, 2, 3]: # List
        print(n, end=" ")
    print()
    for t in enumerate(['a','b']): 
        print(t, end=" ")
    print()
    for (i, v) in enumerate(['a','b']): 
        print(f"{i}.{v}", end=" ")
    print()
    for n in np.array([1, 2, 3]): # Array
        print(n, end=" ")
    print()    
    for c in "Jeffrey":
        print(c, end=" ")  
    print()      
    for k, v in enumerate({"id":1,"name":'Jeffrey'}): # Tuple
        print(f"[{k}]={v}")
    
  • 迴圈練習,華麗聖誕樹
  • Python 的 for 一樣有 break 跟 continue,另外有個特殊的 else 寫法,迴圈正常跑完非 break 跳出時觸發
    for n in [1, 2, -1, 3]:
        if (n < 0):
            print('有內鬼中止交易')
            break
        print(n)
    else:
        print('完整跑完迴圈')
    
  • 迴圈的 else
    for n in range(5):
        if (n == 3):
            break
        print(n)
    else
        print('這行顯示代表沒break完整跑完') # 想成 break ... else ...
    

Notes on strings, variables, booleans, and loops in Python, covering topics like tuple unpacking, naming conventions, data types, slicing, formatted strings, logical operations, the match statement, and loop constructs with examples.


Comments

Be the first to post a comment

Post a comment