1列表和列表的內(nèi)存處理
列表是python組合數(shù)據(jù)類型中使用較多的類型之一十兢,以其對(duì)批量數(shù)據(jù)提供了友好的訪問支
持而被廣大開發(fā)人員所鐘愛挫剑,在程序開發(fā)操作過程中隨處可見對(duì)于列表的操作
在程序開發(fā)過程中裸删,我們對(duì)于列表的操作有兩種不同的情況需要考慮
? 我們需要一個(gè)存放了大量的有規(guī)律的數(shù)據(jù)的列表兼呵,這個(gè)列表怎么定義
? 列表中存儲(chǔ)的數(shù)據(jù)量過大满败,會(huì)不會(huì)對(duì)內(nèi)存產(chǎn)生影響
1.1類表推導(dǎo)式
如果我們接到一個(gè)需求贴铜,需求中要用帶一個(gè)包含0~10自然數(shù)的列表粪摘,應(yīng)該怎么去做?手工定義绍坝?如下面這樣的方式
my_list = [0,1,2,3,4,5,6,7,8,9,10]
但是徘意,如果需要的是0~1000的自然整數(shù)的列表呢?
沒問題轩褐,編發(fā)實(shí)現(xiàn)
my_list = list()
for i in range(1000):
my_list.append(i)
這樣當(dāng)然沒有問題椎咧,但是針對(duì)存放有規(guī)律數(shù)據(jù)的列表來說還是稍顯復(fù)雜了,pyhton提供了對(duì)于有規(guī)律數(shù)據(jù)的快捷操作:推導(dǎo)式
通過推導(dǎo)式可以很快捷方便的生成需要的數(shù)據(jù)
? 簡(jiǎn)單推導(dǎo)式
my_list = [x for x in range(0, 1000)]
生成一個(gè)包含 0~999 自然數(shù)序列的列表
? 運(yùn)算推導(dǎo)式
my_list = [x**2 for x in range(0, 100)]
生成一個(gè)包含 0~99 平方數(shù)序列的列表
? 條件推導(dǎo)式
my_list = [x for x in range(100) if x % 2 == 0]
生成一個(gè)包含 0~100 范圍內(nèi)偶數(shù)的列表
? 組合推導(dǎo)式
my_list = [x+y for x in range(0, 5) for y in range(0, 5)]
生成一個(gè) 0~5 和 0~5 二維數(shù)據(jù)排列相加的和的列表
列表推導(dǎo)式的出現(xiàn)把介,極大程度的簡(jiǎn)化了存放有規(guī)律數(shù)據(jù)的列表的操作勤讽。
在實(shí)際開發(fā)過程中蟋座,列表推導(dǎo)式的應(yīng)用也是相當(dāng)?shù)膹V泛的,甚至可以基本替代一些簡(jiǎn)單程序
結(jié)構(gòu)實(shí)現(xiàn)一行代碼獨(dú)立功能流程了
1.2列表生成器
盡管列表簡(jiǎn)潔方便的可操作性給程序開發(fā)帶來了非常便捷的操作效率脚牍,但是不可忽視的是
列表本身存儲(chǔ)數(shù)據(jù)的機(jī)制向臀,在進(jìn)行大量數(shù)據(jù)處理時(shí),會(huì)極度的消耗系統(tǒng)內(nèi)存
所以列表的操作更多的時(shí)候體現(xiàn)在少量數(shù)據(jù)集中處理的情境下莫矗。
但是需求的變化總是不可捉摸,有可能就會(huì)遇到我們要操作一個(gè)存放上百萬數(shù)據(jù)的列表中
的數(shù)據(jù)砂缩,同時(shí)這個(gè)數(shù)據(jù)有一定的規(guī)律作谚,如我們?cè)谀硞€(gè)算法中要重復(fù)不斷地獲取斐波那契數(shù)列
的下一個(gè)數(shù)據(jù)參與運(yùn)算,就需要將斐波那契數(shù)列的數(shù)據(jù)臨時(shí)存儲(chǔ)起來方便程序讀取庵芭,但是該
數(shù)列的數(shù)據(jù)基本可以說是無限的妹懒,如果將這樣的數(shù)據(jù)通過列表的格式存儲(chǔ)在程序中
呵呵!別寫代碼了双吆,咱們?nèi)グ岽u吧眨唬!
PYTHON 針對(duì)操作如此頻繁的列表,怎么可能視而不見對(duì)于內(nèi)存的大量消耗呢
列表生成器好乐,就是針對(duì)這樣的列表使用場(chǎng)景退出的
生成器語法結(jié)構(gòu)和推導(dǎo)式語法結(jié)構(gòu)及其類似
一個(gè)基本生成器:生成0~10自然數(shù)序列的數(shù)據(jù)
my_generator = (x for x in range(0,10))
直接展示:<generator object <genexpr> at 0x103d7e4c0>這是一個(gè)生成器對(duì)象匾竿、
生成器對(duì)象必須通過系統(tǒng)內(nèi)建標(biāo)準(zhǔn)函數(shù) next()來獲取生成器下一個(gè)數(shù)據(jù)
生成器的優(yōu)異性能在于使用的時(shí)候才會(huì)運(yùn)算下一個(gè)數(shù)據(jù),而不會(huì)一次將數(shù)據(jù)全部加載
>>>my_generator = (x for x in range(0,10))
>>>next(my_generator)
0
>>>next(my_generator)
1
>>>my_generator.__Next__()
2
>>>my_generator.__next__()
3
>>>print(my_generator)
<generator object<genexpr> at 0x103d7e570>
2循環(huán)遍歷與迭代器
在程序中蔚万,我們經(jīng)常會(huì)遇到這樣一些對(duì)象岭妖,通過for循環(huán)可以直接循環(huán)迭代,那么這樣可以被循環(huán)迭代的對(duì)象都是什么類型的對(duì)象反璃,我們自定義類型創(chuàng)建的對(duì)象是否也可以通過for循環(huán)進(jìn)行迭代操作呢昵慌?
pyhton中提供了一個(gè)工具對(duì)象:迭代器對(duì)象 collections.Iterable
該對(duì)象的iter()函數(shù)可以得到一個(gè)可迭代對(duì)象:collections.Iterator
程序中通過for循環(huán)進(jìn)行循環(huán)遍歷操作的,其實(shí)就是迭代器對(duì)象Iterable 在循環(huán)遍歷過程中淮蜈,可迭代對(duì)象Iterator是用于索引記錄正在遍歷的數(shù)據(jù)
我們可以在自定義類型中斋攀,通過重寫iter()方法,讓自定義對(duì)象返回一個(gè)迭代器對(duì)象這樣也就可以讓自定義類型的對(duì)象那個(gè)來完成可迭代操作
3.再說函數(shù)
3.1函數(shù)的引用賦值和參數(shù)操作
python中的函數(shù)梧田,本身也是一個(gè)對(duì)象淳蔼,常規(guī)定義語法的函數(shù),就是將一個(gè)函數(shù)對(duì)象的引用地址賦值給函數(shù)名稱的變量裁眯,通過函數(shù)名稱的變量調(diào)用執(zhí)行函數(shù)
聲明定義一個(gè)函數(shù)對(duì)象肖方,賦值給了變量show——msg
def show_msg():
print("函數(shù)代碼執(zhí)行......")
通過變量show_msg可以直接調(diào)用執(zhí)行函數(shù)對(duì)象的代碼
show_msg()
如果函數(shù)就是對(duì)象,那么函數(shù)也是和對(duì)象一樣可以被引用賦值
聲明定義一個(gè)函數(shù)對(duì)象未状,賦值給了變量 show_msg
def show_msg():
print(“函數(shù)代碼執(zhí)行……”)
函數(shù)可以賦值給一個(gè)變量
show_info = show_msg
同樣可以通過變量 show_info 來調(diào)用執(zhí)行函數(shù) show_msg
show_info()
函數(shù)也可以被當(dāng)成參數(shù)傳遞給其他函數(shù)執(zhí)行
聲明定義一個(gè)函數(shù)對(duì)象俯画,展示第一類信息
def show_msg1():
print(“函數(shù)代碼執(zhí)行,信息 1……”)
def show_msg2():
print(“函數(shù)代碼執(zhí)行司草,信息 2……”)
定義展示處理函數(shù)
def show(message):
message()
執(zhí)行代碼:函數(shù)可以當(dāng)成參數(shù)被傳遞
show(show_msg1)# 展示信息 1
show(show_msg2)# 展示信息 2
3.2函數(shù)默認(rèn)調(diào)用:偏函數(shù)
有一種函數(shù)操作艰垂,可以讓