我几乎没有注意到在for循环中使用else的python程序.
我最近使用它在退出时根据循环变量条件执行操作; 因为它在范围内.
在for循环中使用else的pythonic方法是什么?有没有值得注意的用例?
而且,是的.我不喜欢使用break语句.我宁愿将循环条件设置为复杂的.如果我不喜欢使用break语句,我能从中获得任何好处吗?
值得注意的是,自语言开始以来,for循环有一个else,这是第一个版本.
有什么比PyPy更pythonic?
看一下我在ctypes_configure/configure.py第284行开始发现的内容:
for i in range(0, info['size'] - csize + 1, info['align']): if layout[i:i+csize] == [None] * csize: layout_addfield(layout, i, ctype, '_alignment') break else: raise AssertionError("unenforceable alignment %d" % ( info['align'],))
在这里,从pypy/annotation中的第425行/ annrpython.py(clicky)
if cell.is_constant(): return Constant(cell.const) else: for v in known_variables: if self.bindings[v] is cell: return v else: raise CannotSimplify
在pypy/annotation/binaryop.py中,从第751行开始:
def is_((pbc1, pbc2)): thistype = pairtype(SomePBC, SomePBC) s = super(thistype, pair(pbc1, pbc2)).is_() if not s.is_constant(): if not pbc1.can_be_None or not pbc2.can_be_None: for desc in pbc1.descriptions: if desc in pbc2.descriptions: break else: s.const = False # no common desc in the two sets return s
pypy/annotation/classdef.py中的非单行,从第176行开始:
def add_source_for_attribute(self, attr, source): """Adds information about a constant source for an attribute. """ for cdef in self.getmro(): if attr in cdef.attrs: # the Attribute() exists already for this class (or a parent) attrdef = cdef.attrs[attr] s_prev_value = attrdef.s_value attrdef.add_constant_source(self, source) # we should reflow from all the reader's position, # but as an optimization we try to see if the attribute # has really been generalized if attrdef.s_value != s_prev_value: attrdef.mutated(cdef) # reflow from all read positions return else: # remember the source in self.attr_sources sources = self.attr_sources.setdefault(attr, []) sources.append(source) # register the source in any Attribute found in subclasses, # to restore invariant (III) # NB. add_constant_source() may discover new subdefs but the # right thing will happen to them because self.attr_sources # was already updated if not source.instance_level: for subdef in self.getallsubdefs(): if attr in subdef.attrs: attrdef = subdef.attrs[attr] s_prev_value = attrdef.s_value attrdef.add_constant_source(self, source) if attrdef.s_value != s_prev_value: attrdef.mutated(subdef) # reflow from all read positions
稍后在同一个文件中,从第307行开始,这是一个带有启发性注释的示例:
def generalize_attr(self, attr, s_value=None): # if the attribute exists in a superclass, generalize there, # as imposed by invariant (I) for clsdef in self.getmro(): if attr in clsdef.attrs: clsdef._generalize_attr(attr, s_value) break else: self._generalize_attr(attr, s_value)
如果你有一个for循环,你真的没有任何条件声明.因此,如果您想中止,那么休息是您的选择,然后可以完美地处理您不满意的情况.
for fruit in basket: if fruit.kind in ['Orange', 'Apple']: fruit.eat() break else: print 'The basket contains no desirable fruit'