[持续更新]Python 笔记
本文以 Python 2.7 为基础。
lambda 函数实现递归
方法一:传递一个 self 参数
求阶乘:
frac = lambda self, x: self(self, x - 1) * x if x > 1 else 1
print frac(frac, 4)
方法二(匿名函数实现递归):将一个完整的 lambda 函数体作为参数
求最大公因数:
(lambda a, b, s = lambda a, b, f: f(b, a % b, f) if b else a: s(a, b, s))(3, 5)
由此可以用一行代码求多个数的最小公倍数:
(lambda *args: reduce(lambda a, b: a * b / (lambda a, b, s = lambda a, b, f: f(b, a % b, f) if b else a: s(a, b, s))(a, b), args))(2, 3, 4)
Decorator
Decorator,修饰器,顾名思义就是对函数进行「修饰」(即添加一些功能)的语法糖。一个简单的例子如下:
def transform(func):
print 'Hello, '
return func @transform
def world():
print 'World!' world()
通过在 world 函数的定义之前添加一句 @transform 完成 transform 函数对 world 函数的修饰,上面这段程序的运行结果是输出 'Hello, World!'
事实上,@transform 一句被解释为 world = transform(world),从中可以看出:
1. transform 函数的返回值应该是一个函数;
2. 在 @transform 时 transform 函数被执行了一次;
3. world 函数将会成为一个新的函数的实例(尽管在这个例子中它还是它本身)。
那么对上面的代码的实质有了一些解释:
1. 'Hello, '这部分实际上在 world 函数定义完成时输出,所以即使不调用 world 函数也会输出 'Hello, ' 这部分;
2. 'World!'这部分在调用 world 函数时输出;
3. 由于 world 函数本身的内容并没有发生变化,所以如果第二次调用 world,将只是输出 'World!'。
接下来看被修饰的函数被替换为新的函数实例的情况:
def transform(func):
def inside():
print 'Hello,',
func()
return inside @transform
def world():
print 'World!' world()
对这段代码的解释:
1. 由于 transform 函数内部只是定义了另外一个函数而没有执行其他实际(输出)操作,所以 @transform 一句执行时并没有任何输出;
2. world 函数在 @transform 一句执行之后内容被替换为了 inside 函数的内容,而 inside 函数实际上执行了两部分内容:第一步是输出 'Hello, ',第二步是执行原来的 world 函数的内容,即输出 'World!'。所以新的 world 函数实际上也也是执行了这样两个输出;
3. 由于 world 函数的实际内容已经发生变化,所以如果第二次执行 world 函数输出的也是 'Hello, World!'。
Decorator 的好处:
「将函数的约束放置于接口处,使意图更加明了,同时又不增加调用者的负担。」(引用自http://blog.csdn.net/thy38/article/details/4471421 Python Decorator 的带参数用法也请参考此文。)
2017年8月3日更新:
带参数的 decorator:
def wrapper(arg):
def decorator(func):
print arg
return func
return decorator @wrapper("hello ")
def func():
print "world"
Multiple decorators apply in nested fashion, for example:
@f1(arg)
@f2
def func(): pass
is roughly equivalent to
def func(): pass
func = f1(arg)(f2(func))
实际应用
Flask 中的 Flask.route()
def route(self, rule, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
形如 @app.route 这样的写法实际上只是调用了 add_url_rule 方法。
实现 Multimethod
http://www.artima.com/weblogs/viewpost.jsp?thread=101605
本质
Decorator 的本质是 higher-order function call 的语法糖,其本身并没有什么强大之处, 只不过为函数变换提供了直观简单的语法结构。
[持续更新]Python 笔记的更多相关文章
- [持续更新] Python学习、使用过程中遇见的非代码层面知识(想不到更好的标题了 T_T)
写在前面: 这篇博文记录的不是python代码.数据结构.算法相关的内容,而是在学习.使用过程中遇见的一些没有技术含量,但有时很令人抓耳挠腮的小东西.比如:python内置库怎么看.python搜索模 ...
- web开发工具flask中文英文书籍-持续更新
web开发工具flask中文英文书籍-持续更新 python测试开发_AI命理关注 0.9222018.11.10 07:48:43字数 625阅读 885 python测试开发项目实战-目录 pyt ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- BLE资料应用笔记 -- 持续更新
BLE资料应用笔记 -- 持续更新 BLE 应用笔记 小书匠 简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.'让我们'更深入地探索这些方面吧. 蓝牙无处不在-,您可以在几乎每一台电话.笔记本电 ...
- Python开发【第二十三篇】:持续更新中...
Python开发[第二十三篇]:持续更新中...
- 状压dp(状态压缩&&dp结合)学习笔记(持续更新)
嗯,作为一只蒟蒻,今天再次学习了状压dp(学习借鉴的博客) 但是,依旧懵逼·································· 这篇学习笔记是我个人对于状压dp的理解,如果有什么不对的 ...
- 好用的函数,assert,random.sample,seaborn tsplot, tensorflow.python.platform flags 等,持续更新
python 中好用的函数,random.sample等,持续更新 random.sample random.sample的函数原型为:random.sample(sequence, k),从指定序列 ...
- Python奇技淫巧 - 持续更新中....
Python奇技淫巧 人生苦短,我用Python: 编程界这绝对不是一句空话,尤其是对于使用过多个语言进行工作的同学们来说,用Python的时间越长,越有一种我早干嘛去了的想法,没事,啥时候用Pyth ...
- LeetCode 题目的 Python 实现(持续更新中)
Python-LeetCode 是一个使用 Python 语言解决 LeetCode 问题的代码库,库有以下几个方面需要注意: 所有题目都是 AC 的: 按照题目顺序,每 50 个放在一个目录下,方便 ...
随机推荐
- 位运算 进制转化 STL中bitset用法
2017-08-17 16:27:29 writer:pprp /* 题目名称:输入十进制以二进制显示 程序说明:同上 作者:pprp 备注:无 日期:2017/8/17 */ #include &l ...
- [WCF安全3]使用wsHttpBinding构建基于SSL与UserName授权的WCF应用程序
上一篇文章中介绍了如何使用wsHttpBinding构建UserName授权的WCF应用程序,本文将为您介绍如何使用wsHttpBinding构建基于SSL的UserName安全授权的WCF应用程序. ...
- Android -- 提交数据到服务器,Get Post方式, 异步Http框架提交
1. 发送请求到服务器有几种方式 (1)HttpURLConnection (2)Httpclient 同步框架 (3)AsyncHttpClient 异步框架 (https://github.com ...
- Codeforces Round #359 (Div. 2) C. Robbers' watch 鸽巢+stl
C. Robbers' watch time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 【三小时学会Kubernetes!(四) 】Deployment实践
Deployment 部署 Kubernetes 部署可以帮助每一个应用程序的生命都保持相同的一点:那就是变化.此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出 ...
- Java网络编程学习A轮_02_抓包分析TCP三次握手过程
参考资料: https://huoding.com/2013/11/21/299 https://hpbn.co/building-blocks-of-tcp/#three-way-handshake ...
- JavaScript内部原理系列-执行上下文(Execution Context)
概要 本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型. 定义 每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文.执行上下文(简称:EC)是个抽 ...
- java.net.SocketException: Connection reset 问题分析
1. socket编程时容易碰到如下异常: java.net.SocketException: Connection reset by peer: socket write error at java ...
- S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则
注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html < ...
- [洛谷U62364]三次函数极值
U62364 三次函数极值 题面 给定一个三次函数\(f(x)=a_3x^3+a_2x^2+a_1x+a_0\) 求其极值. 格式 输入包括一行四个整数\(a_3,a_2,a_1,a_0\) 输出包括 ...