參考廖雪峰python3知識(shí)點(diǎn)的總結(jié)
使用函數(shù)對(duì)迭代對(duì)象進(jìn)行處理
- map函數(shù):map(函數(shù)對(duì)象,可迭代對(duì)象)
map函數(shù)的實(shí)質(zhì)就是將函數(shù)對(duì)象應(yīng)用于可迭代對(duì)象的每一個(gè)元素,并且返回處理iterator,iterator里面保存處理后的元素椰于。
注意點(diǎn):函數(shù)對(duì)象只能接受一個(gè)參數(shù)惊搏,表示對(duì)參數(shù)進(jìn)行處理贮乳。
def func(element):
return element*element
lst = [1,2,3,]
#返回iterator
result = map(func,lst)
#將iterator轉(zhuǎn)換為可知大小的序列
lst_result = list(result)
map總結(jié):
- 當(dāng)對(duì)一個(gè)可迭代對(duì)象(包括list,dict,tuple,set,str)中的每一個(gè)元素進(jìn)行處理時(shí),要想到使用這個(gè)方法
- 根據(jù)這個(gè)方法可以深入理解list(迭代對(duì)象)方法的實(shí)現(xiàn)機(jī)制恬惯,通過(guò)循環(huán)可迭代對(duì)象向拆,然后將結(jié)果存為list.
- reduce函數(shù):reduce(函數(shù)對(duì)象,可迭代對(duì)象)
reduce函數(shù)的實(shí)質(zhì)就是將函數(shù)對(duì)象應(yīng)用于可迭代對(duì)象的前后兩個(gè)元素,并且返回循環(huán)處理結(jié)束后的結(jié)果酪耳。
注意點(diǎn):此處的函數(shù)對(duì)象不同于map中的函數(shù)對(duì)象浓恳,其有兩個(gè)參數(shù)。
def add(l_num,r_num):
return l_num+r_num
lst = [1,2,3,]
lst = (i*i for i in lst)
print(reduce(add,lst))
reduce函數(shù)總結(jié):
- 當(dāng)需要對(duì)一個(gè)可迭代對(duì)象中的前后兩個(gè)元素進(jìn)行處理時(shí)碗暗,要想到使用該方法颈将。
- filter函數(shù):filter(函數(shù)對(duì)象,可迭代對(duì)象)
#此處引用廖雪峰的例子
#實(shí)現(xiàn)算法的基本思路:1.創(chuàng)建一個(gè)完整的序列,2.每次取出第一個(gè)數(shù)言疗,然后用這個(gè)數(shù)來(lái)過(guò)濾序列晴圾,返回新的序列,3.用這個(gè)新的序列循環(huán)進(jìn)行2中的操作……
#創(chuàng)建完整的序列
def generate():
yield 3
while True:
n+=1
yield n
#創(chuàng)建過(guò)濾器
def filter_num(num):
return lamda x:x%num != 0
#創(chuàng)建素?cái)?shù)
def func():
yield 2
lst = filter(filter_num(2),generate())
while True:
first_num = next(lst)
yield first_num
lst = filter(filter_num(first_num),lst)
#查看結(jié)果
for i in func():
print(i)
filter總結(jié):
- 首先是對(duì)filter函數(shù)的總結(jié)洲守,其可以用來(lái)對(duì)一個(gè)可迭代對(duì)象中的元素進(jìn)行篩選
- 其次是對(duì)以上算法的思考疑务,首先注意到是循環(huán)一個(gè)步驟,所以將這個(gè)步驟放到for循環(huán)中梗醇,然后是先產(chǎn)生隊(duì)列知允,后面還要對(duì)其進(jìn)行修改,所以可以將其放在循環(huán)外叙谨,由于循環(huán)的部分是產(chǎn)生元素温鸽,用元素調(diào)整隊(duì)列,所以放在循環(huán)中,另外一個(gè)涤垫,每一次操作后都要對(duì)序列進(jìn)行修改姑尺,所以可以通過(guò)變量的指向問(wèn)題來(lái)指向新的對(duì)象即可。
- 然后是對(duì)生成器的思考蝠猬,只要有yield就成了生成器切蟋,然后不同的生成器放在一起可以組成一個(gè)新的生成器,其實(shí)質(zhì)就是通過(guò)yield不停取值榆芦。另外柄粹,對(duì)于生成器的可以套用不同的篩選方法,即對(duì)生成器套用方法返回的新生成器匆绣,這可能難以理解驻右,但只需要將生成器理解為有大小界限的列表即可!F榇尽?柏病!
- 最后是對(duì)python中函數(shù)應(yīng)用一種現(xiàn)象的總結(jié).其中函數(shù)名()表示執(zhí)行,用函數(shù)名來(lái)作為參數(shù)或者返回值表示的是函數(shù)對(duì)象拣凹,如以上的filter_num(first_num)就要將其理解為他的返回值---函數(shù)對(duì)象森爽。
另外匿名函數(shù)也是一個(gè)函數(shù)對(duì)象,
再者是咐鹤,如果一個(gè)函數(shù)沒(méi)法通過(guò)參數(shù)進(jìn)行傳參拗秘,那么可以在其外面嵌套一個(gè)新的函數(shù),然后返回這個(gè)需要的函數(shù)祈惶,這個(gè)無(wú)法設(shè)置的參數(shù)可以通過(guò)訪問(wèn)嵌套函數(shù)的局部變量來(lái)實(shí)現(xiàn)。如以下代碼:
#這個(gè)函數(shù)故意寫(xiě)成有問(wèn)題扮匠,但表達(dá)的意思是捧请,需要一個(gè)n變量,但是無(wú)法對(duì)其傳參
def filter(num):
return num/n == 1
#所以可以通過(guò)以下的方法解決
def func():
n = 1
#通過(guò)訪問(wèn)嵌套函數(shù)的局部變量來(lái)實(shí)現(xiàn)這個(gè)參數(shù)的使用
return lambda x:x/n == 1
- sorted函數(shù):sorted(可迭代對(duì)象 ,key=函數(shù)對(duì)象,reversed = Boolean)
實(shí)質(zhì)上就是函數(shù)對(duì)象處理每一個(gè)元素棒搜,然后根據(jù)函數(shù)處理返回的結(jié)果進(jìn)行排序疹蛉,另外正序倒序排序可以通過(guò)reversed參數(shù)進(jìn)行設(shè)置。
def func(s):
return s.lower()
lst = ['a','B','c']
print(list(sorted(lst,key = func,reversed=True)))