我正在编写一个 Python 练习任务并且想知道我的代码的行为。我是一名 C 和 C++ 程序员,完全迷失在这里。有人能告诉我为什么 Python 在这里做它做的事吗?
此代码读取以美国各州和计数为单位的名字组织表,以及孩子以它命名的频率。它基本上是来自美国的 Name 统计数据。以下代码执行正确:
with open("../data/names.csv") as file:
file.readline() #removes table header
counter = 0
splitLine = {}
for year in file:
splitLine = year.strip().split(',')
if int(splitLine[2]) < 1950:
continue
if splitLine[1] != "Max":
continue
if splitLine[3] != "M":
continue
if splitLine[4] != "CA":
continue
if int(splitLine[2]) > 2000:
break;
counter += int(splitLine[5])
print(splitLine)
print(counter)
此代码产生以下输出(我缩短了输出):
(...)
['663639', 'Max', '1998', 'M', 'CA', '285']
['666069', 'Max', '1999', 'M', 'CA', '296']
['668521', '最大', '2000', 'M', 'CA', '341']
6385
然后我尝试清理我的代码并移动带有中断的 if 语句,向上:
with open("../data/names.csv") as file:
file.readline() #removes table header
counter = 0
splitLine = {}
for year in file:
splitLine = year.strip().split(',')
if int(splitLine[2]) < 1950:
continue
if int(splitLine[2]) > 2000:
break;
if splitLine[1] != "Max":
continue
if splitLine[3] != "M":
continue
if splitLine[4] != "CA":
continue
counter += int(splitLine[5])
print(splitLine)
print(counter)
此代码产生以下输出:
0
在这种情况下,for-loot 似乎执行相同的迭代,但没有到达 increment- 和 print- 语句。为什么是这样?在这两种情况下,C 代码的执行方式完全相同。
if int(splitLine[2]) < 1950:
continue
if int(splitLine[2]) > 2000:
break;
if splitLine[1] != "Max":
continue
if splitLine[3] != "M":
continue
if splitLine[4] != "CA":
continue
一旦它看到数据>2000,循环就会完全结束。
仔细查看您的数据。我敢打赌,您会在表格的上部中找到带有
的值您的 first 程序将 not 在这些行上终止,因为它们没有 Max/M/CA 的满屋(因此这些行将导致
continue
发生)。
您的 second 程序将首先测试这一年,并且一旦遇到其中一条线就会终止。
那正是因为你看到的问题:你创建了一个过滤系统难以推理。
这样写你的测试会更好:
if (
int(splitLine[2]) >= 1950 and
int(splitLine[2]) <= 2000 and
splitLine[1] == "Max" and
splitLine[3] == "M" and
splitLine[4] == "CA"
):
counter += int(splitLine[5])
print(splitLine)
1950<=splitLine[2]<=2000
因为您不会在到达 Max/M/CA 的 2000 年时立即终止循环,所以您将搜索输入的whole而不是(平均)输入的half(假设您的 Max/M/CA 搜索条件可能是输入中的任何位置)。
然而,与您因对搜索的工作方式不自信而避免的头痛相比,搜索时间的大约翻倍是微不足道的。