1

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

版本 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 返回错误的结果。为什么?

4

2 回答 2

6

第一个版本只测试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]
于 2012-09-12T16:10:43.027 回答
1

第一个函数在第一次循环迭代中返回,因此您永远不会针对 i>2 进行测试。

于 2012-09-12T16:12:14.003 回答