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(成员)"代码.这是一个荒谬的说法.如果这是真的那么所有函数只能使用一次.如果你只能有一个参考,那么定义一个函数有什么意义呢?
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)
索引方法的文档.
我觉得这很优雅,但也许它太复杂了......
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)
这有效:
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:]
并在循环外进行根操作;通常更具可读性。当然,这取决于您的用例。
在这里,我可以带一个看起来很“漂亮”的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'对象获得了迭代器)