前言
經常看到關於Python編程的小技巧,但是都沒有記錄下來,當下次運用時還是原來的寫法,這不記錄一下。
Python 之禪
Python 裏有個小彩蛋:
在 Python Shell 裏輸入 import this
這段話被稱作“Python 之禪”(The Zen of Python),它列舉了一些 Python 所推崇的理念,比如:
優美勝於醜陋
明確勝於隱晦
簡單勝於複雜
…
可讀性很重要
不要忽略錯誤
面對不確定時,拒絕猜測
現在做好過不做,但盲目動手不如不做
如果你的實現很難說清楚,那是個壞想法;反之亦然
…
列表元素遍歷
初學者寫法:
for i in range(len(lst)):
print(lst[i])
pythonic寫法:
for i in lst:
print(i)
交換兩個變量
普通寫法:
temp = a
a = b
b = temp
pythonic 寫法:
a, b = b, a
讀寫文件
普通寫法:
f = open('filename.txt')
text = f.read()
print(text)
f.close()
pythonic 寫法:
with open('filename.txt') as f:
for line in f:
print(line)
拼接字符串
列表去重
pythonic 寫法:
list(set(x))
拼接字符串
普通寫法:
letters = ['h', 'e', 'l', 'l', 'o']
s = ''
for l in letters:
s += l
print(s)
pythonic 寫法:
print(''.join(letters))
列表加索引
pythonic 寫法:
for i, elem in enumerate(lst):
print(i, elem)
遍歷字典項:
for key, value in dct.items():
print(key, value)
生成新列表
pythonic 寫法:
newLst = [i for i in lst if i > 0]
這樣會更節省資源,提升執行效率。
根據鍵名獲取字典中對應的值
普通寫法:
value = dct[key]
這樣的問題在於,如果 key 不存在,代碼就報錯跳出。於是你不得不增加更多的判斷。
pythonic 寫法:
value = dct.get(key, 0)
改用 get 方法,不存在時會得到 None,或者指定的默認值(這裏是 0)。
列表字典集合篩選數據
列表
filter寫法:
data = [2,2,-3,6]
filter(lambda x: x >= 0,data)
列表解析:
data = [2,2,-3,6]
[x for x in data if x >= 0]
列表解析效率高於filter高於普通迭代。
爲元組中每個元素命名
例子學生信息系統中數據爲固定格式:
{名字,年齡,性別,郵箱地址,…}
定義一系列常量
NAME,AGE ,SEX,EMAIL = range(4)# 用變量當常數值
student = ('Jim',16,'male','[email protected]')
print(student[NAME])
if student[AGE] <= 26:
##
if student[SEX] <= 'male':
##
使用標準庫collections.namedtuple
from collections import namedtuple
Student = namedtuple('Student',['name','age','sex','email'])
s = Student('Jim',16,'male','[email protected]')
## 訪問
s.name
s.age
s.sex
統計序列中頻度
from collections import Counter
obj = Counter('aabbccc')
print(obj)
根據字典的值排序鍵
使用zip函數
d = {'a':85,'c':94,'b':88,'y':96,'x':85,'z':84}
zip(d.keys(),d.values())
sorted(zip(d.keys(),d.values()))
# [(84, 'z'), (85, 'a'), (85, 'x'), (88, 'b'), (94, 'c'), (96, 'y')]
使用sorted函數
d = {'a':85,'c':94,'b':88,'y':96,'x':85,'z':84}
d.items() # [('a', 85), ('c', 94), ('b', 88), ('y', 96), ('x', 85), ('z', 84)]
sorted(d.items(),key = lambda x: x[1])
# x表示d.items()生成的列表的每一項,x[1]代表每一項裏面的第二個
# [('z', 84), ('a', 85), ('x', 85), ('b', 88), ('c', 94), ('y', 96)]
dict(sorted(d.items(),key = lambda x: x[1])) # 轉換爲字典
字典公共鍵
普通寫法::
# 字典
a = {'a':1,'b':3,'e':2,'f':4}
b = {'c':4,'e':1,'f':3}
c = {'b':4,'d':3,'e':2,'f':4}
res = []
for k in a:
if k in b and k in c:
res.append(k)
res
使用字典的keys方法(不靈活)
# 字典
a = {'a':1,'b':3,'e':2,'f':4}
b = {'c':4,'e':1,'f':3}
c = {'b':4,'d':3,'e':2,'f':4}
a.keys() & b.keys() & c.keys()
ret = reduce(lambda x, y : x & y, map(dict.keys, [a, b, c]))
print(ret)# {'e', 'f'}
使用有序字典
from collections import OrderdDict
d = OrderDict()
d['Jim'] = (1,35)
d['Leo'] = (2,37)
d['Bob'] = (3,48)
print(d)
雙端隊列
from collections import deque
q = deque([],5)
# 多於5個時之前的退出