python - 閉包,迭代器

1、第一類對象
一、函數名的運用
    函數名是一個變量,但它是一個特殊的變量,與括號配合能夠執行函數的變量
    一、函數名的內存地址
def func1():
    print('你是誰,你來自哪裏')
print(func1)
# <function func1 at 0x000001256F021E18>

  二、函數名能夠賦值給其餘變量 網絡

def func1():
    print('這是函數1')
# print(func1)
res = func1 # 把函數當成一個變量賦值給另外一個變量
res() # 函數調用 func1()
#  這是函數1

三、函數名能夠看成容器類的元素 閉包

def func1():
    print('大風吹1')

def func2():
    print('大風吹2')

def func3():
    print('大風吹3')

def func4():
    print('大風吹4')

lst = [func1,func2,func3,func4]
for i in lst:
    i()

  四、函數名能夠看成函數的參數進行傳遞 app

def func1():
    print('這兩天降溫了')

def func2(fn):
    print('我是函數2')
    fn()
    print('我是函數2')

func2(func1)

 

def func1():
    print('哈哈')

def func2():
    print('嘿嘿')

def func3():
    print('呵呵')

# 代理裝飾器雛形
def proxy( a ): # a 就是變量,形參
    print('我是代理')
a()
print('代理完畢')

proxy(func1)
proxy(func2)
proxy(func3)

 

 五、函數名能夠做爲函數的返回值 函數

def func1():
    print('這是函數1')
    def func2():
        print('這是函數2')
    return func2

fn = func1() # 執行函數1,函數1返回的是函數2,這時fn之想的就是函數2
fn() # 執行上面返回的函數(也就是函數2)
2、閉包  -->函數的嵌套
 
   閉包就是內層函數,對外層函數(非全局)的變量的引用,
 
閉包的優勢:
    一、保護變量不被修改
    二、讓一個變量常駐內存
def wapper():
    name = '昂昂' # 局部變量常駐於內存
    def inner():
        print(name) # 在內層函數中調用外層函數的局部變量
     return inner # 返回內部函數名

res = wapper() # res 是一個內層函數
res() # res 就是inner,執行的時間不肯定,必須保證裏邊的name存在

 

# 寫一個簡易爬蟲

from urllib.request import urlopen
# 去掉數字簽名
import ssl
ssl._create_default_https_contest = ssl._create_unverified_context

def func():
#獲取到網頁中的內容,當網速很慢時,反覆的去打開這個網站,會很慢
    content = urlopen("https://www.dytt8.net/";).read()

    def inner():
        return content.decode("gbk") # 網頁內容
        return inner

print('開始網絡請求')
ret = func() # 網絡請求已經完畢
print("網絡請求完畢")
print("第一次",ret()[30])
print("第二次",ret()[30])

 

查看是否閉包
     咱們可使用 __closure__ 來檢測函數是否閉包,使用函數名.__closure__ 返回cell 就是閉包,但會None 就不是閉包
 
不是閉包
def wapper():
    name = 'xiaomeng'
def inner():
    print('zhangying')
    print(inner.__closure__)
    inner()

wapper()

是閉包 網站

def wapper():
    name = 'xiaomeng'
def inner():
    print(name)
    print(inner.__closure__)  # (<cell at 0x000001B2D03086A8: str object at 0x000001B2D03A23F0>,)
    inner()

wapper()
3、迭代器  -->固定思路,for循環
 
    一個數據類型中包含了__iter__ 函數表示這個數據是可迭代的
 
 dir(數據):返回這個數據可執行的全部操做
s = '你是誰啊'
print(dir(s)) # 能夠打印對象中的方法和函數
print(dir(str)) # 能夠打印類中申明的方法和函數
判斷迭代器和可迭代對象的方案
 
    __iter__    可迭代的
    
    __iter__   __next__  迭代器
 
判斷迭代器和可迭代對象的方案(官方)
 
    from collections import Iterable,Iterator
    isinstance(對象,Iterable) 是不是可迭代的   True  or  Fault
    isinstance(對象,Iterator) 是不是迭代器   True  or  Fault
 
模擬for循環
lst = [1, 2, 3]
# 模擬for循環 for el in lst
it = lst.__iter__() # 拿迭代器
while 1: # 循環
    try: # 嘗試
        it.__next__()
    except StopIteration: # 出現錯誤,意味着數據拿完了
        break # 結束循環
迭代器必定可迭代,可迭代的東西,不必定是迭代器
 
迭代器的特色:
 
    一、省內存(生成器)
    二、惰性機制
    三、只能向前,不能後退 
 
做用:統一了各類數據類型的遍歷
相關文章
相關標籤/搜索