簡體   English   中英

使用這些“內置”條件進行for循環的pythonic方法是什么?

[英]What is the pythonic way of doing a for loop with these conditions “built in”?

在類方法中,我有以下內容:

if self.zot == 1:
        for foo in self.bar:
            if self.zot != 1:
                break
            #code that may or may not change self.zot

bar是一個我絕對不希望訪問和填充的屬性,除非絕對必要,所以如果zot不是1,我仍然希望阻止第一次迭代。

Python是python我想還是有一種更干凈的方法可以做到這一點。

類似於以下內容?

for foo in self.bar while self.zot == 1:

與python 2.7.x兼容的答案的加分點

編輯:無論zot的迭代期間被修改是部分獨立的bar的內容,以便takewhile是不切實際的。 如果zot不是1,則不需要首先訪問任一方式的bar

你可以轉換forwhile環和使用iter()next() ,雖然不是很符合Python和需要使用try except

iterator = None
while self.zot == 1:
    iterator = iterator or iter(self.bar)
    try:
        current = iterator.next()
        #your code
    except StopIteration:
        break

僅當您第一次進入while時,它將開始使用self.bar

您可以創建一個代理功能來委托檢查。

def check_and_iterate(iterable, predicate):
    i = None
    while predicate():
        i = i or iter(iterable)
        yield i.next()

for foo in check_and_iterate(self.bar, lambda: self.zot == 1):
    #your code

編輯:正如@ user2357112所指出的,無論如何self.bar訪問self.bar 您可以使用另一個lambda來推遲它:

def check_and_iterate(getter, predicate):
    i = None
    while predicate():
        i = i or iter(getter())
        yield i.next()

for foo in check_and_iterate(lambda: self.bar, lambda: self.zot == 1):
    #your code

這樣的事情,用屬性bar處理zot檢查

@property
def bar(self):
    itr = iter(self._bar)
    while self.zot == 1:
        yield next(itr)

暫無
暫無

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

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