Python編程小技巧

前言

經常看到關於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)

with使\color{red}with 的好處是即使出錯,也會幫你關閉文件。
拼接字符串

列表去重

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

set\color{red}利用集合set操作
使用字典的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個時之前的退出
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章