1. 程式人生 > >函數名 閉包 叠代器

函數名 閉包 叠代器

__next__ 進行 內存 font 網絡應用 判斷 money 調用函數 獲取

函數名

函數名就是變量; 函數名可以作為參數進行傳遞

1. 函數名的內存地址

def func():
    print("哈哈")
print(func) #<function func at 0x01CDD4B0>

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

def func():
    print("呵呵")
print(func)

a = func #把函數當成變量 賦值給另一個變量
a() # 函數調用 func()

3. 函數名可以作為列表中的元素進行存儲

def func1():
    print("呵呵")
def func2():
    print("哈哈")
lst 
= [func1,func2] for el in lst: el()#相當於func1() 和func2()

4.函數名可以當做參數

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


運行結果: 我是func2 吃了麽 我是func2

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

def func1():
    print("這裏是函數1")
    
def func2(): print("這裏是函數2") print("這裏是函數1") return func2 fn = func1() #執行完函數1 返回的是函數2 所以fn 就是func2 fn() #func2() 執行結果: 這裏是函數1 這裏是函數1 這裏是函數2

閉包

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

def func1():
    name = "alex"
    def func2():
        print(name)
    func2()
func1()

結果是 alex

怎麽檢測函數是不是閉包?
使用函數名 .__closure__返回cell就是閉包, 返回None就不是閉包

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

2. 如何在函數外調用函數內部的函數呢?

def outer():
    name = "alex"
    def inner():
        print(name)
    return inner
fn = outer() #訪問外部函數,獲取到內部函數的函數地址
fn()  #訪問內部函數
3. 如果是多層嵌套,只需要一層一層的往外層返回就行了
閉包嵌套
def wrapper():
    money = 1000
    def func():
        name = eva
        def inner():
            print(name,money)
        return inner
    return func

f = wrapper() #func
i = f() #func()  i=inner
i() #inner()

4. 閉包函數獲取網絡應用

from urllib.request import urlopen

def but():
    content = urlopen("http://www.xiaohua100.cn/index.html").read()
    def get_content():
        return content
    return get_content
fn = but() #get_content 返回給but() 所以fn = get_content
content = fn()  #fn()就是get_content(),執行函數得到 content
print(content)

content2 = fn() #重新獲取內容
print(content2)

叠代器

lst = ["趙四","花生哥", "天臺見"]
it = lst.__iter__()  #獲取到叠代器
print(it.__next__()) #取值
print(it.__next__())
print(it.__next__())
print(it.__next__()) #這一行就超過叠代的元素的個數了 所以會報錯StopIeration
這裏的__iter__是幫助我們獲取到對象的叠代器
叠代器中的__next__()用來獲取一個叠代器中的元素
可以把要叠代的內容當成子彈,
叠代器__iter__()就是把子彈都裝進彈夾中,
發射就是用__next__()把每一個子彈(元素)打出來
也就是說,for循環的時候,一開始是__iter__()來獲取叠代器,
後面每次獲取元素都是通過__next__()來完成的
叠代器模擬for循環
lst = ["張一寧","石可欣","姚明"] it = lst.__iter__() #獲取叠代器 while 1: try: #嘗試執行 el = it.__next__() #獲取下一個元素 print(el) except StopIteration: #錯誤處理 break

查看一個對象是否是可叠代對象的方法

from collections import Iterable  #可叠代對象
from collections import Iterator  #叠代器
print(isinstance(A,B))  #判斷某個對象 A 是不是 B 類型中的實例

函數名 閉包 叠代器