深入 Python iter() 方法
前面我們有介紹過關於序列、可迭代物件、迭代器、生成器的概念,其中有提到過,如果實現了 _iter_() 和 _next_() 就是生成器,同時驗證可迭代物件最好的方法是 iter(obj) 。
今天我們來介紹下 iter() 方法另外的用法。
據說很少有人知道這個用法
一、上程式碼、學用法
我們都比較熟悉 iter(obj),會返現一個迭代器,如果 obj 不是可迭代物件,則會報錯。但其實如果仔細看官方文件,會發現 iter() 方法其實是接受兩個引數的,文件說明如下
iter(object[, sentinel])
sentinel 英文翻譯為 哨兵。
sentinel 引數是可選的,當它存在時,object 不再傳入一個可迭代物件,而是一個可呼叫物件,通俗點說就是可以透過()呼叫的物件,而 sentinel 的作用就和它的翻譯一樣,是一個“哨兵”,當時可呼叫物件返回值為這個“哨兵”時,迴圈結束,且不會輸出這個“哨兵”。
可能有點難懂,用一個簡單需求來說明,需求說明如下:
心裡想一個[1, 10]範圍的數,然後程式碼開始隨機,當隨機到想的數時停止,看每次程式碼需要隨機幾次。
實現分析:看起來應該很簡單,random,然後加一個if判斷即可,但是用 iter() 來實現更簡單。實現程式碼如下:
from random import randint
def guess():
return randint(0, 10)
num = 1
# 這裡先寫死心裡想的數為5
for i in iter(guess, 5):
print("第%s次猜測,猜測數字為: %s" % (num, i))
num += 1
# 當 guess 返回的是 5 時,會丟擲異常 StopIteration,但 for 迴圈會處理異常,即會結束迴圈
二、還是看看文件吧
關於這兩個引數,文件裡也說的很詳細,分段解釋如下:
The first argument is interpreted very differently depending on the presence of the second argument.
翻譯:第一個引數根據第二個引數有不同的含義
Without a second argument, object must be a collection object which supports the iteration protocol (the _iter_() method), or it must support the sequence protocol (the _getitem_() method with integer arguments starting at 0). If it does not support either of those protocols, TypeError is raised.
翻譯:如果沒有第二個引數,object(即第一個引數)是一個支援迭代器協議(實現_iter_()方法的)的集合物件,或者是支援序列協議(實現_getitem_()方法)且是從0開始索引。如果它不支援其中任何一個,則丟擲 TypeError 異常
簡單來說就是,如果沒有第二個引數,就是我們比較熟悉的用法。程式碼示例如下:
In [5]: iter("123")
Out[5]: <str_iterator at 0x105c9b9e8>
In [6]: iter([1, 2, 3])
Out[6]: <list_iterator at 0x105f9f8d0>
In [7]: iter(123)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-c76acad08c3c> in <module>()
----> 1 iter(123)
TypeError: 'int' object is not iterable
再來看看有第二個引數的情況
If the second argument, sentinel, is given, then object must be a callable object. The iterator created in this case will call object with no arguments for each call to its _next_() method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value will be returned.
翻譯:如果給定了第二個引數 sentinel,object 則必須是一個可呼叫物件,這個可呼叫物件沒有任何引數,當可呼叫物件的返回值等於 sentinel 的值時,丟擲 StopIteration 的異常,否則返回當前值。(這裡如果不好理解可呼叫物件,可以理解為函式,這樣更容易想明白)
對於這個用法的適用場景,文件中也給出了說明:
One useful application of the second form of iter() is to build a block-reader. For example, reading fixed-width blocks from a binary database file until the end of file is reached:
翻譯:對於第二個引數,一個有用的場景是建立一個 blokc-reader,即根據條件中斷讀取。比如:從二進位制資料庫檔案讀取固定寬度的塊,直到到達檔案的末尾,程式碼示例如下:
from functools import partial
with open('mydata.db', 'rb') as f:
for block in iter(partial(f.read, 64), b''):
process_block(block)
三、小結一下
1、iter() 方法不管有沒有第二個引數,返回的都是迭代器
2、iter() 方法第一個引數的引數型別,根據有無第二個引數決定
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2524/viewspace-2823089/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python---之iterPython
- python--iter()+next()+sum()Python
- Rust中的iter(), into_iter(), iter_mut()Rust
- Python requests 庫中 iter_lines 方法的流式傳輸最佳化Python
- python如何使用__iter__()展現外部狀態Python
- Python中可迭代物件、迭代器以及iter()函式的兩個用法詳解Python物件函式
- www.80iter.com上線了
- 深入理解 Java 方法Java
- Python 高階技巧:深入解析讀取 Excel 檔案的多種方法PythonExcel
- Python MetaClass深入分析Python
- Python深入 Python的記憶體管理Python記憶體
- 80iter.com站內技術點分析
- Python深入06 Python的記憶體管理Python記憶體
- 80iter線上工具模組上線啦!
- 010 透過連結串列學習Rust之IterRust
- 010 通過連結串列學習Rust之IterRust
- Python深入分享之閉包Python
- Python深入05 裝飾器Python
- Python深入分享之裝飾器Python
- Python深入03 物件的屬性Python物件
- Python3 迭代器深入解析Python
- 深入理解python中的yieldPython
- 全面通透深入剖析工廠方法模式模式
- 深入瞭解 Java 方法和引數的使用方法Java
- 更深入的理解Python中的迭代Python
- 更深入的理解 Python 中的迭代Python
- Python深入分享之物件的屬性Python物件
- Python深入淺出property特性屬性Python
- 譯:深入淺出Python 描述符Python
- Python3 原始碼閱讀-深入瞭解Python GILPython原始碼
- Python title()方法Python
- Python 特殊方法Python
- Python endswith()方法Python
- java之深入理解List.subList()方法Java
- 深入解析JQuery中的isPlainObject()使用方法jQueryAIObject
- 深入理解python中的類和物件Python物件
- 深入理解Python的yield from語法Python
- 深入理解Python中的裝飾器Python