迭代器

一.函數名的應用python

  函數名是一個變量,但它是一個特殊的變量,與括號配合能夠執行函數閉包

  1.函數名的內存地址函數

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

  2.函數名能夠賦值給其餘變量對象

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

  3.函數名能夠當作容器類的元素blog

def func1():       
     print("呵呵") 
def func2():    
    print("呵呵") 
def func3():    
    print("呵呵") 
def func4():    
    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.函數名能夠做爲函數的返回值it

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

  二.閉包:閉包就是內層函數,對外層函數(非全局)的變量的引用.io

   好處:  for循環

     1.保護變量不受外界影響function

     2.能夠讓變量常駐內存

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 inner 
fn = outer()   # 訪問外部函數, 獲取到內部函數的函數地址 
fn()    # 訪問內部函數

  多層嵌套時,一層一層返回便可

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

  Python中規定,若是你在內部函數中訪問了外層函數中的變量,那麼這個變量將不會消亡,將會常駐內存中.

  三.迭代器

    可迭代對象:Iterable,裏面有__iter__()能夠獲取迭代器,沒有__next__()

    迭代器:       Iterator,裏面有__iter__()能夠獲取迭代器,還有__next__()

    迭代器的特色:

      1.只能向前

      2.惰性機制

      3.省內存(生成器)

    能夠經過dir函數查看類中定義好的方法

s = "個人哈哈哈" 
print(dir(s))       # 能夠打印對象中的方法和函數 

print(dir(str))     # 也能夠打印類中聲明的方法和函數

  可迭代對象能夠使用for循環

  打印的結果中能找到__iter__函數,則是可迭代對象

  也能夠經過isinstance()函數查看對象是否是可迭代對象

from collections import Iterable  # 可迭代對象
from collections import Iterator    # 迭代器
lst = ["alex爲何這麼帥","我不信","大家信嗎?"]
print(isinstance(lst, Iterable)) 
print(isinstance(lst, Iterator))

  可迭代對象能夠經過.__iter__()獲取迭代器

  for循環的內部機制

    1.首先獲取到迭代器.

    2.使用while循環獲取數據

    3.it.__next__()獲取數據

    4.處理異常 try: xxx  except StopIteration:

lst = ["alex", "wusir", "taibai", "ritian"]
it = lst.__iter__() # 獲取迭代器
while 1:
    try:    # 嘗試執行
        el = it.__next__()  # 獲取下一個元素
        print(el)
    except StopIteration:   # 處理錯誤
        break
相關文章
相關標籤/搜索