1. 程式人生 > >Python概念之裝飾器、叠代器、生成器

Python概念之裝飾器、叠代器、生成器

tuple 序列 包含 bsp 返回 nbsp 繼續 %s 理解

裝飾器、叠代器、生成器均屬於函數知識範疇

1.裝飾器

理解裝飾器,首先要了解閉包函數。

閉包函數:1、定義在函數內部的函數;

     2、該函數的函數體代碼包含對外部作用域(而不是全局作用域)名字的引用;

     3、通常將閉包函數用return返回,然後可以任意調用。

eg:以下代碼中inner()即閉包函數

def outer():
x=1
def inner():
print(x)
return inner
f=outer()

裝飾器:即是一種閉包函數的應用。

什麽是裝飾器?:裝飾它人的器具,本身可以是任意可調用對象,被裝飾者也可以是任意可調用對象。

裝飾器的原則:1、不修改被裝飾對象的源代碼 2、不修改被裝飾對象的調用方式
裝飾器的目標:在遵循1和2的前提下,為被裝飾對象添加上新功能

import time
def timmer(func):
    def inner():
        start=time.time()
        res=func()
        stop=time.time()
        print(run time is %s %(stop-start))
        return res
    return inner

@timmer #index=timmer(index)  
def index(): time.sleep(1) print(welecome to index) return 1111 res=index() print(res)

2.叠代器

叠代器:叠代器即叠代的工具。

什麽是叠代?:指的是一個重復的過程,每一次重復稱為一次叠代,並且每一次重復的結果是下一次重復的初始值

為什麽要有叠代器?:對於序列類型:str,list,tuple,可以依賴索引來叠代取值,但是對於dict,set,文件,python必須為我們提供一種不依賴於索引的叠代取值的方式-》叠代器

什麽是可叠代對象?:可叠代對象指的是內置有__iter__方法的對象,即obj.__iter__,如下

‘hello‘.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{‘a‘:1}.__iter__
{‘a‘,‘b‘}.__iter__
open(‘a.txt‘).__iter__

什麽是叠代器對象?:可叠代對象執行obj.__iter__()得到的結果就是叠代器對象,而叠代器對象指的是即內置有__iter__又內置有__next__方法的對象

文件類型是叠代器對象:
open(‘a.txt‘).__iter__()
open(‘a.txt‘).__next__()

註意:叠代器對象一定是可叠代對象,可叠代對象不一定是叠代器對象。

eg:

d={name:lili,age:18,sex:male}
d_iter=iter(d)
# d_iter=iter(d)
while True:
    try:
        print(next(d_iter))
    except StopIteration:
        break

優點:
提供一種統一的、不依賴於索引的取值方式
叠代器同一時間在內存只有一個值,更節省內存
缺點:
只能往後取,並且是一次性的
不能統計值的個數,即長度

3.生成器

什麽是生成器?:只要在函數體內出現yield關鍵字,那麽再執行函數就不會執行函數代碼,會得到一個結果,該結果就是生成器

生成器就是叠代器

def func():
    print(=====>1)
    yield 1
    print(=====>2)
    yield 2
    print(=====>3)
    yield 3
g=func()# g.__iter__
res1=next(g)
print(res1)

res2=next(g)
print(res2)

res3=next(g)
print(res3)

yield的功能:
1、yield為我們提供了一種自定義叠代器對象的方法
2、yield與return的區別1:yield可以返回多次值 #2:函數暫停與再繼續的狀態是由yield幫我們保存的

Python概念之裝飾器、叠代器、生成器