簡體   English   中英

就地鏈接迭代器

[英]Chaining Iterators inplace

有沒有辦法在迭代時擴展迭代器。

我想遍歷請求,以防萬一超時,我想拆分請求並將其添加到運行循環中。

像這樣:

l = [1, 2, 3, 4, 5]
it = iter(l)
for e in it:
  try: 
    request(e)
  except Exception:
    it.append(split_request(e))

但是append不起作用, itertools.chain返回一個新的迭代器,而不是就地更改迭代器。

您需要一個while循環。 在其中,遍歷列表並累積失敗條目的列表。 當該列表為空時, while循環可以終止。 就像是:

while l:
    failures = []
    for e in l:
        try:
            request(e)
        except Exception:
            failures.append(split_request(e))
    l = failures

應該這樣做。

您只需要一個while循環並處理索引和自己迭代

l = [1, 2, 3, 4, 5]
i = 0
while i < len(l):
  try: 
    request(l[i])
    i += 1
  except Exception:
    l[i] = split_request(l[i])

下面的代碼兩次嘗試每個列表兩次,並輸出一個字典,該字典的值導致錯誤和嘗試次數。 如果len(errors)太大,則可能使errors成為列表,並停止追加。

import itertools
l = [-2, -1, 0, 1, 'a', 2]
it = iter(l)
errors = {}
for e in itertools.chain(it, errors):
    try:
        print('e =', e, ' 1/e = ', end=' ')
        print(1/e)                              <---- May Fail 
    except Exception:
        errors[e] = errors.get(e, 0) + 1
        print('Error')

print('errors', errors)

O / P

e = -2  1/e =  -0.5
e = -1  1/e =  -1.0
e = 0  1/e =  Error
e = 1  1/e =  1.0
e = a  1/e =  Error
e = 2  1/e =  0.5
e = 0  1/e =  Error
e = a  1/e =  Error
>>> print('errors', errors)
errors {0: 2, 'a': 2}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM