Во-первых, не уверен, что numc () делает то, что вы ожидаете - как написано, что оператор if будет проверен только для последнего значения a в диапазоне. Оператор if не находится в блоке цикла for, поэтому цикл будет проходить через назначения, а оператор if будет идти только против значений, присвоенных в последней итерации. Это больше похоже на то, что вы ищете:
def numc(n):
for a in range(1,n):
c= a**n
d=c%n
if a != d:
return False
return n
Здесь, если какое-либо значение не проходит тест if, функция возвращает False. Если все значения проходят, возвращается true.
Во-вторых, ни мой, ни ваш черновик не возвращают массив, только целое число или логическое значение. Чтобы получить массив передаваемых значений, необходимо вызвать функцию для каждого элемента массива кандидатов.
Это дает вам вывод, целое или логическое, для каждого члена массива кандидатов:
c_values = [numc(i) for i in range(1, 2000)]
Вы можете получить только передаваемые значения, протестировав в цикле:
c_values = [numc(i) for i in range(1, 2000) if numc(i)]
Вы можете сделать это, не вызывая numc () дважды, вложив списки:
c_values = [i for i in [numc(j) for j in range(1, 2000)] if i]
Это сначала генерирует полный массив выходных значений, а затем возвращает только те, которые являются Истиной.
РЕДАКТИРОВАТЬ: Вы, кажется, смущены отступом блока, или возможно двумя операторами возврата. Вот еще один способ с одним возвратом:
def numc(n):
retval = n
for a in range(1,n):
c= a**n
d=c%n
if a != d:
retval = False # reset return value
break # halt the loop
return retval
Здесь возвращаемым значением по умолчанию является << n >>, которое должно быть сброшено в цикле << for >>, если условие cnumber нарушается некоторым значением << a >>. В этом случае << break >> останавливает цикл (хотя здесь это и не нужно.) Функция просто возвращает то, что происходит << retval >>, когда достигается возвращаемый статус.
Мой первоначальный черновик имел тот же эффект, но там цикл for был прерван / 'прерван' оператором << return False >>, что также прервало функцию, не позволяя ей достичь << return n> >. Если бы это утверждение не было выполнено, то есть << a >> не нарушило условия, функция достигла бы и выполняла << return n >>. Если у функции есть два оператора возврата, она будет выполнять только первое достигнутое, и весь код после этого будет игнорироваться.