匿名函数lambda表达式

什么是匿名函数?

匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑。lambda 本质上是一个函数对象,可以将其赋值给另一个变量,再由该变量来调用函数,也可以直接使用。

#平时,我们是先定义函数,再进行调用

def power(x):

return x ** 2

print(power(2))

#使用lambda表达式的时候,我们可以这样操作

power = lambda x : x ** 2

print(power(2))

#觉得太麻烦,还可以这样调用

print((lambda x: 2 * x)(8))

lambda表达式的基本格式:lambda 入参 : 表达式

#入参可以有多个,比如

power = lambda x, n: x ** n

print(power(2, 3))

lambda 表达式的使用场景

一般适用于创建一些临时性的,小巧的函数。比如上面的 power函数,我们当然可以使用 def 来定义,但使用 lambda 来创建会显得很简洁,尤其是在高阶函数的使用中。

定义一个函数,传入一个list,将list每个元素的值加1

def add(l = []):

return [x +1 for x in l]

print(add([1,2,3]))

上面的函数改成将所有元素的值加2

可能大家会说,这还不简单,直接把return里的1改成2就行了。但是真的行吗?如果函数被多个地方使用,而其他地方并不想加2,怎么办?

这好办,把变得那部分抽出来,让调用者自己传

def add(func,l = []):

return [func(x) for x in l]

def add1(x):

return x+1

def add2(x):

return x+2

print(add(add1,[1,2,3]))

print(add(add2,[1,2,3]))

一个简简单单的问题,一定要用这么多代码实现?

def add(func,l = []):

return [func(x) for x in l]

print(add(lambda x:x+1,[1,2,3]))

print(add(lambda x:x+2,[1,2,3]))

map函数

map的基本格式

map(func, *iterables)

map() 函数接收两个以上的参数,开头一个是函数,剩下的是序列,将传入的函数依次作用到序列的每个元素,并把结果作为新的序列返回。也就是类似 map(func,[1,2,3])

同样的,我们还是来完成这样一个功能:将list每个元素的值加1

def add(x):

return x + 1

result = map(add, [1, 2, 3, 4])

print(type(result))

print(list(result))

使用lambda表达式简化操作

result = map(lambda x: x + 1, [1, 2, 3, 4])

print(type(result))

print(list(result))

函数中带两个参数的map函数格式

使用map函数,将两个序列的数据对应位置求和,之后返回,也就是对[1,2,3],[4,5,6]两个序列进行操作之后,返回结果[5,7,9]

print(list(map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6])))

对于两个序列元素个数一样的,相对好理解。如果两个序列个数不一样的,会不会报错?

print(list(map(lambda x, y: x + y, [1, 2, 3], [4, 5])))

我们可以看到不会报错,但是结果以个数少的为准

reduce函数

reduce函数的基本格式

reduce(function, sequence, initial=None)

reduce把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce函数把结果继续和序列的下一个元素做累积计算,跟递归有点类似,reduce函数会被上一个计算结果应用到本次计算中

reduce(func, [1,2,3]) = func(func(1, 2), 3)

使用reduce函数,计算一个列表的乘积

from functools import reduce

def func(x, y):

return x * y

print(reduce(func, [1, 2, 3, 4]))

结合lambda表达式,简化操作

from functools import reduce

print(reduce(lambda x, y: x * y, [1, 2, 3, 4]))

filter 函数

filter 顾名思义是过滤的意思,带有杂质的(非需要的数据),经过 filter 处理之后,就被过滤掉。

filter函数的基本格式

filter(function_or_None, iterable)

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

使用 filter 函数对给定序列进行操作,最后返回序列中所有偶数

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

sorted 函数

sorted从字面上就可以看去这是个用来排序的函数,sorted 可以对所有可迭代的对象进行排序操作

sorted的基本格式

sorted(iterable, key=None, reverse=False)

#iterable -- 可迭代对象。

#key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

#reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

#对序列做升序排序

print(sorted([1, 6, 4, 5, 9]))

#对序列做降序排序

print(sorted([1, 6, 4, 5, 9], reverse=True))

#对存储多个列表的列表做排序

data = [["Python", 99], ["c", 88]]

print(sorted(data, key=lambda item: item[1]))

闭包

在万物皆对象的Python中,函数是否能作为函数的返回值进行返回呢?

def my_power():

n = 2

def power(x):

return x ** n

return power

p = my_power()

print(p(4))

#------------------------------------------------------------

def my_power():

n = 2

def power(x):

return x ** n

return power

n = 3

p = my_power()

print(p(4))

我们可以看到,my_power 函数在返回的时候,也将其引用的值(n)一同带回,n 的值被新的函数所使用,这种情况我们称之为闭包

当我们把n的值移除到my_power函数外面,这个时候来看下计算结果

n = 2

def my_power():

def power(x):

return x ** n

return power

n = 3

p = my_power()

print(p(4))

为什么输出的结果会是64?

我们先来看看闭包时,p.__closure____的结果

#例1

def my_power():

n = 2

def power(x):

return x ** n

return power

p = my_power()

print(p.__closure__)

#结果:()

#closure是内部函数的一个属性,用来保存环境变量

#---------------------------------------------------------------------

#例2

n = 2

def my_power():

def power(x):

return x ** n

return power

n = 3

p = my_power()

print(p.__closure__)

#输出结果 None

通过例1跟例2对比,我们可以知道,例2并不是闭包

闭包经典问题

下面的程序是否是闭包?能否正确运行

def my_power():

n = 2

def power(x):

n += 1

return x ** n

return power

p = my_power()

print(p(3))

如何让上面的程序正确运行?看看改正之后的结果

def my_power():

n = 2

def power(x):

nonlocal n

n += 1

return x ** n

return power

p = my_power()

print(p.__closure__)

print(p(3))

print(p(3))

看看下面的程序的运行结果

def my_power():

n = 2

L = []

for i in range(1, 3):

def power():

return i ** n

L.append(power)

return L

f1, f2 = my_power()

print(f1())

print(f2())

print(f1.__closure__[0].cell_contents)

print(f2.__closure__[0].cell_contents)

python的函数只有在执行时,才会去找函数体里的变量的值,也就是说你连形参都不确定,你咋求知道 i为几呢?在这里,你只需要记住如果你连形参都不确定,python就只会记住最后一个i值。

装饰器及其应用

什么是装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

import time

start = time.time()

time.sleep(4)

end = time.time()

print(end - start)

从实际例子来看装饰器

def my_fun():

print("这是一个函数")

my_fun()

要再打印“这是一个函数”前面在打印多一行hello world。

def my_fun():

begin = time.time()

time.sleep(2)

print("这里一个函数")

end = time.time()

print(end-begin)

my_fun()

这个时候,如果不想修改原有的函数,咋整?

def my_fun():

print("这是一个函数")

def my_time(func):

begin = time.time()

time.sleep(2)

func()

end = time.time()

print(end - begin)

my_time(func)

这种方式,因为要增加功能,导致所有的业务调用方都得进行修改,此法明显不可取。

另一种方式:

def print_cost(func):

def wrapper():

begin = time.time()

time.sleep(2)

func()

end = time.time()

print(end - begin)

return wrapper

@print_cost

def my_fun():

print("这里一个函数")

第二种方式并没有修改func函数的内部实现,而是使用装饰器模式对其功能进行装饰增强。

以上就是浅谈Python 函数式编程的详细内容,更多关于Python 函数式编程的资料请关注python博客其它相关文章!

python采用函数编程模式_浅谈Python 函数式编程相关推荐

  1. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  2. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

  3. python方法解析顺序_浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  4. python 共享内存变量_浅谈python多进程共享变量Value的使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  5. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

  6. python数据类型转换原因_浅谈Python数据类型之间的转换

    Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 compl ...

  7. python打开方式错误_浅谈python 调用open()打开文件时路径出错的原因

    昨晚搞鼓了一下python的open()打开文件 代码如下 def main(): infile =open("C:\Users\Spirit\Desktop\bc.txt",'r ...

  8. python 中arange函数_浅谈Python中range与Numpy中arange的比较

    本文先比较range与arange的异同点,再详细介绍各自的用法,然后列举了几个简单的示例,最后对xrange进行了简单的说明. 1. range与arange的比较 (1)相同点:A.参数的可选性. ...

  9. python列表使用判断_浅谈Python数据类型判断及列表脚本操作

    数据类型判断 在python(版本3.0以上)使用变量,并进行值比较时.有时候会出现以下错误: TypeError: unorderable types: NoneType() < int() ...

最新文章

  1. epson机器人编程 范例_2019年机器人盘点(IREX篇)
  2. CentOS7 配置ISCSI targetcli 共享存储
  3. C# VS预生成事件命令行 和 生成后事件命令行
  4. osgi框架和spring区别_最新100道大厂高频spring面试题附答案
  5. Pixhawk代码分析-启动代码及入口函数
  6. 同步现象 心理学_非心理专业背景的人,如何成为心理学家或心理咨询师?
  7. 使用junit做其他事情
  8. uiautomator +python 安卓UI自动化尝试
  9. 前端学习(1535):单一页面的优势
  10. 一周学好python_耗时一周整理的Python资料,包含各阶段所需网站、项目,收藏了?慢慢来...
  11. 列表操作 - C#开发人员
  12. 知乎香港IPO发售价定为每股32.06港元
  13. Android ListView中EditView再次焦点获取
  14. python列表找大写字母_使用Python实现将list中的每一项的首字母大写
  15. PandoraBox 路由器 IPv6穿透
  16. 代理服务器出问题或挂完代理后网络连接且无网络
  17. 微信授权登录与绑定或者改绑手机号关系?
  18. ES6之三个点(扩展运算符及rest运算符)
  19. 【Django】有效解决django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM, but settings
  20. 语音芯片WT2003H4 B008单芯片实现智能门铃方案快捷设计

热门文章

  1. 到无限(溪流)和超越!
  2. Java的精妙之处,包括基元和变量参数数组
  3. Kafka的Spring Cloud Stream
  4. spring aop示例_Spring JpaRepository示例(内存中)
  5. jpa加密_使用JPA侦听器的数据库加密
  6. javaone_JavaOne 2012:使用HTML5和Java构建移动应用程序
  7. 通过Java 8流使用Oracle AQ
  8. html5开发ria_用于RIA的JavaFX 2与HTML5
  9. teamcity_TeamCity构建依赖项
  10. junit testng_TestNG或JUnit