在循环的条件语句中调用len()是否可以?

Dor*_*ord 6 python arrays list

在C中,像这样调用strlen被认为是不好的做法:

for ( i = 0; strlen ( str ) != foo; i++ )
{
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

当然,原因在于它效率低,因为它会多次"计算"字符串中的字符.

但是,在Python中,我经常看到这样的代码:

for i in range ( 0, len ( list ) ):
    # stuff
Run Code Online (Sandbox Code Playgroud)

这是不好的做法吗?我应该将len()的结果存储在变量中并使用它吗?

huo*_*uon 11

在Python中,for循环遍历类似列表的对象,它没有每次都检查的条件语句.为了说明,以下两个循环在功能上是等效的; 该while环路的直接翻译for (i=0; i< n; i++) { ... },而for循环是这样做的Python的方式:

i = 0
while i < n:
   # do some actions using i
   i += 1

for i in range(n):
   # do some actions using i
Run Code Online (Sandbox Code Playgroud)

for循环,range(n)在循环开始前评估,然后它的返回值是在循环使用.换句话说,range(n)评估一次(并且只评估一次)以获取i应该采用的值的列表*.

因此,在给定的具体示例中,Python看到for i in range(0, len(list)),评估range(0, len(list))(因此len被调用一次)并存储输出(它不再调用range(或len)).

(Python 3.x range中的*实际上并不返回列表,但在for循环中使用它时,功能上没有区别)


Tay*_*mon 5

for i in range(len(whatever))Python的写作风格很差。正如其他人提到的,可以通过直接迭代for element in whatever。但是,人们仍然继续这样做有两个原因:

  1. 他们是C程序员,还没有直接开发迭代。

  2. 他们想在遍历列表时修改列表,否则需要索引。如果是这样的情况下,Python的方式做到这一点是enumerate功能:for i, element in enumerate(whatever)