py 的 第 12 天
1.函數名的使用,以及第一類對象
2。閉包
3.叠代器
一函數名的運用:
函數名是一個變量,但他是一個特殊的變量,與括號配合可以執行函數的變量。
函數名的內存地址
def 名():
隨便什麽體
print(名)
結果是個地址
函數名可以賦值給其他變量
def 名():
print(‘s’)
print(名)
a=名
a() 函數調用 名
3.函數名可以當作容器類的元素
def 1()
print(s)
def 2()。。。。。
lst=【1,2,3,。。】
for i in lst
i()
4.函數名可以當作函數的參數
def func():
print("吃了了麽")
def func2(fn):
print("我是func2")
fn() # 執?行行傳遞過來的fn print("我是func2")
func2(func) # 把函數func當成參數傳遞給func2的參數fn.
傳參什麽的
5.函數名可以作為函數的返回值
def func_1():
print("這?是函數1")
def func_2():
print("這裏是函數2")
print("這裏是函數1")
return func_2
fn = func_2() # 執?行行函數1. 函數1返回的是函數2, 這時fn指向的就是上?面函數2 fn() # 執?行行上?面返回的函數
二 閉包
什麽事閉包,閉包就是內層函數,對外層函數(非全局)的變量的引用。叫閉包
我們可以使用__closure__來檢測函數是否是閉包,使用函數名.__closure__返回cell就是閉包。返回None就不是閉包
多層嵌套就是一層一層返回沒有打印就不返回,11天寫的先可最左面的來,沒有的打印的話
由它我們可以引出閉包的好處。由於我們在外界可以訪問內部函數。那這個時候內部函數訪問的時間和時機就不一定了,因為在外部,我可以選擇在任意的時間去訪問內部函數。這個時候。想一想。我們之前說過,如果一個函數執行完畢,則這個函數中的變量以及局部命名空間中的內部都將會被銷毀,在閉包中,如果變量被銷毀了,那內部函數將不能正常執行,所以python規定。如果你在內部函數中訪問了外層函數中的變量。那麽這個變量將不會消亡,將會常駐在內存中,也就是說,使用閉包,可以保證外層函數中的變量在內存中常駐,還有一個好處就是1次常駐,萬次使用
三叠代器
我們之前一直在用可叠代對象,進行叠代操作,那麽到底什麽是可叠代對象。本小節主要討論可叠代對象。首先我們先回顧一下目前我們所熟知的可叠代對象有哪些:
str, list, tuple, dict, set.為什麽他們都是可叠代對象呢,因為他們遵循了叠代協議 這個協議我們可以用dir看一下
print(dir(XXX)) 如果裏面有__iter__那麽他就是一個可叠代對象 這是查看是否為可叠代對象的第一種方法,我們還可以通過isinstence()函數,來看一個對象是什麽類型
我們用__next__()來獲取一個叠代器中的元素,我們之前for的工作原理也是這樣
lst = [1,2,3] lst_iter = lst.__iter__() while True:
try: i = lst_iter.__next__() print(i)
except StopIteration: break
Iterable: 可叠代對象. 內部包含__iter__()函數
Iterator: 叠代器. 內部包含__iter__() 同時包含__next__().叠代器的特點:
1. 節省內存.
2. 惰性機制
3. 不能反復, 只能向下執?行行.
py 的 第 12 天