Я пытаюсь найти простое число, используя функцию фильтра в списке, но получаю список нечетных чисел. Пожалуйста, помогите мне найти, где ошибка.
def prime(n):
for i in range(2,n):
if n%i==0:return False
else: return True
L=[x for x in range(11)];print(L)
L1=[x for x in filter(prime,L)]
print(L1)
Всего 3 ответа
Проблема в том, что у вас есть return True
в цикле for.
def prime(n):
for i in range(2, n):
if n % i == 0:
return False
return True
primes = list(filter(prime, range(2, 20)))
print(primes)
Вам не нужно иметь понимание списка, чтобы отфильтровать элементы, вместо этого используйте filter(prime, range(2, 20))
.
Простое число - это число, которое не может быть разделено ни одним из предшествующих ему чисел:
def prime(n):
for i in range(2,n):
if n%i==0:
return False
return True
Используйте его в функции фильтра:
primes_less_than_hundred = filter(prime, range(3, 100))
Несколько указателей о вашем существующем коде
return True
внутри цикла for, которое вы хотите вытащить наружу после завершения цикла for
. Если мы не можем найти какой-либо делитель n, проверив n%i==0
, то только мы хотим объявить число простым числом, что происходит, когда return True
происходит после того, как цикл израсходован, что означает, что мы не могли найти i, для которого n%i==0
Мы знаем, что 0 и 1 не являются простыми, поэтому мы можем начать наш диапазон с 2
Мы можем передать вашу функцию range
напрямую в filter
, так как это итератор, нет необходимости преобразовывать его в список и затем передавать его
Мы можем напрямую преобразовать результат после запуска объекта фильтра в список, приведя его к list
Как только вы это сделаете, ваш код работает как положено
def prime(n):
for i in range(2,n):
if n%i==0:
return False
#Pulled this return True outside the for loop
return True
#Call filter on numbers from 2 to 10, and convert output to list directly
print(list(filter(prime,range(2,11))))
Выход будет
[2, 3, 5, 7]