文档章节

Python入门之函数式开发

LeeHH
 LeeHH
发布于 2016/07/20 20:23
字数 1012
阅读 13
收藏 0

在了解函数式开发之前,我们先了解一下什么是高阶函数。高阶函数有以下属性:

1.变量可以指向函数
2.函数的参数可以接收变量
3.一个函数可以接收另一个函数作为参数
4.能接收函数作参数的函数就是高阶函数

示例为:

def add(x,y,f):
    return f(x) + f(y)
a = abs
print add(-5,5,a)
#结果为10

我先将a指向了abs函数,然后在自定义的函数add中,我们把a当做了参数,也就是把abs函数当做了参数。

 

下面给大家介绍几个Python内置的高阶函数:

map()函数:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。示例为:

def f(x):
    return x*x
print map(f,[1,2,3,4])
#输出值为:[1, 4, 9, 16]

可以看得出,map的功能就是让list里面的每一个值都执行一遍f函数,从而变成一个新的list。

 

reduce()函数:reduce()函数接收的参数和 map()类似,一个函数 f一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。示例为:

def f(x,y):
    return x+y
print reduce(f,[1,2,3,4,5])
#输出值为:15

reduce就是先拿list中的1,2来作为参数调用f函数,得到的结果和3一起作为参数调用f函数,得到的结果再与4一起作为参数来调用f函数,以此类推。所以该段代码就相当于输出一下1+2+3+4+5。

P.S.如果对谷歌的大数据处理有一定了解,或者读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”(这是谷歌家的东西,所以想阅读原文的朋友,记得翻墙)的朋友,应该是很容易理解上述这两个高阶函数的。

 

filter()函数:filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。示例为:

def is_not_empty(s):
    return s and len(s.strip())>0
print filter(is_not_empty,['test',None,'','str','   ','END'])
#输出值为:['test', 'str', 'END']

filter就是拿list里的每个元素去执行is_not_empty函数,如果返回值为true,则保留,如果返回值为false,则将其去除。

 

sorted()函数:sorted()函数可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。示例为:

print sorted([2,7,3,0,16])
#输出值为:[0, 2, 3, 7, 16]
def reversed_cmp(x,y):
    if(x>y):
        return -1
    if(x<y):
        return 1
    return 0
print sorted([2,7,3,0,16],reversed_cmp)
#输出值为:[16, 7, 3, 2, 0]

从上可以看出,当sorted只传进了一个list,那么将对其进行顺序排序。如果想进行逆序排序,可以自定义函数,然后将其当做参数传进sorted里面。

讲到这里,函数式开发到底是什么呢?我的理解的话,就是这种高度抽象的编程范式。它允许把函数本身作为参数传入另一个函数,还允许返回一个函数!而且函数式编程本身并不包含变量,也就是说,当输入确定时,那么输出也就确定了,这种纯函数编程,我们称之为没有副作用。而普通的函数,由于变量的存在,当输入确定时,可能输出也是有所不同的,这种函数就是有副作用的。

© 著作权归作者所有

共有 人打赏支持
LeeHH
粉丝 1
博文 35
码字总数 36068
作品 0
深圳
程序员
私信 提问
【Python Web学习路线】干货整理,不谈虚的,让你短时间高效学好它!

无论是大数据、人工智能还是机器学习,Python都是最热门的首选语言。 学好Python,可以从事Python Web工程师、Python数据分析、人工智能专家等岗位。本期专题,分享的主题是“如何成为一枚优...

Eddie_yang
2018/12/24
0
0
一个Java开发快速入门Dart

目录 一个Java开发快速入门Dart Flutter使用简报 一个Android开发快速入门Flutter(一) 一个Android开发快速入门Flutter (二) 吐槽 好久没写博客了,意识到自己的惫懒,内心相当愧疚…… 日子...

街角的小丑
2018/11/26
0
0
Python函数式编程:从入门到走火入魔

函数式编程源自于数学理论,它似乎也更适用于数学计算相关的场景,因此本文以一个简单的数据处理问题为例,逐步介绍 Python 函数式编程从入门到走火入魔的过程。 很多人都在谈论函数式编程(...

好铁
2017/10/21
0
0
Python用不好?看官方中文文档啦

Python 作为世界上最好用的语言,官方支持的文档一直没有中文。小伙伴们已经习惯了原汁原味的英文文档,但如果有官方中文文档,那么查阅或理解速度都会大大提升。本文将介绍隐藏在 Python 官...

机器之心
03/27
0
0
整理了一些免费的编程中文书籍

在 github 上整理了一些免费的编程中文书籍 https://github.com/justjavac/free-programming-books-zh_CN 如果谁还有别的书籍,可在此留言。 语言无关类 WEB服务器 Nginx开发从入门到精通 (源...

justjavac
2013/11/04
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

Linux iptables之mangle表使用案例

mangle表的用途 mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。 mangel表使用示例 示例1-策略路由1 内网的客户机通...

月下狼
37分钟前
2
0
OSChina 周日乱弹 —— 兼职我想去学学布偶戏

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy : 《火炎 - 女王蜂》 《火炎 - 女王蜂》 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁 :还在睡觉突然接到一个小哥哥电话“x...

小小编辑
49分钟前
46
3
租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
今天
3
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
6
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部