首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python的过滤器函数

使用Python的过滤器函数
EN

Stack Overflow用户
提问于 2012-09-12 16:06:53
回答 2查看 2.5K关注 0票数 1

以下是两个看似等价的函数,用于从数字列表中筛选出素数。

版本1

代码语言:javascript
运行
复制
def prime (mylist):
        for i in range(2, 8):
            return filter(lambda x: x == i or x % i, mylist)

第2版

代码语言:javascript
运行
复制
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返回错误的结果。为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-12 16:10:43

第一个版本只测试i == 2。换句话说,它只测试2是否是一个因子,而不是测试从2到7的所有整数。这就是为什么它会(正确地)过滤掉所有偶数,但会(错误地)保留不为素数的奇数,比如9和15。

代码语言:javascript
运行
复制
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]
票数 6
EN

Stack Overflow用户

发布于 2012-09-12 16:12:14

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12392296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档