亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

深入了解Python iter() 方法的用法

系統 1522 0

今天我們來介紹下Python基礎教程學習之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]: 
            
              
In [6]: iter([1, 2, 3])
Out[6]: 
              
                
In [7]: iter(123)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)

                
                   in 
                  
                    ()
----> 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() 方法第一個參數的參數類型,根據有無第二個參數決定

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一道本一区二区三区 | 亚洲国产午夜精品理论片的软件 | 国内精品久久久久久影院老狼 | 亚洲成人黄色在线 | 亚洲精品久久片久久 | 国产精品19p | 色一区二区 | 一区二区高清视频 | 国产成人小视频在线观看 | 久久国产精品一国产精品金尊 | 男人的天堂免费视频 | 91热视频在线 | 日本不卡高清中文字幕免费 | 国产欧美综合在线一区二区三区 | 久久综合在线 | 精品国产一区二区三区成人 | 免费a一级毛片在线播放 | 二级毛片在线观看 | 成年女人色毛片免费看 | 亚洲a网| 国产成人福利夜色影视 | 国产精品自拍亚洲 | 深夜久久 | 亚洲欧美一区二区三区综合 | 永久久久免费浮力影院 | 国产l精品国产亚洲区久久 国产l精品国产亚洲区在线观看 | 亚洲在线视频免费观看 | 久久精品亚洲综合 | 久久国产精品伦理 | 久久伊人成人网 | 韩国三日本三级中文字幕 | 亚洲国产成人精品女人久久久 | 亚洲成人高清在线观看 | 激情九月天 | 高清欧美一区二区免费影视 | 国产日产亚洲精品 | 欧美日韩综合精品一区二区三区 | 亚洲欧美精品网站在线观看 | 天天射网站| 成人黄色网址 | 日韩在线一区视频 |