- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 920字
- 2021-04-30 12:39:45
3.3.1 可迭代對象解壓
可迭代對象的元素個數超過變量個數時,會拋出ValueError。要從可迭代對象中解壓出N個元素,需要使用Python的星號表達式。
例如,在期末的時候,老師想統計家庭作業的平均成績,但是需排除掉最高分和最低分。如果只有4門課程,可以直接用手動賦值操作,但如果有10門或更多課程,星號表達式就派上用場了,示例如下:
def drop_start_end(subjects): start, *middle, end = subjects return avg(middle)
假設一些用戶的記錄列表中,每條記錄包含名字、郵件地址,以及不確定數量的電話號碼。若需要將這些記錄按名字、郵件地址、電話號碼的形式拆分,我們可采用以下代碼:
def name_email_phone_split(record): name, email, *phone_numbers = record return name, eamil, phone_numbers
注意 星號表達式解壓出的變量永遠是列表類型,所以對于星號表達式,就沒有必要做多余的類型檢查了。
星號表達式也能用在列表的開始部分。如我們有前8個月收入數據的序列,但是想對比一下最近一個月的收入和前面7個月的平均值,可以采用類似如下的編碼:
def income_exp(income_record): *income_pre_month, current_month = income_record income_avg = sum(income_pre_month) / len(income_pre_month) return avg_comparison(income_avg, current_month)
擴展的迭代解壓語法是專門為解壓不確定個數或任意個數元素的可迭代對象而設計的。通常,這些可迭代對象的元素結構有確定的規則(比如,第1個元素后面都是電話號碼)。
星號表達式讓開發人員可以很容易地解壓元素,而不需通過一些比較復雜的手段去獲取這些關聯的元素值。
星號表達式在處理迭代元素為可變長元組的序列時是很有用的。
下面是一個帶有標簽的元組序列示例:
record_list = [ ('f_func', 1, 2), ('d_func', 'hello world'), ('f_func', 'a', 'b'), ] def f_func(x, y): print(f'f func:{x} {y}') def d_func(s): print(f'd func:{s}') for tag, *args in record_list: if tag == 'f_func': f_func(*args) elif tag == 'd_func': d_func(*args)
星號解壓語法在字符串操作的時候也很有用,如對字符串的分割,示例如下:
str_v = 'hello:中國:three:123:World:/usr/exp:/home/my/path' greet, *fields, home_path = str_v.split(':') print(greet, home_path)
注意 對于解壓后的元素,若想要丟棄,不建議直接使用*,可以使用下劃線(_)或ign(ignore的縮寫)表示要丟棄的元素。
在實際應用時,星號解壓語法和列表處理有許多相似點,如使用星號解壓語法可以很容易地將列表分割成前后兩部分,示例如下:
num_list = [1, 3, 5, 7, 9] head, *rest = num_list print(f'head is:{head}, rest list is:{rest}')
這里展示了部分星號解壓語法的使用,更多的使用方式讀者可以自行嘗試。
擴展:通過適當添加空行,可以使代碼布局更為優雅、合理。
布局清晰、整潔、優雅的代碼能夠給讀者帶來愉悅感,也能幫助開發者進行良好的溝通。特別在團隊開發中,良好的代碼風格可以很好地幫助團隊提高開發效率。
對于沒有養成較好編碼規范的開發者,建議先花點時間了解Python編碼規范。