我是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 False
和else: return False
?
答案 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是否在列表中,并返回True
或False
答案 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 data
或return any(n == x for x in data)
将遍历整个列表,并在检查完所有值后为您提供值。 (我认为这两种选择会在匹配存在时短路)