装饰器:

  在函数代码功能运行期间动态增加功能的方式叫做装饰器(Decorator)。它对一个函数或者类进行再加工。

  我们先定义两个函数,一个计算两数和,一个计算两数差。

 >>> def square_sum(a,b):
... return a + b
...
>>> def square_diff(a,b):
... return a - b
...
>>> print(square_sum(3,4))
7
>>> print(square_diff(9,5))
4

  如果我们想要给这个函数再加其他功能呢,如打印出输入的参数值,我们可能会这样:

 >>> def square_sum(a,b):
... print 'input:',a,b
... return a + b
...
>>> print(square_sum(3,4))
input: 3 4
7

  在python中,我们可以利用装饰器这么干:

 >>> def decorator(f):
... def new_f(a,b):
... print 'input',a,b
... return f(a,b)
... return new_f
...
>>> @decorator
... def square_sum(a,b):
... return a + b
...
>>> @decorator
... def square_diff(a,b):
... return a - b
...
>>> print(square_sum(3,4))
input 3 4
7
>>> print(square_diff(9,5))
input 9 5
4

  在上面的例子中,装饰器接受一个函数作为输入参数,并返回一个新的函数,装饰器新建了一个可用函数new_f,在这个函数中我们增加了打印功能,并通过调用之前的函数f来实现原来函数的功能。当我们在调用square_sum(3,4)的时候就等同于

  square_sum = decorator(square_sum)

  square_sum(3,4)

  这样的好处是提高了代码的可复用性!

  在上面的装饰器中,它默认他后面的函数是他的唯一参数,如果我们想传其他参数怎么办呢,比如@decorator(a),我们可以这样:

 >>> def pre_str(pre=''):                #一层新函数
... def decorator(f): #原来的装饰器
... def new_f(a,b):
... print(pre + "input", a, b)
... return f(a,b)
... return new_f
... return decorator
...
>>> @pre_str('balabala')
... def square_sum(a,b):
... return a+b
...
>>> print(square_sum(3,4))
('balabalainput', 3, 4)
7

  装饰类:

  一个装饰类可以接收一个类,并返回一个类,起到加工类的效果!

 >>> def decorator(aClass):
... class newClass:
... def __init__(self,age):
... self.total_display = 0
... self.wrapped = aClass(age)
... def display(self):
... self.total_display += 1
... print "total display",self.total_display
... self.wrapped.display()
... return newClass
...
>>> @decorator
... class Bird:
... def __init__(self,age):
... self.age = age
... def display(self):
... print "My age is",self.age
...
>>> eagleLord = Bird(5)
>>> for i in range(3):
... eagleLord.display()
...
total display 1
My age is 5
total display 2
My age is 5
total display 3
My age is 5

  生成器:

  生成器是为了避免构造一个超大的列表,是一边循环一边计算的机制!

 >>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x02140620>
>>> g.next()
0
>>> g.next()
1

  generator保存的是算法,每次都需要调用next来进行计算出下一个元素的值,是可迭代的,我们可以通过for来访问他。在函数中可以用yield进行中断输出!

  上下文管理器:

  用于规定某个对象的适用范围,类比于using(){}   在python中是 with...as...

 # without context manager
f = open("new.txt", "w")
print(f.closed) # whether the file is open
f.write("Hello World!")
f.close()
print(f.closed) # with context manager
with open("new.txt", "w") as f:
print(f.closed)
f.write("Hello World!")
print(f.closed)

  上面两断代码执行的操作是一样的,通过with  as 在超出范围之后自动进行了f的释放!

