python迭代器生成器協程

2021-10-01 22:28:51 字數 4330 閱讀 4480

迭代器有兩個基本的方法: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 通過列表生成...