天天看點

python 第一類對象 閉包 疊代器

def fn():

    print("我叫fn")

fn()

print(fn)## <function fn at 0x0000000001D12E18>

fn()

gn = fn #函數名可以進行指派

print(gn)# <function fn at 0x0000000001D12E18>

gn()

fn = 666

print(fn) #666

def func1()

    print("朱祁鎮")

def func2()

    print("徐傑")

def func3():

    print("王陽明")

def func4():

    print("魏忠賢")

lst = [func1,func2,func3,func4]#函數+() 就是調用

print(lst)

lst[0]()

for el in lst:  #el是清單中的每一項

    el() #拿到的是函數.  執行函數

def wrapper():

    def inner():

        print("哈哈哈")

    return inner#函數名可以像傳回值一樣傳回

ret = wrapper()  #接收的是inner函數

ret() #調用函數inner  在函數外面通路了函數内部的函數

函數可以作為參數進行傳遞

def func1():

    print("謝晉")

def func2():

    print('楊士奇')

def func3():

    print('徐渭')

def func4():

    print("柳如是")

#代理.裝飾器的雛形

de proxy(a)

    print("我是代理")

    a()

    print("代理執行完畢")

proxy(func1)

proxy(func2)  #将函數當做參數進行傳參

閉包

閉包的優點

1.可以保持變量不被其他人侵害

2.保持一個常量常駐與記憶體

def wrapper():

    a = "哈哈" #如果把a放到全局作用域是不安全的一種寫法,因為好多内容用着同一個變量,則把它放到一個局部作用域中

    name = "周傑倫"

    def inner

        print(name)#在内層函數中使用了外層的函數的局部變量 

        print(a)

    return inner  #傳回函數名

ret = wrapper()  #ret是inner函數

ret()  #調用函數

def wrapper():

    name = "周傑倫"  #局部變量常駐與記憶體

    def inner():

        print(name) #在内層函數中使用外層函數的局部變量

    return inner  #傳回函數名

        #inner()

ret = wrapper()  #ret是一個内層函數

ret()  #ret是inner,執行的時機是不确定的,必須保證裡邊的name是存在的

#超級簡單的爬蟲

from urllib.request import urlopen  #導入一個子產品

def func():

        #擷取到網頁中的内容,當網速很慢的時候.反複的打開這個網站 很慢

    content = urloppen("https://www.dytt8.net/").read()

    def inner():

        return  content.decode("gbk")  #網頁内容

    return inner

print("開始網絡請求")

ret = func()  #網絡請求已經關閉

print("網絡請求完畢")

print("第一次",ret())

print("第二次",ret()) #加載到記憶體  不用每次都進行網絡請求 直接進行記憶體的調用  但是變量多的話  記憶體可能撐不下 

def wrapper():

    name = "alex"

    def inner():

        print("name")

    print(inner.__closure__)  #檢視是否閉包.有内容就是閉包,沒有内容就不是閉包

    inner()

wrappe()

疊代 

s = "今天下午考試,你們還要睡覺嗎 "

for c in s: #字元串是一個可疊代對象

    print (c)

for i in 123: # 'int' object is not iterable整型是不可以疊代的

    print(i)

dir(對象)  #可以幫我們檢視xxx資料能夠執行的操作

print(dir(str))  #__iter__  

字元串 清單 字典 元組 集合 是可以疊代的  

int 和 bool 是不可以疊代的

共性:所有帶有__iter__的東西可以進行for循環,帶有__iter__的東西就是可以疊代的

lst = ["賈樟柯", "李安", "楊德昌", "王家衛"]

it = lst.__iter__() #拿到的是疊代器 

print(it.__next__()) #下一個

print(it.__next__()) #下一個

print(it.__next__()) #下一個

print(it.__next__()) #下一個

print(it.__next__()) #下一個 會報錯  stopinteration  停止疊代

##想回去隻能重新獲得疊代器

1.隻能項下執行,不能反複

2.結束的時候會扔給我們一個錯誤  stopiteration

3.整合所有的資料類型進行周遊 (int,bool除外)

用while循環來模拟for循環

it = list.__iter__()

while 1:

        try:

            el = it.__next__:  #拿資料

            print(el)

        except stopiteration:  #出現錯誤說明資料拿完了 

            break  #退出循環

官方通過代碼判斷是否是疊代器

借助于兩個子產品  Iteration 疊代器,iterable 可疊代的

from collections import iterable,iterator

lst = [1,2,3]

print(lst.__next__())

print(isinstance(lst, Iterable)) # xxx是否是xxx類型的. True

print(isinstance(lst, Iterator)) # False

疊代器一定是可疊代的,可疊代的東西不一定是疊代器

isinstens(參數,iterable)  判斷xxx是不是某某類型