文档章节

Python自学笔记之函数式编程3——filter

twobeings
 twobeings
发布于 2015/06/16 18:51
字数 753
阅读 25
收藏 1

Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

例如,在一个list中,删除偶数,只保留奇数,可以这么写:

def is_odd(n):
    return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
#结果:[1, 5, 9, 15]

把一个序列中的字符串删掉可以这么写:

def not_empty(s):
    return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
#结果:['A', 'B', 'C']

可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。而该函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。由于filter()使用了惰性计算,所以只有在取其结果的时候,才会真正筛选并每次返回下一个筛出的元素。

用filter求素数

计算素数的一个方法是艾氏筛法,它的算法理解起来非常简单:

首先,列出从2开始的所有自然数,构造一个序列

取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉

取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉

取新序列的第一个数5,然后用5把序列的5的倍数筛掉

不断筛下去,就可以得到所有的素数。

用Python来实现这个算法,可以先构造一个从3开始的奇数序列:

def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n

注意这是一个生成器,并且是一个无限序列。

然后定义一个筛选函数:

def _not_divisible(n):
    return lambda x: x % n > 0

最后,定义一个生成器,不断返回下一个素数:

def primes():
    yield 2
    it = _odd_iter() # 初始序列为以3开头的奇数序列
    while True:
        n = next(it) # 返回序列的第一个数
        yield n
        it = filter(_not_divisible(n), it) # 构造新序列

这个生成器先返回第一个素数2,然后利用filter()不断产生筛选后的新序列。

由于primes()也是一个无限序列,所以调用时需要设置一个退出循环的条件:

# 打印1000以内的素数:

for n in primes():
    if n < 1000:
        print(n)
    else:
        break

注意:Iterator是惰性计算的序列,所以我们可以用Python表示“全体自然数“,“全体素数”这样的序列,而代码非常简洁。

练习

回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()滤掉非回数:

def is_palindrome(n):
   s = str(n)
    return s[ : : -1] == s
output = filter(is_palindrome, range(1, 1000))
print(list(output))


本文转载自:http://www.liaoxuefeng.com/

共有 人打赏支持
twobeings
粉丝 3
博文 26
码字总数 1219
作品 0
浦东
Scala笔记整理(五):函数式编程

[TOC] 作为值传递的函数 测试代码如下: 输出结果如下: 匿名函数 测试代码如下: 输出结果如下: 其实前面在学习ArrayBuffer的时候已经有使用过匿名函数: 带函数参数的函数(高阶函数) 说...

xpleaf
04/21
0
0
一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者
04/25
0
0
Python进阶系列连载(13)——Python内置高阶函数filter(下)

前言 进阶部分连载继续~ 如果还没看过我的入门连载部分,先看: https://ask.hellobi.com/blog/wangdawei/10288 当然,小编的免费入门课程已经有咯,看过连载的朋友可以看看视频再快速梳理一...

ID王大伟
04/28
0
0
买《Python从小白到大牛》专题视频课程,送配套纸质图书

经过一年多时间的呕心沥血,Python立体化图书——《Python从小白到大牛》即将与大家见面了。所谓立体化图书包括:电子图书、视频、课件和服务等内容。 《Python从小白到大牛》纸质图书将于9...

tony关东升
07/23
0
0
map,filter,reduce的应用方法

最近在自学python,不知道怎么入手,就花了好几十大洋买了《python学习手册》来看,记忆力不好,怕以后忘记了,写下来当是笔记吧。也可以供那些python新手又没买这本书的人做参考哈~ 1.map把第...

Geomen
2012/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

异步化,高并发大杀器

今天来聊聊如何让项目异步化的一些事。 在进入正文之前,顺便给大家推荐一个Java架构方面的交流学习群:698581634,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分...

Java大蜗牛
12分钟前
0
0
织梦dedecms安全设置

网站本身做好防范: 1、修改默认后台名。 打开网站根目录,找到[dede],这个文件夹就是后台的路径,可以随意修改,比如修改为[adminbuy],此时后台登陆的路径为:http://www.*****.com/admi...

雨季2014
13分钟前
0
0
完美Python入门基础知识点总结,看完你的Python就完全入门了!

Python标识符 在 Python 里,标识符有字母、数字、下划线组成。 在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。 Python 中的标识符是区分大小写的。 以下划线...

糖宝lsh
19分钟前
0
0
Java关于前后台传输中文乱码以及Excel下载乱码解决

针对乱码,一般情况是前后台以及中间件编码格式不同导致.故需要保证编码格式相同即可. 1.前台页面格式指定,这里用的是jsp,故需要将pageEncoding指定为"UTF-8" 2.指定服务器编码格式,比如用的t...

勤奋的蚂蚁
21分钟前
0
0
Flutter组件 - Flexible

Flexible是一个控制Row、Column、Flex等子组件如何布局的组件。 Flexible组件可以使Row、Column、Flex等子组件在主轴方向有填充可用空间的能力(例如,Row在水平方向,Column在垂直方向),但是...

一箭落旄头
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部