溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python全棧迭代器和高階函數(shù)怎么使用

發(fā)布時(shí)間:2021-12-02 09:34:02 來(lái)源:億速云 閱讀:100 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“Python全棧迭代器和高階函數(shù)怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1. lambda表達(dá)式

# ### 匿名函數(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)  )

2. locals和globals

# ### 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)

3. 迭代器

# ### 迭代器
"""
迭代器:
	能被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)的

4. map高階函數(shù)

# ### 高階函數(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))

5. reduce高階函數(shù)

# ### 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))

6. filter高階函數(shù)

# ### 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)))

7. sorted高階函數(shù)

# ### 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)行排序
"""

8. 小練習(xí)

# 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í)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI