2016-03-02 101 views
0

名單上使用ITER我希望能夠做到這一點:具有缺省值

foo = ['a', 'b'] 
bar = iter(foo, "default") 
val = next(bar) 
while val !== "default": 
    print(val) 
    val = next(bar) 

但是,在創建ITER對象時不會因爲第二個參數的工作。我從文檔中看到,這改變了第一個值的使用方式:

返回一個迭代器對象。根據第二個參數的存在,第一個參數被解釋得非常不同。沒有第二個參數,對象必須是支持迭代協議(__iter__() method)的集合對象,或者它必須支持序列協議(整數參數從0開始的__getitem__() method)。如果它不支持這兩種協議,則會引發TypeError。如果給出了第二個參數sentinel,那麼object必須是可調用的對象。在這種情況下創建的迭代器將爲每個對__next__() method的調用調用沒有參數的對象;如果返回的值等於sentinel,則會觸發StopIteration,否則將返回該值。

但我沒有看到一個Python的方式做我想做的,而不訴諸try/catch(又名本)

bar = iter(foo) 
try: 
    while True: 
     print(next(bar)) 
except StopIteration: 
    pass 
+4

那麼,爲什麼你不使用'for'循環呢? – Kupiakos

+0

因爲下一次代碼流需要跳過N次迭代。我不想訪問每個元素(但在循環體中確定跳過哪些元素和多少元素) – AnilRedshift

回答

3

的Python的方式通常會是使用一個for循環:

for val in foo: 
    print(val) 

,或者如果不工作,放在next調用的缺省值,而不是將其連接到迭代器本身的:

bar = iter(foo) 
val = next(bar, "default") 

如果你真的想這樣做的迭代器,你可以使用itertools.chain到鏈中的迭代器與定點值的無限序列:

from itertools import chain, repeat 
bar = chain(foo, repeat("default")) 

跳過元素中一個for循環,你可能:

bar = iter(foo) 
for val in bar: 
    if_some_condition(): 
     next(bar) # skips over the next iteration of the loop 
+0

因此,我不使用普通循環的原因是我需要跳過元素,由函數的主體決定。不想使用異常的原因是這是在代碼中的一個(實際測量的)熱循環中,所以我一直在尋找一種非異常的方式。 – AnilRedshift

+2

@AnilRedshift:您可以跳過for循環中的元素。如果循環遍歷一個迭代器,明確指出循環體內的迭代器將導致循環跳過顯式next調用返回的元素。 – user2357112

+0

你能舉個例子嗎?我接下來要做什麼? – AnilRedshift