学习装饰器,首先听haifeng老师讲解了一下准备知识。

1.函数即变量

2.高阶函数+嵌套函数==》装饰器

装饰器的作用是在,1)不改变源代码,2)不改变原函数的调用方式的前提下为函数增加新的功能。

首先学习了最基本的装饰器

使用方法:在原先函数定义的上方加入@wrapper语法糖,等价于 func = wrapper(func)

如果原函数带参数,则在第二层函数加入(*args,**kwargs)

如果装饰器也需要带参数,则需要再次嵌套一层,并且参数传递的顺序为:

def deco(args):

  def first(args):

    def second(args):

    return second

  return first

@deco(args)    #args --> 装饰器第一层

def func(args):    #func --> 装饰器第二层  args --> 装饰器第三层
  pass

  1. #Authon Ivor
  2. import time
  3.  
  4. #装饰器
  5. def timer(func):
  6. def deco(*args,**kwargs):
  7. start_time = time.time()
  8. func(*args,**kwargs)
  9. stop_time = time.time()
  10. print("The program cost %s" % (stop_time-start_time))
  11. return deco
  12. #装饰方法
  13. @timer # 等价于 test1 = timer(test1)
  14. def test1():
  15. time.sleep(1.5)
  16. print("I'm in the test1 !")
  17. @timer
  18. def test2(name,age):
  19. time.sleep(0.5)
  20. print("%s's age is %s" % (name,age))
  21.  
  22. test1()
  23. test2("Ivor",25)

下面是武sir的博客,是高阶装饰器的一个小例子

  1. #!/usr/bin/env python
  2.  
  3. #coding:utf-8
  4.  
  5. def Before(request,kargs):
  6.  
  7. print 'before'
  8.  
  9. def After(request,kargs):
  10.  
  11. print 'after'
  12.  
  13. def Filter(before_func,after_func):
  14.  
  15. def outer(main_func):
  16.  
  17. def wrapper(request,kargs):
  18.  
  19. before_result = before_func(request,kargs)
  20.  
  21. if(before_result != None):
  22.  
  23. return before_result;
  24.  
  25. main_result = main_func(request,kargs)
  26.  
  27. if(main_result != None):
  28.  
  29. return main_result;
  30.  
  31. after_result = after_func(request,kargs)
  32.  
  33. if(after_result != None):
  34.  
  35. return after_result;
  36.  
  37. return wrapper
  38.  
  39. return outer
  40.  
  41. @Filter(Before, After)
  42.  
  43. def Index(request,kargs):
  44.  
  45. print 'index'

列表生成器、可迭代对象、迭代器

  1. #列表生成器
  2. #[i for i in range(100)]
  3.  
  4. #生成器
  5. #(i for i in range(100))
  6. #生成器只有在调用的时候才会生成相应的数据
  7. #只记录当前的位置
  8. #只有一个__next__()方法
  9.  
  10. #可迭代对象
  11. #from collections import Iterable
  12. #isinstance([],Iterable)
  13. #列表,字典,元组等都是可迭代对象
  14.  
  15. #迭代器
  16. #有next方法的才是迭代器
  17.  
  18. #能用for循环的都是可迭代对象
  19. #能用next方法的都是迭代器对象

协程,简单消费者模型

  1. #Authon Ivor
  2. import time
  3.  
  4. def consumer(name):
  5. print("我准备吃包子啦!")
  6. while True:
  7. baozi = yield
  8. print("包子(%s)来了,(%s)吃掉了!" % (baozi,name))
  9.  
  10. def producer():
  11. c1 = consumer("A")
  12. c2 = consumer("B")
  13. c1.__next__()
  14. c2.__next__()
  15. print("我开始做包子了!")
  16. for i in range(10):
  17. print("做好了一个!")
  18. time.sleep(1)
  19. c1.send(i)
  20. c2.send(i)
  21.  
  22. producer()

斐波那契数列

  1. #Authon Ivor
  2.  
  3. def fib(max):
  4. n,a,b=0,0,1
  5. for n in range(max):
  6. yield b
  7. a,b=b,a+b
  8. return "done"
  9.  
  10. f = fib(15)
  11. for i in f:
  12. print(i)

