Python filter() 不工作并返回 TypeError?
Python filter() not working and returning TypeError?
我写了一个素数生成器程序,可以生成某个范围内的所有素数。代码如下:
from math import sqrt
primes = range(3, 31623, 2)
for i in range(len(primes)):
if primes[i] != None:
if primes[i] >= sqrt(31622):
break
for x in range(i+1, len(primes)):
if primes[x] and not primes[x] % primes[i]:
primes[x] = None
primes = [x for x in primes if x]
def is_prime(x):
#if x <= 31623 and x in primes:
#return True
if x % 10 == 5 or not x % 10 or not x % 2:
return False
else:
for i in primes:
if not x % i or i >= sqrt(x):
return False
return True
l = [x for x in range(999900001, 1000000000, 2) if is_prime(x)]
#l = filter(is_prime(x), range(999900001, 1000000000, 2))
print l
问题出在最后几行。如果我使用列表理解,一切正常。但是,如果我尝试使用 filter() 创建素数列表,Python returns 此错误:
Traceback (most recent call last):
File "primes.py", line 29, in <module>
l = filter(is_prime(x), range(999900001, 1000000000, 2))
File "primes.py", line 20, in is_prime
if x % 10 == 5 or not x % 10 or not x % 2:
TypeError: unsupported operand type(s) for %: 'NoneType' and 'int'
谁能告诉我问题出在哪里?
您应该只将函数传递给 filter
,而不是调用函数并传递其结果。例子-
l = filter(is_prime, range(999900001, 1000000000, 2))
问题很可能是因为 x 被定义为 None ,很可能是由于列表理解 -
primes = [x for x in primes if x]
然后,当你做 -
l = filter(is_prime(x), range(999900001, 1000000000, 2))
它首先评估 is_prime(x)
(x as None
) ,这是导致问题的原因。您实际需要做的是将函数作为第一个参数发送(而不是为 x 求值)。
我写了一个素数生成器程序,可以生成某个范围内的所有素数。代码如下:
from math import sqrt
primes = range(3, 31623, 2)
for i in range(len(primes)):
if primes[i] != None:
if primes[i] >= sqrt(31622):
break
for x in range(i+1, len(primes)):
if primes[x] and not primes[x] % primes[i]:
primes[x] = None
primes = [x for x in primes if x]
def is_prime(x):
#if x <= 31623 and x in primes:
#return True
if x % 10 == 5 or not x % 10 or not x % 2:
return False
else:
for i in primes:
if not x % i or i >= sqrt(x):
return False
return True
l = [x for x in range(999900001, 1000000000, 2) if is_prime(x)]
#l = filter(is_prime(x), range(999900001, 1000000000, 2))
print l
问题出在最后几行。如果我使用列表理解,一切正常。但是,如果我尝试使用 filter() 创建素数列表,Python returns 此错误:
Traceback (most recent call last):
File "primes.py", line 29, in <module>
l = filter(is_prime(x), range(999900001, 1000000000, 2))
File "primes.py", line 20, in is_prime
if x % 10 == 5 or not x % 10 or not x % 2:
TypeError: unsupported operand type(s) for %: 'NoneType' and 'int'
谁能告诉我问题出在哪里?
您应该只将函数传递给 filter
,而不是调用函数并传递其结果。例子-
l = filter(is_prime, range(999900001, 1000000000, 2))
问题很可能是因为 x 被定义为 None ,很可能是由于列表理解 -
primes = [x for x in primes if x]
然后,当你做 -
l = filter(is_prime(x), range(999900001, 1000000000, 2))
它首先评估 is_prime(x)
(x as None
) ,这是导致问题的原因。您实际需要做的是将函数作为第一个参数发送(而不是为 x 求值)。