列表生成器:
1、生成一個普通列表:
ls = [x for x in range(101)]
為什么學習列表生成器:降低內(nèi)存kaixiao
兩種實現(xiàn):
1:[] ==> () generator
next方法的時候會返回下一個值
next()
2、將函數(shù)轉換為列表生成器
yield generator
send()使用
3、協(xié)程 實現(xiàn)一個多任務
在編程中,我們有時候會需要生成一個列表,但是該列表可能占用大量內(nèi)存,此時列表直接加載到內(nèi)存中就不可取了,python提供了一個列表生成器。
列表生成器是一段生成對應列表的算法:
1、將我們之前的[]換成() []==>()
next()方法來獲取下一個列表的值
for來迭代生成器
2、將函數(shù)轉換為列表生成器
斐波那契數(shù)列:從第三個數(shù)開始,前兩個數(shù)之和等于第三個數(shù)(1,2,3,5,8)
def fob(max):
temp = 0
a = 1
b = 0
while b <= max:
print(a)
如果列表是由一個函數(shù)得到,可以將這個函數(shù)轉換為一個列表生成器,使用關鍵字yield,當函數(shù)中出現(xiàn)yield關鍵字,此時該函數(shù)的返回值自動的轉換為一個列表生成器。
迭代器:
1、可以迭代的對象(collections.Iterator):
列表
元組
集合
字典
字符串
如何判斷一個對象是可以迭代的?
通過collections模塊的iterable類型來判斷。
from collections import Iterable
isinstance('abc',Iterable) #str是否可迭代
Ture
isinstance([1,2,3],Iterable) #list是否可迭代
Ture
isinstance(123,Interable) #整數(shù)是否可迭代
False
2、迭代器(collections.Iterator):
能夠被next調用,返回下一個值的對象
可以被next()函數(shù)調用并不斷返回下一個值的對象成為迭代器
總結:
1、生成器就是迭代器
2、迭代器不一定是生成器
3、可迭代的對象不一定是迭代器
4、迭代器肯定可以被迭代
3、將可迭代的對象轉換為迭代器
迭代器 = iter(可迭代的對象)
什么是函數(shù)?
為了完成某一功能的代碼集合。
*args 函數(shù)的可變參數(shù),以元組的形式傳遞參數(shù)
*kwargs命名參數(shù)
def add(x,y,args):
return x + y
遞歸:函數(shù)自身調用自身就會形成遞歸
函數(shù)調用
sum = add(5,8)
lambda表達式,也就是python匿名函數(shù),簡化了代碼操作。
增加了代碼難度,降低了可讀性,增加了代碼維護的成本。
cb(lambda msg:print("接受到一個信息,信息是==>"msg))
閉包:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
閉包是弱數(shù)據(jù)類型語言所特有的特性
閉包的特點:函數(shù)嵌套函數(shù)
閉包的作用:
1、局部變量全局化,防止全局變量被污染 js
面試題:
請簡略說明xrange和range的區(qū)別。
range:返回等差數(shù)列。構建等差數(shù)列,起點是start,終點是stop,但不包含stop,公差是step。start和step是可選項,沒給出start時,從零開始;沒給出step時,默認公差是1.
xrange:xrange與range類似,只是返回的是一個"xrange object"對象,而非數(shù)組list。要生成很大的數(shù)字序列的時候,用xrange會比range性能優(yōu)很多,因為不需要一上來就開辟出一塊很大的內(nèi)存空間,這兩個基本上都是在循環(huán)的時候使用。
區(qū)別:range可以返回一個可以用于所有目的的普通列表對象,而xrange將返回一個特殊目的的對象,尤其適用于迭代操作,但是xrange并不返回一個迭代器,如果需要這樣一個迭代器,可以調用iter(xrange(x))。xrange返回的特殊目的對象比range返回的列表對象消耗較少的內(nèi)存(范圍比較大的時候)。但是對特殊目的對象指向循環(huán)操作的開銷略微高于對列表執(zhí)行循環(huán)的開銷。