"For"循环第一次迭代

Rin*_*nce 65 python iteration algorithm

问候pyc-sires和py-ladies,我想询问是否有一种优雅的pythonic方式在第一次循环迭代中执行某些功能.我能想到的唯一可能性是:

first = True
for member in something.get():
    if first:
        root.copy(member)
        first = False
    else:
        somewhereElse.copy(member)
    foo(member)
Run Code Online (Sandbox Code Playgroud)

Dan*_*uce 61

这样的事情应该有效.

for i, member in enumerate(something.get()):
    if i == 0:
         # Do thing
    # Code for everything
Run Code Online (Sandbox Code Playgroud)

但是,我强烈建议考虑一下你的代码,看看你是否真的必须这样做,因为它有点"脏".最好是先获取需要特殊处理的元素,然后对循环中的所有其他元素进行常规处理.

我不能这样做的唯一原因就是你要从生成器表达式中获取一个大的列表(你不想在前面获取,因为它不适合在内存中),或者类似的情况.


S.L*_*ott 40

Head-Tail设计模式有多种选择.

seq= something.get()
root.copy( seq[0] )
foo( seq[0] )
for member in seq[1:]:
    somewhereElse.copy(member)
    foo( member )
Run Code Online (Sandbox Code Playgroud)

或这个

seq_iter= iter( something.get() )
head = seq_iter.next()
root.copy( head )
foo( head )
for member in seq_iter:
    somewhereElse.copy( member )
    foo( member )
Run Code Online (Sandbox Code Playgroud)

人们抱怨说这不是"干",因为"冗余的foo(成员)"代码.这是一个荒谬的说法.如果这是真的那么所有函数只能使用一次.如果你只能有一个参考,那么定义一个函数有什么意义呢?

  • 从技术上讲,它不是DRY,因为你正在复制你在两个地方处理任何成员的语义,但由于代码太短而且非常接近,我认为这一点没有实际意义.但是,如果两者之间有更多的代码,或者两者被抽象为单独的函数,那么我理所当然地指出它违反了DRY原则. (4认同)

dum*_*mmy 11

怎么样:

my_array = something.get()
for member in my_array:
    if my_array.index(member) == 0:
        root.copy(member)
    else:
        somewhereElse.copy(member)
    foo(member)
Run Code Online (Sandbox Code Playgroud)

或者可能:

for index, member in enumerate(something.get()):
    if index == 0:
        root.copy(member)
    else:
        somewhereElse.copy(member)
    foo(member)
Run Code Online (Sandbox Code Playgroud)

索引方法的文档.


for*_*ran 6

我觉得这很优雅,但也许它太复杂了......

from itertools import chain, repeat, izip
for place, member in izip(chain([root], repeat(somewhereElse)), something.get()):
    place.copy(member)
    foo(member)
Run Code Online (Sandbox Code Playgroud)


bal*_*pha 5

这有效:

for number, member in enumerate(something.get()):
    if not number:
        root.copy(member)
    else:
        somewhereElse.copy(member)
    foo(member)
Run Code Online (Sandbox Code Playgroud)

不过,在大多数情况下,我建议只是迭代whatever[1:]并在循环外进行根操作;通常更具可读性。当然,这取决于您的用例。

  • 然后将其设置为 number == 0,如果这看起来更清楚的话。0 是唯一评估为 False 的数字。 (2认同)

jsb*_*eno 5

在这里,我可以带一个看起来很“漂亮”的Python惯用法。虽然,很可能我会使用您在提出问题时建议的形式,只是为了使代码保持更明显(尽管不太优雅)。

def copy_iter():
    yield root.copy
    while True:
        yield somewhereElse.copy

for member, copy in zip(something.get(), copy_iter()):
    copy(member)
    foo(member)
Run Code Online (Sandbox Code Playgroud)

(对不起-我在编辑之前发布的第一个表格不起作用,我忘记了实际上为'copy'对象获得了迭代器)