日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python函数知识四 迭代器、生成器

發布時間:2024/8/26 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:break
3.總結:

? 可迭代對象:

? 優點:使用靈活,可以直接查看值

? 缺點:占內存,不能迭代值

? 迭代器:

? 優點:節省內存,惰性機制

? 缺點:使用不靈活,操作較繁瑣,不能直接查看元素

迭代器的特性:

  • 一次性的(用完就沒有了)
  • 不能后退
  • 惰性機制(節省內存)
  • 可迭代對象:具有__iter__()方法的

    可迭代器:具有__iter__()方法和__next__()方法的

    迭代器的使用時機:當容器中數據量較多的時候使用迭代器

    16.生成器:

    迭代器:python中內置的一中節省空間的工具

    生成器的本質就是一個迭代器

    生成器與迭代器的區別:

    ? 迭代器:python自帶

    ? 生成器:程序員寫的

    寫一個生成器:

    ? 將函數中的return改寫成yield就是一個生成器,return和yield都是返回:

  • return和yield都是返回
  • return和yield都可以寫多次
  • return只執行一次,yield可執行多次
  • 一個next對應一個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函数知识四 迭代器、生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。