python函数知识四 迭代器、生成器
15.迭代器:工具
1.可迭代對象:
? 官方聲明,只要具有__iter__方法的就是可迭代對象
list,dict,str,set,tuple -- 可迭代對象,使用靈活
#方法一: list.__iter__() dict.__iter__()#方法二: 查看源代碼#方法三: print(dir(list)) #官方聲明,只要具有__iter__方法的就是可迭代對象2.迭代器:
官方聲明:只要具有__iter__方法__next__方法就是迭代器
f = open("",'w') f.__iter__() f.__next__()將可迭代對象,轉換成迭代器
lst = [1,2,3,4,6] new_lst = lst.__iter__()#將可迭代對象,轉換成迭代器new_lst.__iter__() new_lst.__next__() print(new_lst.__next__())#每次獲取一個值,第一次獲取第一個值,以后向后推#自己寫 for i in lst(): print(i) lst = [1,2,3,4,6] count = len(lst) new_lst = lst.__iter__() while count:print(new_lst.__next__())count -= 1#for的本質 lst = [1,2,3,4,6] new_lst = lst.__iter__() while 1:try:print(new_lst.__next__())except:break3.總結:
? 可迭代對象:
? 優點:使用靈活,可以直接查看值
? 缺點:占內存,不能迭代值
? 迭代器:
? 優點:節省內存,惰性機制
? 缺點:使用不靈活,操作較繁瑣,不能直接查看元素
迭代器的特性:
可迭代對象:具有__iter__()方法的
可迭代器:具有__iter__()方法和__next__()方法的
迭代器的使用時機:當容器中數據量較多的時候使用迭代器
16.生成器:
迭代器:python中內置的一中節省空間的工具
生成器的本質就是一個迭代器
生成器與迭代器的區別:
? 迭代器:python自帶
? 生成器:程序員寫的
寫一個生成器:
? 將函數中的return改寫成yield就是一個生成器,return和yield都是返回:
g = func()#產生一個生成器
? 生成器可以使用for循環取值
? yield from -- 將可迭代對象的元素逐個返回
? 在函數內部,yield能將for循環和while循環進行暫停
def func():print(123)yield "你好"print(321)yield "我好" print(func()) #結果:<generator object func at 0x000001913911F0A0> g = func() g.__inter__() print(g.__next__())#會記錄停留的位置 def func():if 3 > 2:yield "你好"if 4 > 2:yield "我好"yield "大家好" g = func() print(g.__next__()) print(g.__next__()) print(g.__next__()) ''' 結果: 你好 我好 大家好 '''#for 循環 for i in g:print(i)坑:會產生新的生成器
#每次都是新的生成器 print(foo().__next__()) print(foo().__next__()) #用賦值只產生一個生成器 g = foo() def foo():for i in range(10):passyield icount = 1while 1:yield countcount += 1 g = foo() #print(next(g)) = print(g.__next__()) --推薦使用next(g) print(next(g)) print(next(g)) print(next(g)) #next可以在while中停住 ''' 結果: 9 1 2 '''seed() -- 了解
#send()第一次只能傳None,用于激活,否則會報錯,以后可以傳各種數據 def func():a = yield "send激活"print(a)b = yield "send開始" g = func() print(g.send(None)) print(g.send(123))生成器應有場景:
#當有大量的數據時 def func():lst = []for i in range(1000000):lst.append(i)return lst print(func()) #生成器改進 def func():for i in range(1000000):yield i g = func() for i in range(50):print(next(g))yield from -- 將可迭代對象逐個返回
def func():list1 = ["牛羊配","老奶奶花生米","衛龍","蝦扯蛋","米老頭","老干媽"]yield from list1 #yield list1 會直接返回整個列表 g = func() print(next(g)) print(next(g)) ''' 結果: 牛羊配 老奶奶花生米 '''def func():list1 = ["牛羊配","老奶奶花生米","衛龍","蝦扯蛋","米老頭","老干媽"]lsit2 = ["小浣熊","老干爹","親嘴燒","麻辣燙","黃燜雞","井蓋"]yield from list1yield from list2 g = func() #將lsit1返回完,才會返回list2 print(next(g)) print(next(g)) print(next(g))轉載于:https://www.cnblogs.com/Onlywang/p/11218929.html
總結
以上是生活随笔為你收集整理的python函数知识四 迭代器、生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vSphere 计算vMotion的迁移
- 下一篇: python 面向对象之:反射,双下方法