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

歡迎訪問 生活随笔!

生活随笔

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

python

《Python Cookbook 3rd》笔记(4.6):带有外部状态的生成器函数

發布時間:2023/12/13 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Python Cookbook 3rd》笔记(4.6):带有外部状态的生成器函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

帶有外部狀態的生成器函數

問題

你想定義一個生成器函數,但是它會調用某個你想暴露給用戶使用的外部狀態值。

解法

如果你想讓你的生成器暴露外部狀態給用戶,別忘了你可以簡單的將它實現為一個類,然后把生成器函數放到 iter () 方法中過去。比如:

from collections import dequeclass linehistory:def __init__(self, lines, histlen=3):self.lines = linesself.history = deque(maxlen=histlen)def __iter__(self):for lineno, line in enumerate(self.lines, 1):self.history.append((lineno, line))yield linedef clear(self):self.history.clear()

為了使用這個類,你可以將它當做是一個普通的生成器函數。然而,由于可以創建一個實例對象,于是你可以訪問內部屬性值,比如 history 屬性或者是 clear() 方法。代碼示例如下:

with open('somefile.txt') as f:lines = linehistory(f)for line in lines:if 'python' in line:for lineno, hline in lines.history:print('{}:{}'.format(lineno, hline), end='')

討論

關于生成器,很容易掉進函數無所不能的陷阱。如果生成器函數需要跟你的程序其他部分打交道的話 (比如暴露屬性值,允許通過方法調用來控制等等),可能會導致你的代碼異常的復雜。如果是這種情況的話,可以考慮使用上面介紹的定義類的方式。在__iter__() 方法中定義你的生成器不會改變你任何的算法邏輯。由于它是類的一部分,所以允許你定義各種屬性和方法來供用戶使用。

一個需要注意的小地方是,如果你在迭代操作時不使用 for 循環語句,那么你得先調用 iter() 函數。比如:

>>> f = open('somefile.txt') >>> lines = linehistory(f) >>> next(lines) Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: 'linehistory' object is not an iterator>>> # Call iter() first, then start iterating >>> it = iter(lines) >>> next(it) 'hello world\n' >>> next(it) 'this is a test\n' >>>

總結

以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(4.6):带有外部状态的生成器函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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