首先講述一下如何判斷物件是否可迭代,使用的命令為:
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萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...