本文所記述的是一些基礎知識點中平時用的比較少的方法。
一、賦值魔法
1.不對等賦值
當賦值符號左右兩端長度不相等時,可以使用(*)來收集多余的值。
>>> a, b, *rest = [1, 2, 3, 4]
>>> rest
[3, 4]
這個星號(*)也可以放在其他位置。
>>> name = "Albus Percival Wulfric Brian Dumbledore"
>>> first, *middle, last = name.split()
>>> middle
['Percival', 'Wulfric', 'Brian']
2.鏈式賦值
即:x = y = 'abc',但是個人不提倡這種方法,除非已經明確x和y互為引用。
二、條件語句
1.是否“相等”
注意“==”運算符和“is”的差別(!=與is not同理)的差別,前者表示值相等,后者表示為同一對象(地址相等)。
2.斷言
斷言assert的作用是為了讓程序在錯誤條件出現(xiàn)時立即崩潰以防止發(fā)生進一步的錯誤。斷言語句的后面可以接續(xù)說明性的字符串,例如:
>>> age = -1
>>> assert 0 < age < 100, 'The age must be realistic'
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError: The age must be realistic
三、循環(huán)語句
1.遍歷字典
字典可以作為可迭代對象進行遍歷,通常有兩種方式,對于以下字典:
d = {'x': 1, 'y': 2, 'z': 3}
# 方法1
for key in d:
print(key, 'corresponds to', d[key])
# 方法2
for key, value in d.items():
print(key, 'corresponds to', value)
2.迭代時獲取索引
使用下標list[i]的方法也能達到相同的目的,但是手法略顯笨拙??梢允褂胑numerate獲取列表index:
for index, element in enumerate(list):
if 'xxx' in element:
list[index] = '[censored]'
3.簡單的列表推導式
個人認為為了便于閱讀,列表推導最好不要過于復雜。下面這個例子使用了兩層循環(huán)和條件判斷:
>>> girls = ['alice', 'bernice', 'clarice']
>>> boys = ['chris', 'arnold', 'bob']
>>> [b+'+'+g for b in boys for g in girls if b[0] == g[0]]
['chris+clarice', 'arnold+alice', 'bob+bernice']
四、執(zhí)行存儲字符串中的python代碼
主要有exec和eval兩個方法,其中exec將執(zhí)行字符串中的python語句,而eval將計算(返回)字符串中包含的python語句的結果。
1.exec
最簡單的用法:
>>> exec("print('Hello, world!')")
Hello, world!
但是,為了代碼安全性考慮,可以給exec指定第二個參數(shù),作為其命名空間,例如:
>>> exec('sqrt = 1', scope)
>>> scope['sqrt']
1
這樣,exec所得到的結果就不會與math中的sqrt方法相沖突了。
2.eval
將字符串作為python代碼執(zhí)行兵計算結果:
>>> eval("2 * 3")
6
eval也會有命名空間的問題,例如:
>>> scope = {}
>>> scope['x'] = 2
>>> scope['y'] = 3
>>> eval('x * y', scope)
6
注:命名空間在形式和使用上可以理解為一個字典。