Python|高阶函数

01

函数名也是变量!

abs(-100)

对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个计算绝对值的函数!

因此,函数名其实就是指向函数的变量,也就是说,变量可以指向函数。

f = abs f(-10) 10

02

高阶函数

既然变量f可以指向函数,并且函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def minus(x, y, f): return f(x) - f(y)

minus就是高阶函数,因为其参数f,指向了函数。

当我们调用 minus(-10,4,abs)时,根据函数定义,可以推导计算过程如下:

x = -10 y = 4 f = abs f(x) + f(y) ==> abs(-10) - abs(4) ==> 6 return 6

03

Map

map()传入的第一个参数是fmap将f依次作用到序列的每个元素,并把结果作为新的Iterator返回。 def f(x): return x * x 如果不用map,需要这么写: L = [] for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]: L.append(f(n)) 用map一行代码搞定: list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])) 另外一个map例子: list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) 结果: ['1', '2', '3', '4', '5', '6', '7', '8', '9'] 再看一个map例子: def char2num(s): digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} return digits[s] print(list(map(char2num,"13579"))) #注意“13579”是个序列 结果: [1, 3, 5, 7, 9]

04

Reduce

reduce把f作用在一个序列[x1, x2, x3, ...]上,f必须接收两个参数

reduce把结果继续和序列的下一个元素做累积计算,其效果就是: reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

from functools import reduce

#reduce的参数f函数,f必须接受两个参数

def fn(x, y): return x * 10 + y reduce(fn, [2, 4, 6, 7, 9])

结果:

24679

05

结合Map和Reduce

def str2num(s): return reduce(fn, map(char2num, s))

print(str2num('213579'))

结果:

213579

解释:map作用将序列s中每一个字符转化为num,返回一个Iterator对象,reduce的参数fn将这个Iterator对象转化为对应的整数表示。

Map完成了数据拆分,Reduce化简合并数据。

原文发布于微信公众号 - 算法channel(alg-channel)

原文发表时间:2018-01-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从流域到海域

C++对象的赋值和复制

本文属于上篇博文《C++区别于其他语言的知识点总结》第13小节。 13.对象的赋值和复制 对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号...

39690
来自专栏武培轩的专栏

排序算法-选择排序

算法简介 选择排序就是找到数组中最小元素将其和数组第一个元素交换位置,然后在剩下的元素中找到最小元素并将其与数组第二个元素进行交换,以此类推,直至整个数组排序结...

34940
来自专栏深度学习思考者

Python学习(二) 正则表达式

Python正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re 模块使 Python 语言拥有全部的正则表达式功...

20990
来自专栏小樱的经验随笔

关于int *a[常量]与int (*a)[常量]的分析与区分(详解)

前言: 小伙伴私信我说,int *a[常量]与int (*a)[常量]这个区分不开,C指针,确实是C中最难的部分,也是学C++,JAVA,包括你以后上岗用的非常...

27630
来自专栏玄魂工作室

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字

要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和...

26110
来自专栏PHP实战技术

你应该这个姿势学习PHP(2)

2、is_array(),is_bool,is_int(),is_integer(),is_numeric(),is_string(),is_object(),...

40960
来自专栏生信小驿站

python-运算符与表达式

你所编写的大多数语句(逻辑行)都包含了表达式(Expressions)。一个表达式的简单例子便是 2+3。表达式可以拆分成运算符(Operators)与操作数(...

20820
来自专栏大前端开发

ES6特性之:解构

解构(destructuring assignment), 也称解构赋值,这种语法可以方便的将数组元素或对象属性赋成新的变量。

7120
来自专栏python学习指南

python列表

本篇将介绍python中的列表,更多内容请参考:Python学习指南 一、序列 在python中有六种内建的序列:列表、元祖、字符串、Unicode字符串...

38450
来自专栏IMWeb前端团队

javascript Array.prototype.sort 排序浅谈

每个 Array 的实例都自带sort 函数,本文对sort函数的用法做一些探讨。 基本用法 1.数组元素为字符串的排序: var fruit = ['cher...

26570

扫码关注云+社区

领取腾讯云代金券