Python装饰器迭代器生成器

  Python中的装饰器本质是是一个函数,它可以装饰其他函数为其他函数添加附加功能。使用装饰器的原则是不能修改被装饰函数的源代码,不能修改被装饰函数的调用方式。

  一个装饰器它是由高阶函数加上嵌套函数组成的。 高阶函数+嵌套函数=装饰器。

  高阶函数的定义是把一个函数名当做一个实参传给另一个函数。高阶函数可以再不修改源代码的情况下为其添加功能。返回值中包含函数名是可以不修改函数的调用方式

  嵌套函数是在一个函数中用def定义一个函数。

 

def deco(func):

   star_time = time.time()

   func()

   stop_time = time.time()

   print('the func run time is %s'%(stop_time-star_time))

 这是一个高阶函数

 

def timer(func):  #timer(test)    func = timer

   def deco(*args,**kwargs):

        star_time = time.time()

         func(*args,**kwargs)  #run test

         stop_time =time.time()

         print('the func run time is %s'%(stop_time-star_time))

    return deco() 

这就是一个装饰器

@timer  #test = timer(test)

def test():

      time.sleep(3)

 

@timer

def test1(name,age)

   print('test1',name,age)

 

test1('zhang',23)

       print('in the test')

test()

 

当调用一个传参数的装饰器时:

def auth(authtype):

      def out_wrapper(func):

            def wrapper(*args,**kwargs):

                  if authtype = 'local'

                     username = input('username')

                     password = input('password')

                     if user ==username and passw == password:

                         print('success')

                      else:

                         exit('invadile')

                   else:

                     print('其他')

             reture wrapper

          return out_wrapper

@auth(authtupe == 'local')

def test():

    pirnt('local')

@auth(authtype = 'ldal')

def test():

   print('in the bbs')

 

 

-------------生成器------

生成器就是一种迭代器,拥有next方法并且与迭代器完全相同,也可以用于python中for循环中。

def get_0_1_2():

      yield 0

      yield 1

      yield 2

定义一个函数get_0_1_2但是这个函数内部使用关键字yield,是这个函数变成一个生成器。get_0_1_2 打印返回是一个内存地址。

生成器调用只能使用next方法进行,当遇见yield时暂停执行,并将yield的参数作为此次next方法的返回值。

之后每次在调用生成器的next的方法,生成器从上次暂停的位置恢复生成器,到再遇见yield时停止,并返回yield的参数。

如果当next方法调用时生成器函数结束,这次next方法会抛出StopIteration异常。

------迭代器------

可直接作用于for循环的数据类型:一类是集合数据类型,list,tuple,dict,set,str等;

一类是generator,包括生成器和带yield的generator function

可以用for循环的对象叫迭代对象 iterable

可以用next()函数调用并不断返回下一个值的对象称为迭代器对象 iterator

iter()可将迭代对象变成迭代器对像

可以用isinstance()判断一个对象是不是iterable对象。(在头文件导入from collections import Iterable)

 

 

 

   

 

posted on 2017-11-06 11:20  无聊怎么聊  阅读(406)  评论(0编辑  收藏  举报