[英]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
。
你可以转换for
成while
环和使用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.