迭代器有兩個基本的方法:iter()和next()
把乙個類作為乙個迭代器使用需要在類中實現兩個方法iter() 與next()
stopiteration 異常用於標識迭代的完成
class
mylist
(object):
def__init__
(self)
: self.items =
def__iter__
(self)
:iter
= mylistiterator(self.items)
return
iter
defadditem
(self,item)
:class
mylistiterator
(object):
'''自定義迭代器類'''
def__init__
(self, items)
: self.items = items
self.currentindex =
0def
__iter__
(self, mylist)
:pass
def__next__
(self)
:'''判斷當前下標是否越界 '''
if self.currentindex <
len(self.items)
: data = self.items[self.currentindex]
# 根據下標獲取下標對應的元素值
self.currentindex +=
1#下標位置加1
return data #返回下標對應的資料
else
:raise stopiteration #主動丟擲異常 停止迭代
if __name__ ==
"__main__"
: mylist = mylist(
) mylist.additem(
"zhangsan"
) mylist.additem(
"lisi"
) mylist.additem(
"wanger"
)for value in mylist:
print
(value)
斐波那契數列迭代器
class
fibonacci
(object):
'''自定義迭代器類'''
def__init__
(self, num)
: self.num = num
self.currentindex =
0 self.a =
1 self.b =
1def
__iter__
(self)
:return self
def__next__
(self)
:'''判斷當前下標是否越界 '''
if self.currentindex < self.num:
data = self.a
self.a, self.b = self.b, self.a + self.b
self.currentindex +=
1#下標位置加1
return data #返回下標對應的資料
else
:raise stopiteration #主動丟擲異常 停止迭代
if __name__ ==
"__main__"
: f = fibonacci(6)
for value in f:
print
(value)
生成器是一種特殊的迭代器
生成器建立方式
send的作用
生成器中能使用return,目的是在特殊條件下結束生成器,但是會產生異常
def
fibonacci
(n):
a =1 b =
1 currentindex =
0while currentindex < n:
data = a
a, b = b, a + b
currentindex +=
1 *** =
yield data
if *** ==1:
return
"ha i am return!"
if __name__ ==
"__main__"
: fib = fibonacci(6)
print
(next
(fib)
)try
: value = fib.send(1)
print
(value)
print
(next
(fib)
)except exception as e:
print
(e)
協程就是可以暫停執行的函式
協程存在的意義:對於多執行緒應用,cpu通過切片的方式來切換執行緒間的執行,執行緒切換時,需要耗時來儲存狀態,便於下次繼續執行。協程則只使用乙個執行緒,在單執行緒中規定某個**塊執行順序。
協程適合場景:大量不需要cpu的操作時
import time
defwork1()
:while
true
:print
("i am work1..."
)yield
time.sleep(
0.5)
defwork2()
:while
true
:print
("i am work2------"
)yield
time.sleep(
0.5)
if __name__ ==
"__main__"
: w1 = work1(
) w2 = work2(
)while
true
:next
(w1)
next
(w2)
程序是資源分配的基本單位 執行緒是cpu排程的基本單位 協程單執行緒執行多工
切換開銷程度: 程序 > 執行緒 > 協程
高效率方式:程序+協程
import gevent
from gevent import monkey
monkey.patch_all(
)import urllib.request
defdownloadimage
(url, filename)
:try
: r = urllib.request.urlopen(url)
with
open
(filename,
"wb"
)as f:
while
true
: file_data = r.read(
1024
)if file_data:
f.write(file_data)
else
:break
except exception as e:
print
(%filename)
else
:print
(%filename)
defmain()
: url1 =
""url2 =
""url3 =
"" gevent.joinall(
[# 為了等待主程式執行完
gevent.spawn(downloadimage, url1,
"1.gif"),
gevent.spawn(downloadimage, url2,
"2.gif"),
gevent.spawn(downloadimage, url3,
"3.gif")]
)print
("finished..."
)if __name__ ==
"__main__"
: main(
)
資料 迭代器 生成器 協程
依賴下標迴圈的方法 l a b c d e i 0 while i print l i i 1 for迴圈形式迭代 for i in range len l print l i 只要物件本身有 iter 方法,那它就是可迭代的,只要執行這個方法,它的返回值就是迭代器,這個返回值就有個 next 方法...
Python 生成器,協程
生成器可以簡單有效的建立龐大的可迭代物件,而不需要在直接在記憶體中建立儲存整個序列 可以使用生成器推導式或者生成器函式來建立生成器 生成器函式返回資料時使用yield語句,而不是使用return def countdown n print counting down from d n while n...
python學習筆記 生成器,迭代器,協程定義
知識點 生成器就是通過封裝的演算法進行邊迴圈邊計算的機制,通過next 方法可以每次取乙個計算的值,也就是yield b 這個b是多少 x next generator 這個x就是取到的b x yield,那麼x 就是用於接收外部發來的值 generator.send 5 那麼x就是5 通過列表生成...