一.函數名的應用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