Python進階-高階語法
python入門回顧
1.列表是什麼? 列表是PYTHON中的一種組合資料型別
2.什麼時候用? 需要在一個變數中統一整理儲存多個可以重複資料的情況下
3.為什麼要用? 列表可以統一管理多個數據
4.如何使用? 宣告 資料處理:增刪改查[遍歷] insert/append/extend pop/remove/clear
tips: 列表的使用缺陷:列表中直接儲存資料,但是如果列表中的資料較多的話,可能會比較消耗記憶體【列表資料項較多、記憶體消耗較多】
針對列表的使用缺陷特徵,我們可能會有以下疑問。 問題1:列表資料較多?怎麼新增? 問題2:列表資料消耗記憶體較多?怎麼優化?
接下來我們來通過三個名詞來探尋解決問題之道。
1.列表推導式
一般情況下,如果一個列表中要儲存大量相關資料,這些資料通常都是有規律的。 [如果列表中儲存的資料量並不是很大,資料之間的關聯關係可能並不是很大] [如果列表中儲存的資料量非常大,資料之間的關聯關係非常強]
列表中的資料如果一旦存在指定的規律[簡單->複雜],
通過指定的規則就可以自動推到儲存列表物件,列表中的資料可以直接產生——列表推導式
列表推導式:程式表示式:可以運算的程式程式碼
基本推導式:得到一個0~100的自然數序列列表
-
手工建立新增資料 純手工輸入,不推薦。
-
迴圈語法新增[可讀性較高,程式碼較多]
# 常規方式
nums2 = list ()
for i in range(0, 100):
nums.append(i)
print(nums)
列印結果為:[0, 1, 2, 3, … ,100]
- 推導式操作
nums3 = [x for x in range(0, 100)]
print(nums)
列印結果為:[0, 1, 2, 3, … ,100]
eg: 有一個班級的學生的成績,求所有大於平均成績的成績名單。*
# 常規操作
score = [20, 50, 69, 70, 99, 145, 149]
average1 = sum(score)/len(score)
score1 = list()
for s in score:
if s >= avg:
score1.append(s)
print(score1)
列印結果為:[99, 145, 149]
# 列表推導式簡化
score = [20, 50, 69, 70, 99, 145, 149]
score2 = [s for s in score if s >= sum(score)/len(score)]
print(score2)
列印結果為:[99, 145, 149]
列表推導式通過表示式定義的規則,可以在一個表示式中給列表增加指定規則的元素
2.列表生成器
生成器:在使用過程中,根據指定的規則運算產生列表元素資料 使用過程:執行時 運算產生:規則 == 推導式
生成器和推導式區別: 推導式: 使用列表的執行前 得到完整列表 生成器: 使用列表 執行時 得到下一個列表元素
生成器:推導式->將推導式的語法方括號->修改成圓括號 推導式->列表[list]->包含具體元素資料->索引/下標-獲取資料 資料量較大:運算消耗時間消耗記憶體 生成器->物件[generator]->包含運算規則->next() /next()-獲取資料與資料量大小無關
from memory_profiler import profile
'''
使用推導式計算資料量大的數如:10**5
tips: 推導式會一次性讀取列表內所有資料
'''
@profile
def main():
# 推導式
num1 = [x for x in range(10, 10**5)]
return num1
if __name__ == "__main__":
num1 = main()
列印結果為:一般電腦(4-6G記憶體)會出現卡頓,表明此時計算機計算的資料過大 小編的膝上型電腦為6G記憶體,證實有出現了卡頓現象。如配置較低,可將5改為4或者3即可。
Line # Mem usage Increment Line Contents
================================================
4 16.3 MiB 16.3 MiB @profile
5 def main():
6 # 推導式
7 16.7 MiB 0.4 MiB num1 = [x for x in range(10, 10**4)]
8 16.7 MiB 0.0 MiB return num1
from memory_profiler import profile
'''
列表生成器(優化記憶體分配)
tips:
'''
@profile
def main():
# 生成器
num1 = (x for x in range(10, 10**4))
return num1
if __name__ == "__main__":
num1 = main()
print(type(num1))
列印結果為:
Line # Mem usage Increment Line Contents
================================================
4 16.3 MiB 16.3 MiB @profile
5 def main():
6 # # 推導式
7 # num1 = [x for x in range(10, 10**4)]
8 # return num1
9 # 生成器
10 16.3 MiB 0.0 MiB num1 = (x for x in range(10, 10**4))
11 16.3 MiB 0.0 MiB return num1
生成器的使用注意事項: 1.如果是專案中的物件資料使用,要儲存到列表中->跟生成器/推導式 無關 列表->作用:只是一個臨時儲存多個數據的小容器 2.專案中定義固定規則的資料列表用來參與業務運算:生成器/推導式 專案開發中,定義驗證碼字元 3.專案中的核心演算法使用到大量有規則的資料:生成器 核心模組中開發資料演算法:生成器-技術層面的數學演算法開發 核心模組中的演算法改造:生成器- 技術+業務 完成的演算法修改
3.迭代器
列表、推導式、生成器 -> 都是通過 for迴圈遍歷完成資料處理的
簡述生成器和迭代器的區別與聯絡?
1.生成器主要是定義了一個數據的生成規則,通過執行時演算法得到類似列表資料的一種特殊物件
2.迭代器是用於迴圈遍歷可迭代資料的一個特殊物件,包含了迭代物件和迭代過程
3.聯絡:生成器物件就是一種可迭代物件,可以被迭代器遍歷。