Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数
Python 函数式编程 2
返回函数
返回函数的意思就是:函数作为返回值。(高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。)
举个例子:实现一个可变参数的求和。
正常的函数:
def calc_sum(*args):
ax = 0
for n in args:
ax = ax + n
return ax
返回函数的函数,其实和上面的函数很像:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
调用lazy_sum()时,返回的并不是求和结果,而是求和函数:
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
调用函数f()时,才真正计算求和的结果:
>>> f()
25
当
lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
要注意:调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数,得到的两个返回函数也不是一样的:
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
参考网站:
https://www.zhihu.com/question/20125256
匿名函数
匿名函数就是带有lambda关键字的公式。
比如函数:
def f(x):
return x * x
可以写成匿名函数的样子:
>>> f = lambda x: x * x
使用匿名函数:
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25
同样,也可以把匿名函数作为返回值返回:
def build(x, y):
return lambda: x * x + y * y
装饰器
>>> def now():
... print('2015-3-25')
...
>>> now()
2015-3-25
函数对象有一个__name__属性,可以拿到函数的名字:
>>> now.__name__
'now'
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。decorator就是一个返回函数的高阶函数。
举例,我们来定义一个能打印日志的decorator:
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
把decorator置于函数的定义处:
@log
def now():
print('2015-3-25')
现在再调用now()函数:
>>> now()
call now():
2015-3-25
看到了吧,call now():就是log装饰器输出的信息。
把@log放到now()函数的定义处,相当于执行了语句:
now = log(now)
偏函数
偏函数就是:举例:
假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去:
def int2(x, base=2):
return int(x, base)
这样运行int2():
>>> int2('1000000')
64
>>> int2('1010101')
85
这个int2()函数就叫做:偏函数。
functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2()。
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数。
再举个例子:
max2 = functools.partial(max, 10)
实际上会把10作为*args的一部分自动加到左边,也就是:
max2(5, 6, 7)
相当于:
args = (10, 5, 6, 7)
max(*args)
参考网站:
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317848428125ae6aa24068b4c50a7e71501ab275d52000
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143184474383175eeea92a8b0439fab7b392a8a32f8fa000
Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数的更多相关文章
- Learning Python 012 函数式编程 1 高阶函数
Python 函数式编程 1 高阶函数 高阶函数 Q:什么是高阶函数? A:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数. 简单举个例子: def add(x, y, f): return ...
- python面对对象编程中会用到的装饰器
1.property 用途:用来将对像的某个方法伪装成属性来提高代码的统一性. class Goods: #商品类 discount = 0.8 #商品折扣 def __init__(self,nam ...
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
- python函数式编程之返回函数、匿名函数、装饰器、偏函数学习
python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...
- Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...
- day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- python基础-函数式编程
python基础-函数式编程 高阶函数:map , reduce ,filter,sorted 匿名函数: lambda 1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层 ...
- 可爱的 Python : Python中函数式编程,第一部分
英文原文:Charming Python: Functional programming in Python, Part 1 摘要:虽然人们总把Python当作过程化的,面向对象的语言,但是他实际上包 ...
随机推荐
- eclipse新建Maven项目
1.在eclipse中安装maven插件 2.点击File->new->maven project,出现弹窗后点击next. 接着在弹窗Select an Archetype中,filte ...
- android客户端登录&注册的实现
MainActivity多线程的实现: package com.example.loginconnect; import java.lang.ref.WeakReference; import jav ...
- 1.微信小程序-B站:前言准备
前言 <微信小程序开发-B站>是以bilibili移动端网站为基础开发微信小程序版本,笔者喜欢的学习是愉快.轻松并能学到实战的东西,不知各位观友有没有一样的经历,就是一有问题不是先去Goo ...
- Fireworks(whole page)
<!DOCTYPE HTML> <html> <head> <title>Canvas 实现放烟花特效</title> <meta c ...
- 英语发音规则---Y字母
英语发音规则---Y字母 一.总结 一句话总结: 1.Y字母在单词最前面读发[j]? yes /jes/ [jɛs] n. 是 yard /jɑːd/ [jɑd] n. 院子 yellow /'jel ...
- cin.get(),cin.getline(),getline(),gets(),getchar()
1.cin.get() (1).cin.get()-------提取单个字符,可以提取回车.空格 a=cin.get(); (2) 同(1)---------------提取单个字符,可以提取回车.空 ...
- pyqt5信号与槽2
信号和槽与类的属性和方法在层次上是相同的,同属与一个类的特征. 信号的定义由工厂函数生成: signal=PyQt5.QtCore.pyqtSignal(types[, name[, result[, ...
- xxx was built without full bitcode" 编译错误解决
xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...
- tensorflow中常量(constant)、变量(Variable)、占位符(placeholder)和张量类型转换reshape()
常量 constant tf.constant()函数定义: def constant(value, dtype=None, shape=None, name="Const", v ...
- Mybatis学习--Java API
学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/java-api.html#directoryStructure 既然你已经知道如何配 ...