1

以下は、数値のリストから素数を除外するための関数の一見同等の 2 つのバージョンです。

バージョン 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 から 7 までのすべての整数をテストするのではなく、2 が因数であるかどうかのみをテストします。これが、すべての偶数を (正しく) 除外し、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 に答える