Python学习-day4的更多相关文章

  1. python学习day4软件目录结构规范

    为什么要设计好目录结构? 参考:http://www.cnblogs.com/alex3714/articles/5765046.html "设计项目目录结构",就和"代 ...

  2. Python学习day4 数据类型Ⅱ(列表,元祖)

    day4 知识补充&数据类型:列表,元祖 1.知识补充 1.编译型/解释型 编译型:在代码编写完成之后编译器将其变成另外一个文件教给你算计执行. 代表语言:Java,c,c++ ,c#, Go ...

  3. python学习day4 数据类型 if语句

    1.变量的内存管理 cpython解释器垃圾回收机制 什么是垃圾,当一个值身上没有绑定变量名时,(该值的引用计数=0时)就是一个垃圾 age=18 #18的引用计数=1 x=age  #18的引用计数 ...

  4. python学习day4之路文件的序列化和反序列化

    json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...

  5. python学习day4之路

    装饰器(http://egon09.blog.51cto.com/9161406/1836763) 1.装饰器:本质是函数: 装饰器(装饰其他函数),就是为其他函数添加附加功能: 原则:1.不能修改被 ...

  6. python学习day4

    目录 一.迭代器 二.yield生成器 三.装饰器 四.递归 五.基础算法 迭代器 #1.在不使用for循环的情况下 li = [11 ,22, 33, 44] #count = len(li) #s ...

  7. python学习Day4 流程控制(if分支,while循环,for循环)

    复习 1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开头__结尾的变量,魔法变量 - ...

  8. python学习 day4 (3月5日)---列表

    列表: 容器性数据 有序  可更改 大量数据 一.增 1.追加    append(objcet) 2.索引增加   Insert(index,元素) 3.迭代追加   extend(object) ...

  9. Python学习笔记,day4

    Python学习第四天 一.装饰器 函数调用顺序: 其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用 高阶函数: 满足下列条件之一就可成函数为高阶函数 某一函数当做参数传入 ...

随机推荐

  1. 帝国empirecms数据库数据表详细说明

    表名   解释 phome_ecms_infoclass_news 新闻采集规则记录表 phome_ecms_infotmp_news 采集临时表 phome_ecms_news 新闻主数据记录表 p ...

  2. ios uilabel 根据文字 计算宽度 高度

    //根据宽度求高度        + (CGFloat)getLabelHeightWithText:(NSString *)text width:(CGFloat)width font: (CGFl ...

  3. 看动画,秒懂人工智能&物联网

  4. 排序算法C语言实现

    大学有一门课程叫做数据结构,严蔚敏的课本,其中详细介绍了集中经典的排序算法,学习复习反复几次,但是直到现在仍然只记得名字了,所以想记录下来,随时复习直至牢记于心.经常面试的朋友知道,排序算法在面试中出 ...

  5. codeforecs Gym 100286B Blind Walk

    交互式程序,要用到一个函数fflush,它的作用是对标准输出流的清理,对stdout来说是及时地打印数据到屏幕上,一个事实:标准输出是以『行』为单位进行的,也即碰到\n才打印数据到屏幕.这就可能造成延 ...

  6. 两个有序数列,求中间值 Median of Two Sorted Arrays

    原题: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the ...

  7. c++链表-双向链表+增删查改

    基于双向链表的增删改查和排序(C++实现) 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前 ...

  8. python 函数内使用全局变量

    x = def change_global(): global x x = x + change_global() print(x) result: 2

  9. Python——字典dict()详解

    一.字典 字典是Python提供的一种数据类型,用于存放有映射关系的数据,字典相当于两组数据,其中一组是key,是关键数据(程序对字典的操作都是基于key),另一组数据是value,可以通过key来进 ...

  10. 类库日期和jsp导包

    一.日期类库 1.1. Date Date类创建一个时间,或者是创建一个与你计算机当前的时间:精确到毫秒. //实例化时间类 Date date = new Date(); 1.2.格式转换类 1.2 ...