Python中的迭代器

來源:互聯網
上載者:User

標籤:定義   外部   方法   return   lis   函數調用   try   nbsp   迭代   

一 : 函數名的運用

  1.函數名的記憶體位址

def func():    print("呵呵")print(func)結果:<function func at 0x1101e4ea0>

  2.函數名可以賦值給其他變數

  

def func():    print("呵呵")print(func)a = func # 把函數當成一個變數賦值給另一個變數a() # 函數調用 func()

  3.函數名可以當做容器類的元素

def func1():    print("呵呵")def func2():    print("呵呵")def func3():    print("呵呵")lst = [func1, func2, func3]for i in lst:    i()

  4.函數名可以當做函數的參數

def func():    print("吃了了麼")def func2(fn):    print("我是func2")    fn() # 執?行行傳遞過來的fn    print("我是func2")func2(func) # 把函數func當成參數傳遞給func2的參數fn.

  5.函數名可以作為函數的傳回值

  

def func_1():    print("這裡是函數1")    def func_2():        print("這裡是函數2")    print("這裡是函數1")    return func_2fn = func_1() # 執行函數1. 函數1返回的是函數2, 這時fn指向的就是上面函數2fn() # 執行上面返回的函數

二 : 閉包

  閉包就是內層函數,對外層函數(非全域)的變數的引用

  

def func1():    name = "alex"    def func2():        print(name) # 閉包    func2()func1()結果:alex    

  我們可以使用__closure__來檢測函數是否是閉包,返回cell就是閉包,返回None就不是.

  

def func1():    name = "alex"    def func2():        print(name) # 閉包    func2()    print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)func1()

  在函數外邊調用內建函式的方法:

def outer():    name = "alex"    # 內建函式    def inner():        print(name)    return innerfn = outer() # 訪問外部函數, 擷取到內建函式的函數地址fn() # 訪問內建函式

  同樣的,當有多層嵌套的時候:

def func1():    def func2():        def func3():            print("嘿嘿")        return func3    return func2    func1()()()

   使用閉包的好處 : 可以保證外層函數中的變數在記憶體中常駐,供後邊的程式使用

三 : 迭代器

  首先明確一個概念--可迭代對象,即str,list,tuple,dict,set,他們之所以是可迭代對象,是因為遵循了可迭代協議,通過dir()函數查看類中定義的所有方法,如果其中存在__iter__,那麼這個類的對象就是可迭代對象.Iterable意為可迭代對象,Iterator意為迭代器,這是兩個概念.

l = [1,2,3]l_iter = l.__iter__()from collections import Iterablefrom collections import Iteratorprint(isinstance(l,Iterable)) #Trueprint(isinstance(l,Iterator)) #Falseprint(isinstance(l_iter,Iterator)) #Trueprint(isinstance(l_iter,Iterable)) #True

  可以看到迭代器l執行了__iter__()方法之後獲得了一個迭代器l_iter,可迭代對象不一定是迭代器,迭代器卻一定是可迭代對象,那麼迭代器是如何啟動並執行呢,再看一段代碼:

s = "我愛北京天安門"c = s.__iter__() # 擷取迭代器print(c.__next__()) # 使用迭代器進行迭代. 擷取一個元素 我print(c.__next__()) # 愛print(c.__next__()) # 北print(c.__next__()) # 京print(c.__next__()) # 天print(c.__next__()) # 安print(c.__next__()) # 門print(c.__next__()) # StopIteration

  可以知道迭代器每次執行__next__()函數會返回可迭代對象的一個元素,當迭代完成再執行__next__()會報錯StopIteration,知道迭代器的原理之後,我們回頭再看for迴圈的原理:

  

for i in [1,2,3]:    print(i)lst = [1,2,3]lst_iter = lst.__iter__()while True:    try:        i = lst_iter.__next__()        print(i)    except StopIteration:        break

  總結:

    Iterable: 可迭代對象. 內部包含__iter__()函數
    Iterator: 迭代器. 內部包含__iter__() 同時包含__next__().
    迭代器的特點:
      1. 節省記憶體.
      2. 惰性機制
      3. 不能反覆, 只能向下執行.

Python中的迭代器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.