设为首页 收藏本站
查看: 851|回复: 0

[经验分享] [持续更新]Python 笔记

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-29 11:37:36 | 显示全部楼层 |阅读模式
  本文以 Python 2.7 为基础。
  

lambda 函数实现递归
  方法一:传递一个 self 参数
  求阶乘:



1 frac = lambda self, x: self(self, x - 1) * x if x > 1 else 1
2 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,修饰器,顾名思义就是对函数进行「修饰」(即添加一些功能)的语法糖。一个简单的例子如下:



1 def transform(func):
2     print 'Hello, '
3     return func
4
5 @transform
6 def world():
7     print 'World!'
8
9 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!'。
  接下来看被修饰的函数被替换为新的函数实例的情况:



1 def transform(func):
2     def inside():
3         print 'Hello,',
4         func()
5     return inside
6
7
8 @transform
9 def world():
10     print 'World!'
11
12 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 的带参数用法也请参考此文。)
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144879-1-1.html 上篇帖子: 在SAE上布置Python+Django+MySQL的过程 下篇帖子: Python闭包与函数对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表