Python: 高阶函数与lambda表达式
缘由:
python语法简单一看就会,但用在实处,想因为少于实战,总感觉有些捉襟。
翻阅跟踪youtube_dl源码,看到filter()函数用法,及其中lambda表达式,感觉好有意思,就补下课,记录所思。
1. 高阶函数
所谓高阶函数,即是能接受函数做参数的函数。函数做参,与c#委托、c++函数指针、Delphi事件有类似之处
比如:
def my_func(f, *args):
f(args) def my_print(s):
print ', '.join(s) my_func(my_print, 'liujw', 'male')
它打印出:
liujw, male
如此定义函数,它能接受函数做参数,并能处理其它参数,我们就说它高阶函数。
2. lambda表达式
lambda表达式返回可调用的函数对象,并且在运行时返回它们,通常是在需要一个函数,但是又不想去命名一个函数的场合下使用。
比如,我们定义数相加函数:
def add(x, y):
return x + y
它用lambda表达式表示为:
lambda x, y: x + y
它以一个表达式,替代了常规def方法中return语句。
lambda可以支持0至多个参数,但没见有支持可变参数,即*args、**args,应该是不支持。
3. 内置高阶函数
3.1 apply(func[, nkw][, kw]):
用可选的参数来调用func,nkw 为非关键字参数,kw 关键字参数;返回值是函数调用的返回值。此函数已于python 1.6中摈弃
用途:当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数。现在版本python已允许直接调用作为参数的函数,因此它已淡出
def my_fun1():
print "my_fun" def my_fun2(x, y):
print x + y apply(my_fun1)
apply(my_fun2, (3, 5))
输出为:
my_fun
8
3.2 filter(func, seq):
调用一个布尔函数func 来迭代遍历每个seq 中的元素, 返回一个使func 返回值为ture 的元素的序列。
这个好用,我就是看到它才复习其用法,并成此文的。而youtube_dl中,大量用作为字典类判断,诸如:
matches = list(filter(lambda f: f['ext'] == ext, formats))
比如下面代码,求数组中的偶数:
lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]
lst = filter(lambda x: x % 2 == 0, lst)
print lst
它返回为:
[2, 6, 10, 12, 18]
3.3 map(func, seq1[,seq2...])
将函数func 作用于给定序列(s)的每个元素,并用一个列表来提供返回值,如果func 为None,func 表现为一个身份函数,返回一个含有每个序列中元素集合的n 个元组的列表。
比如上面列表元素做翻倍如处,可写代码如此:
lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]
lst = map(lambda x: x + x, lst)
print lst
返回结果为:
[2, 4, 6, 12, 14, 18, 20, 24, 30, 36]
3.4 reduce(func, seq[, init]):
将二元函数作用于seq 序列的元素,每次携带一对(先前的结果以及下一个序列元素),连续的将现有的结果和下雨给值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值;如果初始值init 给定,第一个比较会是init 和第一个序列元素而不是序列的头两个元素。
Python核心编程PDF版翻译令人蛋疼,什么是下雨给值作用在?
简而言之就是返回func对后所面参数执行结果,通常用在数学计算上,当然其用处不止如此。
比如求上面列表所有元素之和,可写代码如下:
lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]
result = reduce(lambda x, y: x + y, lst)
print result
其结果为:
83
3.5 sorted(iterable, cmp=None, key=None, reverse=False):
顾名思义,它是用来排序的。接受一个传入参数,其它可选参数为排序规则、排序key值、是否反转等。
如果cmp为空,则默认升序排列列表,cmp返回值决定排序方式,>0为升序,=0不变,<0降序,cmp须得有两个参数。
比如降序排列如下列表:
lst = [1, 7, 5, 2, 3, 6, 9]
lst = sorted(lst, lambda x, y: y - x)
print lst
结果为:
[9, 7, 6, 5, 3, 2, 1]
其为冒泡排序法,x为后面元素,y为前面元素。若升序排列,置x - y为结果即可。
参考资料:Python核心编程第二版
Python: 高阶函数与lambda表达式的更多相关文章
- python 高阶函数 map lambda filter等
map 描述 map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表. ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- Python高阶函数及函数柯里化
1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...
- Python高阶函数_map/reduce/filter函数
本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...
- python高阶函数的使用
目录 python高阶函数的使用 1.map 2.reduce 3.filter 4.sorted 5.小结 python高阶函数的使用 1.map Python内建了map()函数,map()函数接 ...
- python 高阶函数之filter
前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...
- python——高阶函数:高阶函数
python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...
- python高阶函数,map,filter,reduce,ord,以及lambda表达式
为什么我突然扯出这么几个函数,是因为我今天在看流畅的python这本书的时候,里面有一部分内容看的有点懵逼. >>> symbols = '$¢£¥€¤' >>> ...
- Python高阶函数(Map、Reduce、Filter)和lambda函数一起使用 ,三剑客
Map函数 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 举例说明 比如我们有一个函数f(x)=x2,要把这个函数作用 ...
随机推荐
- AS3 - 对文件和目录的操作
1,写入到文件 1 2 3 4 5 var fileObj:File = File.documentsDirectory.resolvePath("hangge.txt"); va ...
- Django基础介绍
1.web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件. 应用程序有两种模式C/S.B/S.C/S是客户 ...
- git安装与基本命令
一.前言 GibHub的名字源于Git,Git是一个分布式版本控制系统,让程序员团队能够协作开发项目,Git帮助大家管理为项目所做的工作,避免一个人所做的修改影响其他人所做的修改.你在项目中实现一个新 ...
- jquery接触初级-----juqery DOM操作 之二
DOm 操作之: 1.1 children(),这个函数只是查找元素的子元素,而不考虑其他后代元素 <body> <p title="请选择你最喜欢的水果"&g ...
- SQL Server 中系统视图sysobjects中type字段的说明
对象类型: AF = 聚合函数 (CLR) C = CHECK 约束 D = DEFAULT(约束或独立) F = FOREIGN KEY 约束 FN = SQL 标量函数 FS = 程序集 (CLR ...
- oracle第二天笔记
多表查询 /* 多表查询: 笛卡尔积: 实际上是两张表的乘积,但是在实际开发中没有太大意义 格式: select * from 表1,表2 */ select * from emp; select * ...
- servlet编码问题
建议每个servlet都写上 request.setCharacterEncoding("UTF-8")
- 多线程(Java)
Thread 类 和 Runnable 接口 在Java中实现多线程有两种方法 继承 Thread 类 优点:通过覆盖Thread 类的方法,可以改变线程的行为. 实现 Runnable 接口 优点: ...
- 【剑指offer】单链表尾部插入一个节点
#include <iostream> using namespace std; //链表结构体 struct ListNode { int m_Value; ListNode *next ...
- export default 与 export
export default 只能导出一个 可以用任意的变量来接收 export 可以暴露多个成员,需要用 import {} 接受成员 需要用名字接受 名字必须跟导出名字一致 //或者as作为别名 ...