您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Python全棧迭代器和高階函數(shù)怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
# ### 匿名函數(shù) : lambda表達(dá)式 """ 概念: 用一句話來(lái)表達(dá)只有返回值的函數(shù) 語(yǔ)法: lambda 參數(shù) : 返回值 特點(diǎn): 簡(jiǎn)潔,高效 """ # (1) 無(wú)參的lambda表達(dá)式 def func(): return "文哥是個(gè)帥哥" # 改造 func = lambda : "文哥是個(gè)帥哥" print( func() ) # (2) 有參的lambda表達(dá)式 def func(n): return id(n) # 改造 func = lambda n : id(n) print( func(100) ) # (3) 帶有判斷條件的lambda表達(dá)式 def func(n): if n % 2 == 0: return "偶數(shù)" else: return "奇數(shù)" # 改造 func = lambda n : "偶數(shù)" if n % 2 == 0 else "奇數(shù)" print( func(44) ) # 三元運(yùn)算符 """語(yǔ)法: 真值 if 條件表達(dá)式 else 假值 如果條件表達(dá)式成立為True , 返回if前面的真值,反之,返回else后面的假值 """ n = 13 res = "偶數(shù)" if n % 2 == 0 else "奇數(shù)" print(res) # 小練習(xí) : 比較兩者之間的最大值進(jìn)行返回 def func(x,y): if x > y: return x else: return y # 改造 func = lambda x,y : x if x>y else y print( func(40,30) )
# ### locals 與 globals 使用 (了解) # 一.locals 獲取當(dāng)前作用域所有的變量 # 1.全局空間 """ locals 在函數(shù)外 , 獲取的是打印之前所有的全局變量 locals 在函數(shù)內(nèi) , 獲取的是調(diào)用之前所有的局部變量 """ """ def func(): a1 = 1 b2 = 2 a = 1 b = 2 res = locals() c = 3 print(res) d = 4 """ # 2.局部空間 """ a = 1 b = 2 def func(): a1 = 1 b2 = 2 res = locals() c3 = 3 print(res) d4 = 4 c = 3 func() d = 4 """ # 二.globals 只獲取全局空間的全局變量 """ globals 在函數(shù)外 , 獲取的是打印之前所有的全局變量 globals 在函數(shù)內(nèi) , 獲取的是調(diào)用之前所有的全局變量 """ # 1. 全局空間 """ def func(): a1 = 1 b2 = 2 a = 1 b = 2 res = globals() c = 3 print(res) d = 4 """ # 2.局部空間 """ a = 1 b = 2 def func(): a1 = 1 b2 = 2 res = globals() c3 = 3 print(res) d4 = 4 c = 3 func() globals() d = 4 """ # ### globals 返回的是內(nèi)置系統(tǒng)的全局字典 """ dic = globals() print(dic) # 通過(guò)字符串可以創(chuàng)建全局變量 dic["wangwen"] = "18歲" print(wangwen) """ # 批量創(chuàng)建全局變量 def func(): dic = globals() for i in range(1,5): # 批量在dic當(dāng)中添加鍵值對(duì),以創(chuàng)建全局變量 dic[ "a%d" % (i) ] = i """ dic["a1"] = 1 dic["a2"] = 2 dic["a3"] = 3 dic["a4"] = 4 """ func() print(a1,a2,a3,a4)
# ### 迭代器 """ 迭代器: 能被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器(Iterator 迭代器是對(duì)象) 概念: 迭代器指的是迭代取值的工具,迭代是一個(gè)重復(fù)的過(guò)程,每次重復(fù)都是基于上一次的結(jié)果而繼續(xù)的, 單純的重復(fù)并不是迭代 特征: 并不依賴索引,而通過(guò)next指針(內(nèi)存地址尋址)迭代所有數(shù)據(jù),一次只取一個(gè)值, 而不是一股腦的把所有數(shù)據(jù)放進(jìn)內(nèi)存.大大節(jié)省空間, """ # 一.可迭代對(duì)象 setvar = {"王同培","馬春配","趙萬(wàn)里","趙沈陽(yáng)"} # 獲取當(dāng)前對(duì)象的內(nèi)置成員 lst = dir(setvar) print(lst) # 判斷是否是可迭代對(duì)象 res = "__iter__" in lst print(res) # for i in setvar: # print(i) # 二.迭代器 """ for循環(huán)之所以可以遍歷所有的數(shù)據(jù),是因?yàn)榈讓邮褂昧说?通過(guò)地址尋址的方式,一個(gè)一個(gè)的找數(shù)據(jù); 可迭代對(duì)象 -> 迭代器 實(shí)際上就是從不能夠被next直接調(diào)用 -> 可以被next指針直接調(diào)用的過(guò)程 如果是可迭代對(duì)象 -> 不一定是迭代器 如果是迭代器 -> 一定是可迭代對(duì)象 """ # 1.如何創(chuàng)建一個(gè)迭代器 setvar = {"王同培","馬春配","趙萬(wàn)里","趙沈陽(yáng)"} it = iter(setvar) print(it) # 2.如何判斷一個(gè)迭代器 print(dir(it)) res = "__iter__" in dir(it) and "__next__" in dir(it) print(res) # 3.如何調(diào)用一個(gè)迭代器 """next是單向不可逆的過(guò)程,一條路走到黑""" res = next(it) print(res) res = next(it) print(res) res = next(it) print(res) res = next(it) print(res) # res = next(it) # print(res) # 4.重置迭代器 it = iter(setvar) print( it.__next__() ) print( it.__next__() ) print( it.__next__() ) print( it.__next__() ) # 5.調(diào)用迭代器的其他方法 # 1 for it = iter(setvar) for i in it: print(i) print("<======>") # 2 for + next it = iter(setvar) for i in range(2): print( next(it) ) print( next(it) ) print( next(it) ) # print( next(it) ) error 超出了尋址范圍 # 6.判斷迭代器/可迭代對(duì)象的其他方法 # 從...模塊 引入...內(nèi)容 from collections import Iterator, Iterable """Iterator 迭代器 Iterable 可迭代的對(duì)象""" res = isinstance(it,Iterator) print(res) res = isinstance(it,Iterable) print(res) # 7.range是迭代器么? print(isinstance(range(10),Iterator)) # False print(isinstance(range(10),Iterable)) # True # 變成迭代器 it = range(10).__iter__() print(isinstance(it,Iterator)) # True print(isinstance(it,Iterable)) # True # 調(diào)用it # next res = next(it) print(res) res = next(it) print(res) print("<=====>") # for + next for i in range(3): print(next(it)) print("<=====>") # for for i in it: print(i)
可迭代對(duì)象到迭代器就是一個(gè)不能被next直接調(diào)用到能被next直接調(diào)用的過(guò)程 for循環(huán)底層能表里無(wú)序的數(shù)據(jù)就是通過(guò)迭代器來(lái)實(shí)現(xiàn)的
# ### 高階函數(shù) : 能夠把函數(shù)當(dāng)成參數(shù)傳遞的就是高階函數(shù) (map ,filter ,reduce , sorted) # map """ map(func,iterable) 功能: 處理數(shù)據(jù) 把iterable中的數(shù)據(jù)一個(gè)一個(gè)拿出來(lái),扔到func做處理,通過(guò)調(diào)用迭代器來(lái)獲取返回值 參數(shù): func : 函數(shù)(內(nèi)置函數(shù),自定義函數(shù)) iterable : 可迭代性對(duì)象 (容器類型數(shù)據(jù),range對(duì)象,迭代器) 返回值: 迭代器 """ # (1) 把列表中的元素都變成整型 lst = ["1","2","3","4"] lst_new = [] for i in lst: lst_new.append(int(i)) print(lst_new) # 用map改寫 from collections import Iterator,Iterable it = map(int,lst) print(isinstance(it,Iterator)) """ 代碼解析: 第一次調(diào)用迭代器 先把列表中的第一個(gè)元素"1"拿出來(lái)扔到int中做強(qiáng)轉(zhuǎn),變成整型1返回出來(lái) 第二次調(diào)用迭代器 先把列表中的第一個(gè)元素"2"拿出來(lái)扔到int中做強(qiáng)轉(zhuǎn),變成整型2返回出來(lái) 第三次調(diào)用迭代器 先把列表中的第一個(gè)元素"3"拿出來(lái)扔到int中做強(qiáng)轉(zhuǎn),變成整型3返回出來(lái) 第四次調(diào)用迭代器 先把列表中的第一個(gè)元素"4"拿出來(lái)扔到int中做強(qiáng)轉(zhuǎn),變成整型4返回出來(lái) """ # 1.調(diào)用迭代器 next print(next(it)) print(next(it)) print(next(it)) print(next(it)) # print(next(it)) error # 2.調(diào)用迭代器 for print("<======>") it = map(int,lst) for i in it: print(i) # 3.調(diào)用迭代器 for + next print("<======>") it = map(int,lst) for i in range(3): print(next(it)) # 4.強(qiáng)轉(zhuǎn)迭代器 => 列表 it = map(int,lst) print(list(it)) # (2) [1,2,3,4] => [2,8,24,64] # print(1 * 2 ** 1) # print(2 * 2 ** 2) # print(3 * 2 ** 3) # print(4 * 2 ** 4) # 1 << 1 # 2 << 2 # 3 << 3 # 4 << 4 lst = [1,2,3,4] lst_new = [] for i in lst: lst_new.append(i << i) print(lst_new) # map改寫 def func(n): print(1111) return n << n it = map(func,lst) print(list(it)) """ 只有在調(diào)用迭代器的時(shí)候,才會(huì)真正觸發(fā)map函數(shù)中的所有內(nèi)容;不調(diào)用不觸發(fā); 強(qiáng)轉(zhuǎn)迭代器時(shí),把可以調(diào)用的所有數(shù)據(jù)都放到列表中 第一次調(diào)用時(shí): 把1拿出來(lái),扔func當(dāng)中做處理,返回2, 第二次調(diào)用時(shí): 把2拿出來(lái),扔func當(dāng)中做處理,返回8, 第三次調(diào)用時(shí): 把3拿出來(lái),扔func當(dāng)中做處理,返回24, 第四次調(diào)用時(shí): 把4拿出來(lái),扔func當(dāng)中做處理,返回64, 到此列表[2,8,24,64] 注意點(diǎn):形參和返回值必須寫; """ # (3) 給你一個(gè)列表["a","b","c"] => [97,98,99] # 字典的鍵值翻轉(zhuǎn)操作 dic = {97:"a",98:"b",99:"c"} dic_new = {} for k,v in dic.items(): # print(k,v) # 97 a | 98 b | 99 c dic_new[v] = k # dic_new["a"] = 97 print(dic_new) lst = ["a","b","c"] lst_new = [] for i in lst: lst_new.append(dic_new[i]) print(lst_new) # map改寫 print("<========================>") lst = ["a","b","c"] lst = ["c","b","a"] lst = ("c","b","a") # func 實(shí)現(xiàn)字典的翻轉(zhuǎn),通過(guò)給與a,b,c三個(gè)鍵,得到對(duì)應(yīng)的ascii碼,通過(guò)list強(qiáng)轉(zhuǎn)得到列表 def func(n): print(n) dic = {97:"a",98:"b",99:"c"} dic_new = {} for k,v in dic.items(): dic_new[v] = k print(dic_new) # {'a': 97, 'b': 98, 'c': 99} return dic_new[n] it = map(func,lst) print(list(it))
# ### reduce """ reduce(func,iterable) 功能: 計(jì)算數(shù)據(jù) 把iterable中的前兩個(gè)數(shù)據(jù)扔到func函數(shù)中做計(jì)算,把計(jì)算的結(jié)果和iterable中第三個(gè)值在繼續(xù)扔到func中做計(jì)算 以此類推 ... 最后返回計(jì)算的結(jié)果 參數(shù): func: 自定義函數(shù) iterable : 可迭代對(duì)象 (容器類型數(shù)據(jù) range對(duì)象 迭代器) 返回值: 計(jì)算的結(jié)果 """ # (1) [7,7,5,8] => 7758 lst = [7,7,5,8] # 方法一 strvar = "" for i in lst: strvar += str(i) res = int(strvar) print(res , type(res)) # 方法二 """ 7 * 10 + 7 = 77 77 * 10 + 5 = 775 775 * 10 + 8 = 7758 """ # 1.先變成迭代器 it = iter(lst) # 2.取出兩個(gè)值 num1 = next(it) num2 = next(it) print(num1,num2) # 做計(jì)算 total = num1 * 10 + num2 print(total) # 77 # 3.把計(jì)算的結(jié)果在和剩下的數(shù)據(jù)做計(jì)算 for num in it: total = total * 10 + num # 4.返回最后的結(jié)果 print(total , type(total)) print("<==========>") # reduce改寫 '''從...functools模塊, 引入 .. reduce方法''' from functools import reduce lst = [7,7,5,8] def func(x,y): # print(x,y) return x * 10 + y res = reduce(func,lst) print(res) # 使用lambda 進(jìn)行改造 print(reduce(lambda x,y: x*10 + y,lst)) # (2) "123" => 123 不使用int的情況下實(shí)現(xiàn)該操作; strvar = "123" def func(x,y): return x * 10 + y # 把字符串"123" 處理成數(shù)字的123 def func2(n): # dic = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9} dic = {} for i in range(10): dic[str(i)] = i return dic[n] it = map(func2,strvar) # res = reduce(func,it) # print(res,type(res)) # 簡(jiǎn)寫 print(reduce(lambda x,y: x*10 + y,it))
# ### filter """ filter(func,iterable) 功能: 過(guò)濾數(shù)據(jù) 在自定義的函數(shù)中, 如果返回True, 該數(shù)據(jù)保留 如果返回False,該數(shù)據(jù)舍棄 參數(shù): func: 自定義函數(shù) iterable : 可迭代對(duì)象 (容器類型數(shù)據(jù) range對(duì)象 迭代器) 返回值: 迭代器 """ # 1.只要列表中所有的偶數(shù) lst = [1,2,34,5,65,6,56,7,56,756,7567,11] lst_new = [] for i in lst: if i % 2 == 0 : lst_new.append(i) print(lst_new) # filter改寫 def func(n): if n % 2 == 0: return True else: return False it = filter(func,lst) print(list(it)) # 使用lambda 改寫 it = filter(lambda n :True if n % 2 == 0 else False , lst) print(list(it)) print(list(filter(lambda n :True if n % 2 == 0 else False , lst)))
# ### sorted """ sorted(iterable,key=函數(shù),reverse=False) 功能:排序數(shù)據(jù) 參數(shù): iterable : 可迭代對(duì)象 (容器類型數(shù)據(jù) range對(duì)象 迭代器) key : 指定函數(shù)(自定義/內(nèi)置) reverse : 是否倒序 返回值: 列表 """ tup = (-90,89,78,3) # 1.從小到大 res = sorted(tup) print(res,type(res)) # 2.從大到小 res = sorted(tup,reverse = True) print(res,type(res)) # 3.按照絕對(duì)值進(jìn)行排序 tup = (-90,-100,1,2) res = sorted(tup,key=abs) print(res) """ 1 => abs(1) => 1 2 => abs(2) => 2 -90 => abs(-90) => 90 -100 => abs(-100) => 100 """ # 4.按照自定義函數(shù)進(jìn)行排序 tup = (19,23,42,87) """ 42 % 10 2 => 42 23 % 10 3 => 23 87 % 10 7 => 87 19 % 10 9 => 19 """ def func(n): print(n) return n % 10 lst = sorted(tup,key = func) print(lst) # 5.任意的容器類型數(shù)據(jù)都可以通過(guò)sorted排序 container = "abc" container = [1,2,3] container = (1,2,3) container = {"你好","王文","你真帥"} container = {"caixukun","xiaozhan","zhaoshenyang","wangyibo"} container = {"ww":"英俊帥氣","zxy":"猥瑣摳腳","zwl":"斯文敗類"} # 排的是字典的鍵 print(sorted(container)) """ # 總結(jié): sorted (推薦使用sorted) (1) 可以排序所有的容器類型數(shù)據(jù) (2) 返回一個(gè)新的列表 sort (1) 只能排序列表 (2) 基于原來(lái)的列表進(jìn)行排序 """
# 1.用map來(lái)處理字符串列表,把列表中所有人都變成 leader ,比方alex_leader name = ['oldboy', 'alex', 'wusir'] """ it = map(lambda n : n+"_leader",name) print(list(it)) """ # 2.用map來(lái)處理下述 listvar ,要求得到新列表,每個(gè)元素名字加后面加_leader listvar = [{'name':'alex'},{'name':'wusir'}] def func(n): # print(n) # n["name"] + "_leader" # 方法一 # return n["name"] + "_leader" # 方法二 n["name"] += "_leader" return n it = map(func,listvar) print(list(it)) # 3.用filter來(lái)處理,得到股票價(jià)格大于20的股票名字 shares={ 'IBM':36.6, 'Lenovo':23.2, 'oldboy':21.2, 'ocean':10.2, } # 方法一 def func(n): if shares[n] > 20: return True else: return False # 方法二 def func(n): if shares[n] > 20: return True # 方法三 def func(n): return shares[n] > 20 it = filter(func,shares) print(list(it)) # 方法四 print(list(filter(lambda n : shares[n] > 20,shares))) # 4.有下面字典: portfolio=[ {'name':'IBM','shares':100,'price':91.1}, {'name':'AAPL','shares':20,'price':54.0}, {'name':'FB','shares':200,'price':21.09}, {'name':'HPQ','shares':35,'price':31.75}, {'name':'YHOO','shares':45,'price':16.35}, {'name':'ACME','shares':75,'price':115.65} ] # a.獲取購(gòu)買每只股票的總價(jià)格(乘積),迭代器中[9110.0, 1080.0 ,......] def func(n): return n["shares"] * n["price"] it = map(func,portfolio) print(list(it)) # lambda print(list(map(lambda n : n["shares"] * n["price"] ,portfolio))) # b.用filter過(guò)濾出price大于100的股票。 def func(n): if n["price"] > 100: return True it = filter(func,portfolio) print(list(it)) # 方法二 print(list(filter(lambda n : n["price"] > 100 , portfolio ))) # 5.將listvar 按照列表中的每個(gè)字典的values大小進(jìn)行排序,形成一個(gè)新的列表。 listvar = [ {'sales_volumn': 0}, {'sales_volumn': 108}, {'sales_volumn': 337}, {'sales_volumn': 475}, {'sales_volumn': 396}, {'sales_volumn': 172}, {'sales_volumn': 9}, {'sales_volumn': 58}, {'sales_volumn': 272}, {'sales_volumn': 456}, {'sales_volumn': 440}, {'sales_volumn': 239} ] def func(n): return n["sales_volumn"] lst = sorted(listvar,key=func) print(lst) # 方法二 print(sorted(listvar,key=lambda n : n["sales_volumn"]))
“Python全棧迭代器和高階函數(shù)怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。