我正在练习这个练习:
编写一个函数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?
答案 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)