无法获取函数返回false?

时间:2013-12-19 14:50:41

标签: python python-3.x

我正在练习这个练习:

  

编写一个函数is_member(),它接受一个值(即一个数字,字符串等)x和一个值列表a,如果x是a的成员则返回True,否则返回False。 (请注意,这正是in运算符所做的,但是为了练习,你应该假装Python没有这个运算符。)

我写了这个函数:

def isMember(value, list):
  for element in list:
    if(element == value):
      return True
    else:
      return False

myList = ["a","b","c",1,2,3]

print(isMember("a",myList)) #Returns True; correct
print(isMember(3,myList)) #Returns False; why the heck?

2 个答案:

答案 0 :(得分:11)

您需要将return False取出循环:

def isMember(value, list):
    for element in list:
        if(element == value):
            return True
    return False

如果isMember不是False中的第一个项,那么value目前的方式将返回list。此外,您应该将列表变量的名称更改为list以外的其他名称,即built-in function in Python

答案 1 :(得分:3)

问题是,您的return False是在循环内,直接作为会员资格测试的else情况。因此,当您遍历列表时,您将转到第一个元素并检查它是否在列表中。如果它在列表中,则返回true - 这没关系。如果它不在列表中,则返回false,中止循环过程并结束该函数。所以你永远不要看循环中的其他值。

所以要解决此问题,请在函数末尾移动循环外的return False。这样,只有在查看了所有元素时,才会返回false。

def isMember (value, list):
    for element in list:
        if element == value:
            return True
    return False

另一种方法是使用any函数简化此操作,以对列表中的每个元素执行检查。 any采用可迭代的方式查看值。一旦找到真值,它就返回true。否则它会一直迭代,直到找到错误的值或命中迭代器的末尾,两种情况都会产生错误。所以你可以像这样重写它:

def isMember (value, list):
    return any(value == element for element in list)