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. is和==的区别以及编码、解码

    一.is和==的区别 1,id( ) id( )是python的一个内置函数,通过id( )我们可以查看到一个变量表的值在内存中的地址: s1 = 2 print(id(s1)) # 15143680 ...

  2. Selenium 安装与卸载

    安装: 在cmd中键入pip install selenium==3.6.0(等号后面的为版本号),并点击回车,当出现Successfully installed selenium-3.6.0即表示已 ...

  3. DL for objection detection

    在计算机视觉领域,"目标检测"主要解决两个问题:图像上多个目标物在哪里(位置),是什么(类别).围绕这个问题,人们一般把其发展历程分为3个阶段:1. 传统的目标检测方法2. 以R- ...

  4. rails timeout 异常

    发现经常有”超时“的错误信息,如/usr/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill': execution expired (Timeout::Error),恩 ...

  5. 关于maven包冲突的一些思路

    在最近的项目中出现了很多包冲突,有时一下子就能猜到错误,但是有写往往需要很久都不能定位问题,尤其是项目人员参差不齐,有时为了方便私自引入一些工具类,而未考虑到项目本身. maven的出现方便了我们的包 ...

  6. PAT 天梯赛 L1-003. 个位数统计

    题目链接 https://www.patest.cn/contests/gplt/L1-003 题意 计算每个不同数字出现的次数 思路 可以用 MAP标记, 也可以直接用数字 存 AC代码 #incl ...

  7. powerdesigner解决创建多个表表主键名称重复的问题

    选择菜单栏的tools选项,选择Model  Options..,选择Model Settings  只要将图片中的选择打钩去掉即可(操作步骤1),同时设置为默认选项(操作步骤2),防止以后问题又出现 ...

  8. CSS 边距和填充

    margin and padding are the two most commonly used properties for spacing-out elements. A margin is t ...

  9. LVS管理工具--ipvsadm

    一. ipvsadm工具介绍 从2.4版本开始,linux内核默认支持LVS.要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm. LVS的结构主要分为两部分: 工作在内核空间的IPVS ...

  10. Sybase:SAP IQ学习笔记

    Sybase:SAP IQ学习笔记 -- 启动IQ管理 >> start_iq -n utility_db -n utility_db >> dbisql -c "u ...