2017-09-24 61 views
0

我是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只是不同的投入?

+4

**所有**迭代完成后返回与第一次迭代期间总是返回完全不同。 –

+0

你真的只需要'返回数据'。循环是不必要的 –

+0

三位逻辑学家走进一家酒吧: *调酒师问道:“你们三个人都喜欢喝啤酒吗?” *第一个回复“我不知道” *第二个回复“我也不知道” *第三个回复“是的,我们三个人都想喝啤酒” –

回答

2

您的第一个答案在第一个项目之后停止,每个项目都运行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 
1

当您有else: return false时,只要遇到非n的元素,程序就会返回False。 但是,如果将它放在函数末尾,则只有当以前执行的语句​​都不为真时才会执行语句return False,因为该函数将不再在return语句后执行。如果n == data中没有一个为真,则表示n不在数据中。

2

在第一种情况下,您要遍历列表,然后根据第一个项是否与输入值匹配返回True或False。由于在你的数据中第一个元素永远不匹配输入,都返回False。

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

2

我知道这个问题已经回答了,但因为你是新来的Python我想我给你一点点额外的:-)

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

这将工作。它只是检查是否n是在列表与否,再返回TrueFalse

+1

哇!这是一个巧妙的把戏。谢谢!! – Chua

-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)将遍历整个列表,并在所有值被检查后为您提供值。 (不过,我认为这两种选择会在存在匹配时短路)

相关问题