Python学习-day4

学习装饰器,首先听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

#Authon Ivor
import time

#装饰器
def timer(func):
    def deco(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)
        stop_time = time.time()
        print("The program cost %s" % (stop_time-start_time))
    return deco
#装饰方法 @timer # 等价于 test1 = timer(test1) def test1(): time.sleep(1.5) print("I'm in the test1 !")
@timer
def test2(name,age): time.sleep(0.5) print("%s's age is %s" % (name,age)) test1() test2("Ivor",25)


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

#!/usr/bin/env python

#coding:utf-8

  

def Before(request,kargs):

    print 'before'

      

def After(request,kargs):

    print 'after'

  

  

def Filter(before_func,after_func):

    def outer(main_func):

        def wrapper(request,kargs):

              

            before_result = before_func(request,kargs)

            if(before_result != None):

                return before_result;

              

            main_result = main_func(request,kargs)

            if(main_result != None):

                return main_result;

              

            after_result = after_func(request,kargs)

            if(after_result != None):

                return after_result;

              

        return wrapper

    return outer

      

@Filter(Before, After)

def Index(request,kargs):

    print 'index'

 

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

#列表生成器
#[i for i in range(100)]

#生成器
#(i for i in range(100))
#生成器只有在调用的时候才会生成相应的数据
#只记录当前的位置
#只有一个__next__()方法

#可迭代对象
#from collections import Iterable
#isinstance([],Iterable)
#列表,字典,元组等都是可迭代对象

#迭代器
#有next方法的才是迭代器

#能用for循环的都是可迭代对象
#能用next方法的都是迭代器对象


协程,简单消费者模型

#Authon Ivor
import time

def consumer(name):
    print("我准备吃包子啦!")
    while True:
        baozi = yield
        print("包子(%s)来了,(%s)吃掉了!" % (baozi,name))


def producer():
    c1 = consumer("A")
    c2 = consumer("B")
    c1.__next__()
    c2.__next__()
    print("我开始做包子了!")
    for i in range(10):
        print("做好了一个!")
        time.sleep(1)
        c1.send(i)
        c2.send(i)

producer()

 

斐波那契数列

#Authon Ivor

def fib(max):
    n,a,b=0,0,1
    for n in range(max):
        yield b
        a,b=b,a+b
    return "done"

f = fib(15)
for i in f:
    print(i)
View Code

 

posted on 2017-02-09 14:46  DarkSugar  阅读(207)  评论(0编辑  收藏  举报

导航