1. 程式人生 > >day 11 第一類物件、閉包、迭代器

day 11 第一類物件、閉包、迭代器

 

課上總結

一.第一類物件

1.什麼是第一類物件?

在建立一個函式的時候,這個函式就是第一類物件,函式物件可以向變數一樣進行賦值操作,還可以作為列表的元素一樣使用. 第一類物件 -> 函式名 -> 變數名

比如:  

def func():
    print("我叫第一類物件")

a = func
print(a)  #<function func at 0x00000000004C1E18>   #列印的是記憶體地址

a() # 我叫第一類物件        #函式名可以進行賦值


func = 666
print(func)  ###坑###  結果還是666,這裡的func被賦值給666

 

2.函式名可以放在一個列表裡多次呼叫

def func1():
    print("朱元璋")
def func2():
    print("朱祁鎮")
def func3():
    print("王陽明")
def func4():
    print("魏忠賢")
lst = [func1,func2,func3,func4]

lst[0]()  #結果:朱元璋       #單個函式呼叫

for i in lst:
    i()   #結果:             #用for迴圈實現多個函式呼叫
                朱元璋
                朱祁鎮
                王陽明
                魏忠賢

 

 

3.在外面呼叫內部函式

def warpper():
    def inner():
        print("哈哈哈")
    return inner   #return返回給上一級的呼叫者warpper, inner後面不能加括號"()",這樣的話函式沒有返回值預設返回None,而且還是隻能通過外層函式才能呼叫
ret = warpper()()  #結果:哈哈哈  #後面兩個括號代表,執行inner函式返回給warpper函式的函式名,讓warpper可以在外面直接呼叫巢狀的函式

 

 

4.函式可以作為"實參"多次呼叫,作為一個代理來使用,有點類似於裝飾器的雛形.

def func1():
    print("謝晉")
def func2():
    print("朱元璋")
def func3():
    print("朱友文")


#定義一個函式作為代理來使用,實現函式可以作為是 "實參" 多次呼叫.
def proxy(a):
    print("我是代理")
    a()
    print("代理執行完畢")

proxy(func1)            
proxy(func2)
proxy(func3)
#結果
   我是代理
   謝晉
    代理執行完畢
     我是代理
     朱元璋
     代理執行完畢
     我是代理
     朱友文
     代理執行完畢

 

 

 二.閉 包

 

1.什麼是閉包?

 閉包就是內層函式對外層函式的使用.

 

 

2.閉包的優點:

      保護變數不被侵害

      讓變數常駐記憶體,方便下次呼叫,能夠更快的展示

 閉包的缺點:

      如果記憶體過大,可能導致記憶體溢位,或者記憶體被撐爆.

 

 

3.閉包的應用場景:

       目前已知爬蟲,可以把一個url放入一個變數內,下次訪問這個url時就會走本地快取,快速訪問.

例: