python函数式编程之返回函数

高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回。

  • 函数作为返回值

      def laxy_sum(*args):
    def sum():
    ax = 0;
    for n in args:
    ax = ax + n;
    return ax;
    return sum; print(laxy_sum(1, 3, 5, 7));
    # <function laxy_sum.<locals>.sum at 0x000001F2E3272F28>返回一个函数而不是一个值

在这个函数中,内部函数sum可以引用外部函数laxy_sum的参数和局部变量,当外部函数返回函数sum时,相关参数和变量都保存在返回的函数中,这种情况称为“闭包”个人觉得和JavaScript的闭包很相似,这种程序结构拥有极大的威胁。

当我们调用lazy_sum时,每次调用都会返回新的函数,即使传入相同的参数。

  • 闭包

    当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。返回的函数并没有立即执行,而是直到调用了外部函数才执行

python函数式编程之匿名函数

当我们在传入函数时,有时候不需要显式的定义函数,而是直接传入匿名函数。

匿名函数就是没有函数名的函数,python用关键字lambda表示匿名函数,冒号前面的x表示函数的参数

#匿名函数
p = list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6]));
print(p);
# [1, 4, 9, 16, 25, 36]

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

python函数式编程之装饰器

由于函数也是一个对象,函数对象也可以赋值给变量,所以我们可以通过变量也能调用函数。

def now():
print('2017-11-22'); f = now;
print(f());# 2017-11-22

函数对象有一个属性__name__属性,可以拿到函数的名字:像上面的例子就可以用 f.__name__取到函数的名字now

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。如,在函数now调用前后自动打印日志,但又不希望修改now()函数的定义。装饰器本质上是一个干返回函数的高阶函数。

def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__);
return func(*args, **kw);
return wrapper; @log
def now():
print('2017-11-22'); print(now());
# call now():
# 2017-11-22

Python的@语法后续

python函数式编程之偏函数

  • 简单理解

    如int()函数可以把字符串转换成整数形式:

      print(int("1234"));#字符串转换成整数

int函数还提供了base参数,用来把字符串转换成N进制的数,默认是10.

	print(int("12345", base=8));

但是当我们要进行很多的值转换的时候,一个个传入函数的话,就会很低效,那么我们就可以编写一个这样的函数,让他能实现我们的想法。

	def int2(x, base=2):
return int(x, base) print(int2("100001"));#33
print(int2("1101110"));#110

向上面这样我们就不用多次输入int(x, base=n),python的functools.partial就帮我们创建了一个偏函数,不需要我们编写函数int2,可以直接创建一个int2函数:

	#偏函数
import functools;
int2 = functools.partial(int, base=2);
print(int2("11101"));#29

所以,functools.partial的作用就是,把一个函数的某些参数设置默认值,返回个新的函数,调用这个新函数会更简单。但也可以传入其他的值,如:int2("10010", base=10);

  • 总结

    当我们函数参数个数很多,需要简化时,我们可以使用python的functools.partial来创建一个偏函数来固定一些参数,使得我们在使用新函数的时候更加方便。

python函数式编程之返回函数、匿名函数、装饰器、偏函数学习的更多相关文章

  1. Python函数式编程:内置filter函数使用说明

    filter操作是函数式编程中对集合的重要操作之一,其作用是从原集合中筛选符合条件的条目,组成一个新的集合. 这在我们日常编程中是非常常见的操作.我们通常的做法是通过循环语句来处理. 而使用filte ...

  2. Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数

    Python 函数式编程 2 返回函数 返回函数的意思就是:函数作为返回值.(高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.) 举个例子:实现一个可变参数的求和. 正常的函数: de ...

  3. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  4. python函数式编程之匿名函数、装饰器、偏函数

    匿名函数 当我们在传入函数时,有些时候,不需要显式的定义函数,直接传入匿名函数就行.如下面 lambda x: x*x 在python中,关键字lambda表示匿名函数,冒号前面的x表示函数参数 匿名 ...

  5. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

  6. 转自:Python函数式编程指南(二):函数

    2. 从函数开始 2.1. 定义一个函数 如下定义了一个求和函数: 1 2 def add(x, y):     return x + y 关于参数和返回值的语法细节可以参考其他文档,这里就略过了. ...

  7. Python核心编程读笔 10:函数和函数式编程

    第11章 函数和函数式编程 一 调用函数  1 关键字参数 def foo(x): foo_suite # presumably does some processing with 'x' 标准调用 ...

  8. python 函数式编程:高阶函数,map/reduce

    python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...

  9. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

随机推荐

  1. JVM的JIT机制

    因为 JVM 的 JIT 机制的存在,如果某个函数被调用多次之后,JVM 会尝试将其编译成为机器码从而提高执行速度.

  2. Andrew Ng机器学习编程作业:K-means Clustering and Principal Component Analysis

    作业文件 machine-learning-ex7 1. K-means聚类 在这节练习中,我们将实现K-means聚类,并将其应用到图片压缩上.我们首先 从二维数据开始,获得一个直观的感受K-mea ...

  3. Activity # runOnUiThread 与 View # post

    There is no real difference, except that the View.post is helpful when you don't have a direct acces ...

  4. Python基础教程-Dict和Set

    Python的dict Python内置了字典:dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 比如,要根据同学的名字查找对应的 ...

  5. PAGELATCH_x和PAGEIOLATCH_x介绍

    Microsoft SQL Server企业级平台管理实践 第11章 Buffer Latch Timeout的解析 什么是PAGELATCH和PAGEIOLATCH 1.PAGELATCH_x和PA ...

  6. ajax请求真实服务器数据示例

    // http://study.163.com/webDev/couresByCategory.htm // http://study.163.com/webDev/couresByCategory. ...

  7. ORACLE常用性能监控SQL(二)

    查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, p ...

  8. Java集合(3):Vector && Stack

    一.Vector介绍 Vector可以实现可增长的动态对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删 ...

  9. Linq To Object多字段组合唯一校验

    1.第一种方式 if(partsSalesOrderTypes.GroupBy(entity => new { entity.Name, entity.Code }).Any(array =&g ...

  10. JavaScript:关闭当前页面(微信、电脑)

    WeixinJSBridge.call('closeWindow'); // 关闭微信浏览器 window.opener=null; window.open('','_self'); window.c ...