Python If vs. While?

dar*_*dog 2 python if-statement while-loop

我有一个小文件读取例程,我只想要我有它的前200条记录,但是我一直无法弄清楚使用"while"构造有什么问题.此代码有效:

import csv, sys, zipfile
sys.argv[0] = "/home/tom/Documents/REdata/AllListing1RES.zip"
zip_file    = zipfile.ZipFile(sys.argv[0])
items_file  = zip_file.open('AllListing1RES.txt', 'rU')
rows = []
for row_index, row in enumerate(csv.DictReader(items_file, dialect='excel', delimiter='\t')):
    if (row_index < 200):
        rows.append(row)
    else : break
Run Code Online (Sandbox Code Playgroud)

这段代码一直运行,直到它失败并出现内存不足的情况我认为它是等效的?

import csv, sys, zipfile
sys.argv[0] = "/home/tom/Documents/REdata/AllListing1RES.zip"
zip_file    = zipfile.ZipFile(sys.argv[0])
items_file  = zip_file.open('AllListing1RES.txt', 'rU')
rows = []
for row_index, row in enumerate(csv.DictReader(items_file, dialect='excel', delimiter='\t')):
    while (row_index < 200):
        rows.append(row)
    else : break
Run Code Online (Sandbox Code Playgroud)

那么什么是正确的构造使用时? -

Mik*_*wis 6

它们不是等价的,因为在你的while循环中,它具有的条件row_index < 200,永远不会是假的,因为row_index当你在循环中时永远不会改变.

这就是为什么你得到一个条件的内存,因为你可能遇到了无限循环.

你基本上是这样说的:

Psuedo代码:

stay in block one as long as row_index < 200:

block_one:
   rows.append(row)
   goto block_one
Run Code Online (Sandbox Code Playgroud)

你可以看到row_index永远不会改变,因此你将永远在block_one中.

而if语句具有以下伪代码:

if row_index < 200 goto block_one otherwise break:

  block_one:
    rows.append(row)
Run Code Online (Sandbox Code Playgroud)

你可以看到它block_one不会回归自身,就像你在while循环中看到的那样.