1. 程式人生 > 實用技巧 >Python3 高階程式設計技巧(部分)

Python3 高階程式設計技巧(部分)

目錄:

在列表、字典、集合中篩選資料

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:101677771

示例資料:
data_list = [ 52, 68, 20, 85, 63, 21, 14, 85 ]
data_dict = { ‘數學’:56, ‘英語’:68, ‘語文’:55, ‘生物’:72, ‘物理’:92, ‘體育’:32 }

data_set = { 52, 68, 20, 85, 63, 21, 14, 85 }

  • 列表
    • [ x for x in data_list if x > 60 ]
    • filter(lambda x: x > 60, data_list) # 注:filter返回的是迭代器
  • 字典
    • { key: val for key, val in d.items() if val > 60 }
  • 集合
    • { x for x in data_set if x > 60 }

為元組元素命名

如果我們的資料有固定的格式如學生資訊有姓名、性別、年齡等等,這時我們通常使用元組儲存資料,以此減少記憶體開銷。

但因此不能像字典那樣以鍵訪問值,因此,我們需要一個兼具字典和元組優點的型別。

> 命名元組 collections.namedtuple

from collections import namedtuple
Student = namedtuple('Student', ['name', 'sex', 'age'])
s1 = Student('Tom', '男', 18)
print(s1[1])  # '男'
print(s1.age) # 18

通過列表、元組建立字典

> dict.fromkeys

如下,我打算統計 data_list 中每個數字出現的頻率

data_list = [1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 8, 9, 9]
stat = dict.fromkeys(data_list, 0)
print(stat) # {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 8: 0, 9: 0}
for k in data_list:
    stat[k] += 1
print(stat) # {1: 3, 2: 2, 3: 1, 4: 4, 5: 2, 6: 1, 8: 1, 9: 2}

字典排序

假設我有某班數學成績的字典型資料,我需要對其進行排序

score = {
 '龍密': 51,
 '于飛': 49,
 '朱行': 34,
 '賴國': 48,
 '杜佺': 37,
 '謝香': 55,
 '秦香': 30,
 '陸玟': 67,
 '任姑': 57,
 '常曉': 92
}
  • zip + sorted

tmp = zip(score.values(), score.keys()) # zip返回的是迭代器,內容為[(51,'龍密'),(49,'于飛'),(34,'朱行'),...]
result = sorted(tmp) # 使用 sorted(tmp, reverse=True) 進行降序排序
print(tmp) # [(30, '秦香'), (34, '朱行'), (37, '杜佺'), (48, '賴國'), ...]
  • sorted (使用key引數)

print(score.items()) # .items() 返回了元組列表 [('龍密', 51), ('于飛', 49), ('朱行', 34), ...]
result = sorted(score.items(), key=lambda item: item[1])
print(result) # 結果 [('秦香', 30), ('朱行', 34), ('杜佺', 37), ...]

注:似乎第一種快點,是不是很反直覺呀

尋找字典的公共鍵

利用集合

r1 = {'蘇亞雷斯':1,'梅西':2,'本澤馬':1,'c羅':3}
r2 = {'蘇亞雷斯':1,'c羅':1,'格里茲曼':2,'貝爾':1}
print(r1.keys() & r2.keys()) # { 'c羅', '蘇亞雷斯' }

讓字典保持有序

> 有序字典 collections.OrderedDict

from collections import OrderedDict
od = OrderedDict()
od['first'] = '這是第一條資料'
od['second'] = '這是第二條資料'
od['third'] = '這是第三條資料'
for key,val in od.items():
    print(key, val)
'''輸出如下
first 這是第一條資料
second 這是第二條資料
third 這是第三條資料
'''

生成器函式

def getId():
	i = 0
	while(True):
		i += 1
		yield i

id = getId()
for _ in range(10):
	print(next(id))
'''結果
1
2
3
...
'''

yield協程

使用協程計算平均數

def average():
    count, total, arg = 0, 0, 0
    while True:
        val = yield arg
        if val:
            total += val
            count += 1
            arg = total / count

data = [15, 56, 85, 25, 36, 45, 20, 21, 2]
arg = average()
next(arg) # 預激
for val in data:
    print(arg.send(val))
print('平均數:', next(arg))
'''結果
15.0
35.5
52.0
45.25
43.4
43.666666666666664
40.285714285714285
37.875
33.888888888888886
平均數: 33.888888888888886
'''

同時遍歷值與下標

> enumerate

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
for i, v in enumerate(seasons):
	print('{}:  {}'.format(i, v))
'''返回
0:  Spring
1:  Summer
2:  Fall
3:  Winter
'''