我不明白我的 for 循环中 break 语句的行为

问题描述 投票:0回答:2

我正在编写一个 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 代码的执行方式完全相同。

python for-loop break
2个回答
0
投票

break 语句只是退出循环。这是一个按预期中断工作的简单示例。

for i in range(0, 4):
    if i == 2:
        break
    else:
        print(i)
print(f"Loop ended with i = {i}")

输出:


0
投票

这不是语言造成的,而是你的数据排序造成的

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,循环就会完全结束

仔细查看您的数据。我敢打赌,您会在表格的上部中找到带有

的值
  • 年 >2000
  • 但没有“Max”、“M”和“CA”的满屋

您的 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 搜索条件可能是输入中的任何位置)。

然而,与您因对搜索的工作方式不自信而避免的头痛相比,搜索时间的大约翻倍是微不足道的。

© www.soinside.com 2019 - 2024. All rights reserved.