2017.7.14總結(迭代器、閉包、裝飾器)

迭代器:
迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。

import collections     #導入模塊
isinstance(object,collections.Iterable)  #判斷一個對象是否可迭代
isinstance(object,collections.Iterator)  #判斷對象是否是迭代器

生成器都是 Iterator 對象,但 list 、 dict 、 str 雖然是 Iterable ,卻不是 Iterator 。
把 list 、 dict 、 str 等 Iterable 變成 Iterator 可以使用 iter() 函數:

ls = [x for x in range(10)]
it = iter(ls)

迭代器同樣可被next()調用

from xxx import xxx 等同于 xxx.xxx

from collections import Iterator == collections.Iterator

閉包:
在函數內部再定義一個函數,并且這個函數用到了外邊函數的變量,那么將這個函數以及用到的一些變量稱之為閉包

def outside(a,b):
        def inner(x):
               return a*x+b
         return inner

ret = outside(2,5)
print(ret(10))
>>25

1.閉包似優化了變量,原來需要類對象完成的工作,閉包也可以完成
2.由于閉包引用了外部函數的局部變量,則外部函數的局部變量沒有及時釋放,消耗內存

裝飾器:
裝飾器,功能就是在運行原來功能基礎上,加上一些其它功能,比如權限的驗證,比如日志的記錄等等。不修改原來的代碼,進行功能的擴展。
比如java中的動態代理,python的注解裝飾器
其實python的裝飾器,是修改了代碼。

def outside(func):
       def  inner():
            print('這是裝飾器')
            func()
       return inner

@outside
def run():
      print('這是主體')  

run()

>>這是裝飾器
>>這是主體

@outside可將run函數當參數調用

多個裝飾器,按照從里往外(從下往上)先后順序執行

def outside1(func):
    def inner1():
        return '——1——'+func()+'——1——'
    return inner1
    
def outside2(func):
    def inner2():
        return '——2——'+func()+'——2——'
    return inner2
    
@outside1
@outside2
def run():
    return('Irlans')

print(run())
>>——1————2——Irlans——2————1——

被裝飾的函數有參數

def outmost(pre):
    def outside(func):
        def inner():    
            print('%s%s'%(pre,func()))
        return inner
    return outside


@outmost('wangcai')
def run():
    return('今年5歲了')
    
run()
>>wangcai今年5歲了

被裝飾參數有不定長參數:

from time import ctime, sleep

def timefun(func):
    def wrappedfunc(*args, **kwargs):
        print(args)
        print(kwargs)
        print("%s called at %s"%(func.__name__, ctime()))
        func(*args,**kwargs)
    return wrappedfunc

@timefun
def foo(a, b, c,num):
    print(a+b+c)
    print(num)

foo(3,5,7,num=123)
>>(3, 5, 7)
>>{'num': 123}
>>foo called at Fri Jul 14 20:31:06 2017
>>15
>>123

類裝飾器:

class Test(object):

    def __init__(self, func):
        print("---初始化---")
        print("func name is %s"%func.__name__)
        self.__func = func

    def __call__(self):
        print("---裝飾器中的功能---")
        self.__func()


def laowang():
    print("----laowang---")


t = Test(laowang)
t()
>>---初始化---
>>func name is laowang
>>---裝飾器中的功能---
>>----laowang---
class Test(object):

    def __init__(self, func):
        print('id(self)=%s,id(func)=%s,func=%s'%(id(self),id(func),func))
        print("---初始化---")
        print("func name is %s"%func.__name__)
        self.__func = func

    def __call__(self):
        print("---裝飾器中的功能---")
        return self.__func()

@Test           #laowang = Test(laowang)
def laowang():
    return "----laowang---"

print(laowang())

print(id(laowang))
print(laowang)
>>func name is laowang
>>---裝飾器中的功能---
>----laowang---
>>18534296
>><__main__.Test object at 0x00000000011ACF98>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容