Skip to main content
 首页 » 编程设计

python之使用Python的过滤功能

2025年05月04日14duanxz

这里有两个看似等价的函数版本,用于从数字列表中过滤掉素数。

版本 1

def prime (mylist): 
        for i in range(2, 8): 
            return filter(lambda x: x == i or x % i, mylist) 

版本 2

def prime2 (mylist): 
    nums = mylist 
    for i in range(2, 8):  
        nums = filter(lambda x: x == i or x % i, nums) 
    return nums 
 
print prime([2,3,4,5,6,7,8,9,10,11,12,13,14,15])   
   >> [2, 3, 5, 7, 9, 11, 13, 15] 
print prime2([2,3,4,5,6,7,8,9,10,11,12,13,14,15])  
   >> [2, 3, 5, 7, 11, 13] 

版本 1 返回错误结果。为什么?

请您参考如下方法:

第一个版本只测试i == 2。换句话说,它只测试 2 是否是一个因子,而不是像你预期的那样测试从 2 到 7 的所有整数。这就是为什么它会(正确地)过滤掉所有偶数,但会(错误地)留下非素数的奇数,例如 9 和 15。试试这个来明确地看到它:

def prime (mylist): 
    for i in range(2, 8): 
        print i # added to make things explicit; it's not necessary 
        return filter(lambda x: x == i or x % i, mylist) 
 
def prime2 (mylist): 
    nums = mylist 
    for i in range(2, 8): 
        print i # added to make things explicit; it's not necessary 
        nums = filter(lambda x: x == i or x % i, nums) 
    return nums 
 
print prime([2,3,4,5,6,7,8,9,10,11,12,13,14,15]) 
>>> 2 
>>> [2, 3, 5, 7, 9, 11, 13, 15] 
print prime2([2,3,4,5,6,7,8,9,10,11,12,13,14,15]) 
>>> 2 
>>> 3 
>>> 4 
>>> 5 
>>> 6 
>>> 7 
>>> [2, 3, 5, 7, 11, 13]