Python中的匿名函数和函数式编程

文章目录

  • Python中的匿名函数和函数式编程
    • 一、匿名函数
      • 匿名函数的格式:
    • 二、函数式编程
      • map()
      • filter()
      • reduce()
      • 区别
    • 三、‘三目运算符’
      • 1. Python 的语法支持

一、匿名函数

Python中的匿名函数,称为lambda表达式

匿名函数的格式:

lambda argument1, argument2,... argumentN : expression# 关键字 参数 : 返回值

比如,计算平方

square = lambda x: x**2
square(3)
# 对字典中的key/value,根据value进行从大到小排序:dict = {'mike': 10, 'lucy': 2, 'ben': 30}
list = sorted(dict.items(), key=lambda key:key[1], reverse=True)
print(list)
for key, value in list:print("key={}, value={}".format(key, value))#
[('ben', 30), ('mike', 10), ('lucy', 2)]
key=ben, value=30
key=mike, value=10
key=lucy, value=2

lambda的主体只有一行的简单表达式,不能扩展成一个多行的代码块

二、函数式编程

函数式编程中的函数,都是由纯函数组成。纯函数指函数本身相互独立,互不影响,对于相同的输入,总有相同的输出,没有任何副作用。

举例说明,对一个list,让列表中的元素值都变为原来的两倍

def multiply_2(list):for index in range(0, len(list)):list[index] *= 2return list

上面的代码不是纯函数,列表中的值被改变了,如果多次调用,每次得到的结果都是不一样的。
下面改造一下:

def multiply_2_pure(l):new_list = []for item in l:new_list.append(item * 2)return new_list

Python 中提供了 几个函数:map() 、filter()、reduce(),通常结合匿名函数lambda一起使用

map()

map(function, iterable)

它对iterable中的每个元素,都执行function这个函数,最后返回一个可遍历的集合。

list = [1, 2, 3, 4, 5]
new_list = map(lambda x: x*2, list)[2, 4, 6, 8, 10]
xs=range(1000000)
map(lambda x: x*2, xs)[x * 2 for x in xs]
list = []
for i in xs: list .append(i * 2)

上面3种方式,map函数是最快的。
map()函数由C语言写的,运行时不需要通过Python解释器间接调用,并且做了诸多优化。

filter()

filter(function, iterable)

表示对iterable中的每个元素,都使用function来判断,并返回True或者False,最后将返回True的元素,组成一个集合返回
例子:判断一个list中的所有偶数

list = [1, 2, 3, 4, 5]
new_list = filter(lambda x: x % 2 == 0, list)[2, 4]

reduce()

reduce(function, iterable, init = None)

对一个集合做一些累积操作,它对每个元素以及上一次调用返回的结果,运用function进行计算,最后返回的是一个单独的值。

例如,计算一个list中元素的乘积:

list = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x*y,  list)
120

区别

  • filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)
  • filter(function or None, sequence) -> list, tuple, or string:入参为函数和列表/元组/字符串,返回值为item列表/元组/字符串。
  • map(function, sequence) :对sequence中的item依次执行function(item),将执行结果function(item)组成一个List返回。
  • map(function, sequence[, sequence, ...]) -> list:入参是为函数和列表/元组/字符串,返回值为function(item)列表。
  • reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用。function接收的参数个数只能为2,先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给function,然后只返回一个结果。
  • reduce(function, sequence[, initial]) -> value:入参是为函数和列表/元组/字符串和初始值,返回值为数值。

三、‘三目运算符’

1. Python 的语法支持

为真时的结果 if 判断条件 else 为假时的结果(注意,没有冒号)
x = x+1 if x%2==1 else x

在比如我们欲实现一个基础版本(递归版本)的斐波那契数列:

def fn(n):return n if n < 2 else fn(n-1)+fn(n-2)

Python 中的三目运算符目的是得到一个结果,未必就是将该结果return,或者进行简单的变量赋值,如下:

l = []
l.append(1 if x>=1. else 0)# 将会给形式带来巨大的简洁

