Python3 高階程式設計技巧(部分)
阿新 • • 發佈:2020-09-01
目錄:
在列表、字典、集合中篩選資料
很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:101677771
示例資料:
data_list = [ 52, 68, 20, 85, 63, 21, 14, 85 ]
data_dict = { ‘數學’:56, ‘英語’:68, ‘語文’:55, ‘生物’:72, ‘物理’:92, ‘體育’:32 }
- 列表
- [ 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 }
- { 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
}
tmp = zip(score.values(), score.keys()) # zip返回的是迭代器,內容為[(51,'龍密'),(49,'于飛'),(34,'朱行'),...]
result = sorted(tmp) # 使用 sorted(tmp, reverse=True) 進行降序排序
print(tmp) # [(30, '秦香'), (34, '朱行'), (37, '杜佺'), (48, '賴國'), ...]
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
'''