迭代器與生成器

2021-08-25 08:52:10 字數 2680 閱讀 8318

首先講述一下如何判斷物件是否可迭代,使用的命令為:

from collections import iterable

print(isinstance(123,iterable))

如果123是可迭代資料,則輸出ture,如果不是,則輸出false。

#建立乙個自己的列表

class

mylist(object):

'''只進行追加操作'

''def

__init__(self):

self.iter=

defadd(self,par):

def__iter__(self):

myiter=myiter(self.iter)

return myiter

class

myiter(object:)

#迭代器的實現

def__init__(self,mylist)

self.mylist=mylist

self.current_index=0

def__next__(self):

ifself.current_indexself.mylist):

self.current_index+=1

return

self.mylist[self.current_index-1]

else:

raise stopiteration

#丟擲錯誤,停止迭代

def__iter__(self):

return

self

生成器是特殊的迭代器

迭代器需要手動記錄迭代位置

生成器使用yield

1、程式遇到yield,會暫停,如果yield後面有值,返回結果之後再暫停

2、再次啟動生成器,**從yield之後開始執行

#生成斐波那契數列

deffei

(num):

a = 0

b = 1

current_index = 0

print('11111111111')

while current_index < num:

a,b = b,a+b

current_index += 1

yield a,b

# yield b

print('222222222222')

每一次啟動next都會再yield暫停,再yield暫停後,再次啟動next會在yield啟動。

# 多工:多程序——————多執行緒————————協程  包含關係

import time

defwork1

():for i in range(100):

print('work1',i)

yield

time.sleep(0.1)

#模擬耗時操作

defwork2

():for i in range(100):

print('work2',i)

yield

time.sleep(0.1)

#模擬耗時操作

w1 = work1()

w2 = work2()

while

true:

next(w1)

next(w2)

from greenlet import greenlet

import time

defwork1

():for i in range(5):

print('work1',i)

time.sleep(0.1)

#模擬耗時操作

g2.switch()

# 處於耗時操作時,手動切換其他協程工作

defwork2

():for i in range(5):

print('work2',i)

time.sleep(0.1)

#模擬耗時操作

g1.switch()

# 建立協程

g1 = greenlet(work1)

g2 = greenlet(work2)

# 啟動協程

g1.switch()

g2.switch()

import gevent

import time

from gevent import monkey

monkey.patch_all()

# 給所有的耗時操作打上補丁,協程自動切換

defwork1

():for i in range(5):

print('work1',i)

time.sleep(0.1)

defwork2

():for i in range(5):

print('work2',i)

time.sleep(0.1)

g1 = gevent.spawn(work1)

g2 = gevent.spawn(work2)

# time.sleep(100)

g1.join()

g2.join()

# 等待協程操作完成

迭代器與生成器

可迭代物件 可以直接作用於for迴圈的物件 統稱為可迭代物件 返回迭代器的物件 即iterable。一是集合資料型別,如list tuple dict set str等 二是generator,包括生成器和帶yield的generator function。容器 簡單來說 容器是一系列元素的集合 容...

生成器與迭代器

迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...

生成器與迭代器

通過列表推導式,可以直接建立乙個列表,但是收到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...