检查列表中的值是否为。在循环内部或外部返回?

时间:2017-09-24 14:46:45

标签: python

我是Python编程的新手。我想对输出背后的原因提供一些指导。我刚刚在网上做了一些练习,遇到了一个我无法理解的问题。代码如下:

def dataset(data,n):    
    for value in data:
        if n == value:
            return True
        else:
            return False

print(dataset([1,5,8,3], 3))
print(dataset([1,5,8,3],-1))

输出为False, False,这是错误的答案。

经过一些修补,我发现了问题。正确的代码如下:

def dataset(data,n):
    for value in data:
        if n == value:
            return True

    return False

print(dataset([1,5,8,3], 3))
print(dataset([1,5,8,3],-1))

输出为True, False,这是正确的答案。

所以我的问题是为什么不同的输出只有不同的return Falseelse: return False

5 个答案:

答案 0 :(得分:2)

您的第一个答案在第一个项目之后停止,每个项目运行false分支,而第二个答案仅在尝试所有项目后运行false分支。

如果您将最终代码更改为:

('checking', [1, 5, 8, 3], 3)
('trying', 1)
('trying', 5)
('trying', 8)
('trying', 3)
Found
True
('checking', [1, 5, 8, 3], -1)
('trying', 1)
('trying', 5)
('trying', 8)
('trying', 3)
Giving up
False

你可以看到它尝试每个项目,因为它输出:

def dataset(data,n):
    print("checking", data, n)
    for value in data:
        print("trying", value)
        if n == value:
            print("Found")
            return True
        else:
            print("Giving up")
            return False

print(dataset([1,5,8,3], 3))
print(dataset([1,5,8,3],-1))

而第一个代码只尝试第一个项目:

('checking', [1, 5, 8, 3], 3)
('trying', 1)
Giving up
False
('checking', [1, 5, 8, 3], -1)
('trying', 1)
Giving up
False

哪个输出:

for (int i = 0; i<num_particles; i++)
{
    //double sample_x, sample_y, sample_theta;
    string name = "part" + std::to_string(i);
    Particle name;
    name.id = i;
    name.x = dist_x(gen);
    name.y = dist_y(gen);
    name.theta = dist_theta(gen);

    cout << "Sample" << " " << name.x << " " << name.y << " " << name.theta << endl;

}

答案 1 :(得分:2)

在第一种情况下,您将遍历列表,然后返回True或False,具体取决于第一个项是否与输入值匹配。由于在您的数据中第一个元素从不匹配输入,因此都返回False。

在第二种情况下,只有当任何列表项与输入匹配时,该函数才会返回。循环遍历所有元素,直到匹配一个元素。如果不是,则返回False。

答案 2 :(得分:2)

我知道这个问题已经得到了回答,但是当你是Python的新手时,我想我会给你一些额外的补充: - )

def dataset(data,n):
    return n in data

这会奏效。它只是检查n是否在列表中,并返回TrueFalse

答案 3 :(得分:1)

当你有else: return false时,只要遇到不是False的元素,你的程序就会返回n。 但是,如果将它放在函数的末尾,则只有当先前执行的语句return False都不为真时才会执行语句n==data,因为在{之后将不再执行该函数{1}}陈述。如果return都不为真,则表示n不在数据中。

答案 4 :(得分:-1)

此循环

for value in data:
    if n == value:
        return True
    else:
        return False

在逻辑上等同于这一行

return n == data[0]

换句话说,您在第一个元素之后返回并退出循环/函数

您的其他解决方案(逻辑上等同于return n in datareturn any(n == x for x in data)将遍历整个列表,并在检查完所有值后为您提供值。 (我认为这两种选择会在匹配存在时短路)