检查列表中的值。在循环内部还是外部循环?
我是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
只是不同的投入?
您的第一个答案在第一个项目之后停止,每个项目都运行false分支,而第二个答案仅在尝试所有项目后运行false分支。
如果你改变了最终的代码如下:
def dataset(data,n):
print("checking", data, n)
for value in data:
print("trying", value)
if n == value:
print("Found")
return True
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)
('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
当您有else: return false
时,只要遇到非n
的元素,程序就会返回False
。 但是,如果将它放在函数末尾,则只有当以前执行的语句都不为真时才会执行语句return False
,因为该函数将不再在return
语句后执行。如果n == data
中没有一个为真,则表示n不在数据中。
在第一种情况下,您要遍历列表,然后根据第一个项是否与输入值匹配返回True或False。由于在你的数据中第一个元素永远不匹配输入,都返回False。
在第二种情况下,只有当任何列表项与输入匹配时,函数才会返回。循环遍历所有元素,直到匹配。如果不是,则返回False。
我知道这个问题已经回答了,但因为你是新来的Python我想我给你一点点额外的:-)
def dataset(data,n):
return n in data
这将工作。它只是检查是否n是在列表与否,再返回True
或False
哇!这是一个巧妙的把戏。谢谢!! – Chua
这个循环
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)
将遍历整个列表,并在所有值被检查后为您提供值。 (不过,我认为这两种选择会在存在匹配时短路)
**所有**迭代完成后返回与第一次迭代期间总是返回完全不同。 –
你真的只需要'返回数据'。循环是不必要的 –
三位逻辑学家走进一家酒吧: *调酒师问道:“你们三个人都喜欢喝啤酒吗?” *第一个回复“我不知道” *第二个回复“我也不知道” *第三个回复“是的,我们三个人都想喝啤酒” –