【问题标题】:Python filter() not working and returning TypeError?Python filter() 不工作并返回 TypeError?
【发布时间】:2015-10-25 06:23:24
【问题描述】:

我编写了一个素数生成器程序,可以生成某个范围内的所有素数。代码如下:

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 会返回此错误:

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'

谁能告诉我问题出在哪里?

【问题讨论】:

    标签: python typeerror


    【解决方案1】:

    您应该只将函数传递给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) (for x as None) ,这导致了问题。您实际需要做的是将函数作为第一个参数发送(而不是为 x 评估它)。

    【讨论】:

    • 谢谢,所有文档都显示了 lambda 示例,这就是我感到困惑的原因
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2021-08-23
    • 2018-08-26
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多