Python中的匿名函数和函数式编程相关推荐

  1. python中的匿名函数_python匿名函数

    文章导读: 以前自己一直没搞明白Python中的匿名函数,现在拿这个问题基本上搞明白了,拿自己的理解整成一篇文章,附带大量例子,让其更加好理解. 在编程语言中,函数的应用: 1. 代码块重复,这时候必 ...

  2. python中定义匿名函数的关键字是,Python中的匿名函数

    写python的时候,大多数场景下,我都是if else选手,因为最核心的逻辑几乎都是通过if else语句来实现的.关于匿名函数这块儿,其实可以用常见的循环等方法来实现,但是如果你想成为一个pyth ...

  3. python中匿名函数的作用_什么是Python中的匿名函数

    匿名函数 lambda x , y : x+y 1.匿名的目的就是要没有名字,给匿名函数赋给一个名字是没有意义的. 2.匿名函数的参数规则.作用域关系与有名函数是一样的. 3.匿名函数的函数体通常应该 ...

  4. matlab匿名函数求导,MATLAB中的匿名函数和Python中的匿名函数

    在MATLAB和Python中都有一个叫做匿名函数的东西,在这里对比一下. 一. MATLAB中这样来定义一个匿名函数: f = @(x1, x2, ...) exper @后面的括号里面是自变量,然 ...

  5. (转)函数作用域,匿名函数,函数式编程,面向过程,面向对象

    函数作用域 ? 1 2 3 4 5 6 7 8 9 10 def first():     name = 'Wangben'     def second():         name = 'Men ...

  6. Python 中的匿名函数,你会用吗

    概念 我们从一个例子引入. 这里有一个元素为非空字符串的列表,按字符串最后一个字母将列表进行排序.如果原列表是 ['abc', 'g', 'def'],则结果应该是 ['abc', 'def', 'g ...

  7. Python 中的匿名函数,你滥用了吗?

    概念 我们从一个例子引入. 这里有一个元素为非空字符串的列表,按字符串最后一个字母将列表进行排序.如果原列表是 ['abc', 'g', 'def'],则结果应该是 ['abc', 'def', 'g ...

  8. python中的匿名函数lambda

    匿名函数 python 使用 lambda 来创建匿名函数. 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数. lambda 只是一个表达式,函数体比 def 简单很多. lambda ...

  9. Python中的匿名函数及递归思想简析

    匿名函数 前言 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类 ...

最新文章

  1. 更改windows域名
  2. 词云制作 Python
  3. 一个基于C++的多线程编程实例(CreateThread函数)
  4. 【GAN优化】详解对偶与WGAN
  5. int b = 1;int c = b^0xff;求C
  6. mysql练习数据_数据分析学习第一关-入门
  7. C++(STL):03---智能指针之shared_ptr
  8. java swt 下拉列表_求助:SWT 下拉列表
  9. 03-从尾到头打印链表
  10. Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
  11. 易混单词 expect VS except
  12. 51Nod-1008 N的阶乘 mod P【模除】
  13. 基于CarMaker的C-NCAP主动安全系统试验仿真(二)
  14. 什么是Servlet容器?
  15. 制作AR换装游戏(上篇AR识图)#1024程序员节#
  16. MNE学习笔记(六):Epoched data的可视化
  17. 【CXY】JAVA基础 之 异常
  18. word插入excel文档显示图标的方法
  19. 金融作业:股吧评论_爬取、情绪与股价对比(贵州茅台和上证指数)
  20. 回撤率 python_求问怎么用python求夏普比率和最大回撤率呢

热门文章

  1. matlab复数方程的根,matlab解一元三次方程,得到的都是复数根。
  2. bert模型中的[CLS]、[UNK]、[SEP]
  3. 快递鸟电子面单打印功能基于java
  4. Get data from file(xxx.png) failed!
  5. Django框架(二)
  6. ibatis实现1对多
  7. twitter storm源码走读(二)
  8. Shell中的一些小技巧
  9. linux TCP数据包封装在SKB的过程分析
  10. 中国互联网哪来的所谓“所谓”的创新?“狗日”的腾讯究竟动了谁的蛋糕?...