1. 程式人生 > >Python進階-高階語法

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.聯絡:生成器物件就是一種可迭代物件,可以被迭代器遍歷。

水平有限,特附小圖一張,不當之處,還望包涵!

格子兮