2013-12-19 4 views
2

Я работаю с этим упражнением:Не удается получить функцию для возврата false?

написать функцию is_member(), которая принимает значение (то есть число, строка, и т.д.) х и список значений а, и возвращает значение ИСТИНА, если х член a, False в противном случае. (Обратите внимание, что это именно то, что в операторе делает, но ради упражнения вы должны делать вид, 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? 
+4

Пожалуйста, не используйте 'list' в качестве имени переменной. Это уже встроенное имя. – kojiro

+0

'isMember = lambda v, l: operator.contains (l, v)' – Eric

ответ

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) 
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.

+0

Большое вам спасибо. Я изучил Java в школе, и я новичок в Python, но все же нет никакого оправдания, чтобы не видеть этот основной fult. –

Смежные вопросы