自学Python三 Python中的屠龙刀(续)的更多相关文章

  1. 自学Python一 迷茫中的开端!

    有心学习一下Python,多门技术多条路啊.经历了找教程,看代码,写demo,这东西入门容易精通难啊!又因为请了两周婚假彻底忘光光.想了想自己还是边复习边写点什么东西吧.很多技术,新东西都是看了n多, ...

  2. 每天自学两小时Python,整理了最详细的学习路线和规

    上次这篇文章每天自学两小时Python,三个月学通月入20K主要是给大家整理了学习资料视频和PDF书籍,很多需要的都关注私信领取了. 很多朋友领取之后都问我教程有了那么应该从哪去开始学习呢,私信太多我 ...

  3. Python进阶-继承中的MRO与super

    Python进阶-继承中的MRO与super 写在前面 如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,supe ...

  4. Python基础---python中的异常处理

    Python中的异常处理 一.什么是异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常) 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关) ...

  5. 用python在excel中读取与生成随机数写入excel中

    今天是我第一次发博客,就关于python在excel中的应用作为我的第一篇吧. 具体要求是:在一份已知的excel表格中读取学生的学号与姓名,再将这些数据放到新的excel表中的第一列与第二列,最后再 ...

  6. Python源码中的PyCodeObject

    1.Python程序的执行过程 Python解释器(interpreter)在执行任何一个Python程序文件时,首先进行的动作都是先对文件中的Python源代码进行编译,编译的主要结果是产生的一组P ...

  7. 三. Python基础(3)--语法

    三. Python基础(3)--语法 1. 字符串格式化的知识补充 tpl = "我是%s,年龄%d,学习进度100%" %('Arroz',18) print(tpl) # 会提 ...

  8. python读写文件中read()、readline()和readlines()的用法

    python中有三种读取文件的函数: read() readline() readlines() 然而它们的区别是什么呢,在平时用到时总会遇到,今天总结一下. 0. 前期工作 首先新建一个文件read ...

  9. python基础---->python的使用(三)

    今天是2017-05-03,这里记录一些python的基础使用方法.世上存在着不能流泪的悲哀,这种悲哀无法向人解释,即使解释人家也不会理解.它永远一成不变,如无风夜晚的雪花静静沉积在心底. Pytho ...

随机推荐

  1. Java基本概念(未完)

    仅简单总结~辅助快速回忆~ 一.JVM 1,Java类加载机制 Java程序由多个类文件组成,按需加载. Java的动态扩展是由运行期动态加载和动态链接实现的.——动态绑定,多态. 加载步骤: 1)装 ...

  2. DB2日常维护——REORG TABLE命令优化数据库性能

    一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止一些错误重复发生. 由于DB2使用CBO作为数据库的优化器,数据库对象的状 ...

  3. 简单JS实现对表的行的增删

    这段代码非常的简单,仅仅作为自己的一个小小的记录! ok,先上一个简单的图例,效果如下(注意:这只是一个简单的例子,不过可以根据这个简单的例子,变化出更为复杂的效果)! 代码也非常的简单,如下所示(注 ...

  4. 学习总结 java Iterator迭代器练习

    package com.hanqi.jh; import java.util.*; public class Text3 { public static void main(String[] args ...

  5. 来自Google产品管理和营销高级副总裁Jonathan Rosenberg的42条军规(转)

    #35 营造一个说 yes 的文化 你想要建立一个充满正能量和积极思考的地方.“组织里有阻碍变革发生的抗体.所以许多大公司无法创新.如果你是一个创新者,你就变成了病毒,所有的抗体都想杀死你.”在这种情 ...

  6. C语言 不看怎么存,只看怎么读 ,短字节长字节之间的转换

    不看怎么存,只看怎么读 e.g. int a = 010; //8以8进制存 int b = 8;//8以10进制存 printf("%d %d\n",a,b); 以十进制取 a和 ...

  7. devexpress中如何绑定ASPxTreeList控件

    效果图: //前端控件代码: <dx:ASPxTreeList ID="Tree_Gooslist" AutoGenerateColumns="False" ...

  8. PAT1013

    #include<cstdio>#include<cstring>#include<vector>using namespace std;const int max ...

  9. SQLServer、MySQL、Oracle语法差异小集锦

    一.差异集锦 在建表的时候,只有自增的语法不同. 下面给出3种数据库通用的建表与初始化测试语句: CREATE TABLE Country( Id int PRIMARY KEY, Name ) ); ...

  10. hadoop-集群管理(1)——配置文件

    1. 配置文件列表如下: [tianyc@Route conf]$ pwd/home/tianyc/hadoop-1.0.4/conf[tianyc@Route conf]$ ll总用量 76-rw- ...