2014-09-23 73 views
0

我想做的事情在Python如下:如何获取Python中for循环的上限?

for index, value in enumerate(MyFunction()): 
    logger.debug('Processing step %d of %d' % (index, len(MyFunction()) 

但需要我,我不想每次迭代中调用MyFunction的()。所以我当然可以做

mylist = MyFunction() 
for index, value in enumerate(mylist): 
    logger.debug('Processing step %d of %d' % (index, len(mylist))) 

但这需要一个不必要的变量。有没有更优雅的方式来引用for循环内的循环索引的最大值?

+2

我看不出有什么毛病了第二种方法。您想要创建一个对象,然后可以重新使用并为其指定一个方便的名称。这正是变量的目的。如果有的话我会创建一个更多的变量来保持'mylist'的长度,这样你就不必每次迭代都调用'len'。 – 2014-09-23 20:15:13

+1

@RogerFan为长度创建另一个变量似乎过多。即使它具有性能优势,它也是一种微型优化,并且在大多数情况下不会回报额外变量的成本(更多的代码,更多的是让读者记住,错误的可能性非常小在额外的代码等)。 – delnan 2014-09-23 20:19:35

+0

@delnan当然这是一件小事和个人喜好,但我发现'total_steps'比'len(mylist)'更容易阅读。它更直接地传达意义,这使得生成的代码更易于理解。后者似乎意味着'len(mylist)'可能在每次调用时都有所改变,而前者表示在迭代中它是一个常量值。 – 2014-09-23 20:23:16

回答

2

否。一般来说,可能没有最大指数,因为您可以做for x in some_infinite_iterator()

+0

啊,谢谢。我认为迭代的次数在进入循环时是固定的 - 并非如此。 – markjan 2014-09-23 20:17:11

+0

@markjan:只有在迭代固定长度序列时才会修复。 (即使那样,你仍然可以早早出发。) – BrenBarn 2014-09-23 20:24:19

4

知道上限的唯一方法是首先获取由MyFunction()返回的序列的长度。

你的榜样开始,你可以移动len()功能外循环的效率:

mylist = MyFunction() 
mylen = len(mylist) 
for index, value in enumerate(mylist): 
    logger.debug('Processing step %d of %d' % (index, mylen)))