標籤:import ast stop orm 傳遞 print ace 迭代 hash
函數名的運用:1.函數名的記憶體位址
def func(): print(‘呵呵‘)print(func)結果:<function func at 0x0000000001D51E18>
2.函數名可以賦值給其他變數
def func(): print(‘呵呵‘)print(func)a = func # 把函數當成一個變數賦值給另一個變數a() # 函數調用
3.函數名可以當做容器類的元素
def func(): print(‘呵呵‘)def func(): print(‘呵呵‘)def func(): print(‘呵呵‘)def func(): print(‘呵呵‘) lst = [func1,func2,func3]for i in lst:i()
4.函數名可以當做函數的參數
def func(): print(‘吃了嗎‘)def func(fn): print(‘我是func2‘) fn() # 執行傳遞過來的fn print(‘我是func2‘)func2(func)
5.函數名可以作為函數的傳回值
def func(): print(‘這裡是函數1‘) def func(): print(‘這裡是函數2‘) print(‘這裡是函數1‘) return func_2fn = func_1() # 執行函數1,函數1返回的是函數2,這是fn指向的就是上面的函數2fn() # 執行上面的函數
.閉包
閉包:是內層函數,對外層函數(非全域)的變數的引用
def func1(): name = ‘alex‘ def func2(): print(name) func2()func1()結果:alex
我們可以使用__closuer__來檢測函數是否是閉包。使用函名.__closuer__返回cell就是閉包,返回None就不是閉包。
def func1(): name = ‘alex‘ def func2(): print(name) func2() print(func2.__closuer__) 結果:alex(<cell at 0x0000000002178588: str object at 0x00000000024F9308>,)
如何在函數內外調用內建函式
def outer(): name = ‘alex‘ # 內建函式 def inner(): print(name) return inner fn = outer() # 訪問外部函數,擷取到內建函式的函數地址 fn() # 訪問內建函式 結果: alex
多層嵌套
def func1(): def func2() def func3() print(‘嘿嘿‘) return func3 return func2func()()()
.迭代器
s = ‘abc‘for c in s: print(c) # 對的 for i in 123: print(i) # 錯的 結果:Traceback (most recent call last): File "E:/python s16/day11 閉包和迭代器/code/day011 迭代器和閉包/05 迭代器.py", line 111, in <module> for i in 123:TypeError: ‘int‘ object is not iterable
報錯資訊中有這麼一句話:‘int‘ object is not iterable。整數是不可迭代對象。 iterable 表示可迭代的,表示可迭代協議。
如何判斷按資料類型是否符合可迭代協議,我們可以通過dir函數來查看類中定義好的所有方法。
s = ‘我的娃哈哈‘print(dir(s)) # 可以列印對象中的方法和函數print(dir(str)) # 也可以列印類中聲明的方法和函數
在列印結果中,尋找__iter__如果能找到,那這個類的對象就是一個可迭代對象。 迭代器.py"
[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ]
tuple,list,open,set,dict,進行for 迴圈的內容都有__iter__函數,包括range。 這是查看一個對象是否可迭代對象的第一種辦法,我們還可以通過isinstence()函數來查看一個對象是什麼類型的。
l = [1,2,3,]l__iter = l,l.__iter__()form collections import Iterableform collections import Iterableprint(isinstence(l,Iterable)) # Trueprint(isinstence(l,Iterator)) # Falseprint(isinstence(l__iter__,Iterabtor)) # Trueprint(isinstence(l__iter__,Iterable)) # True
通過以上代碼,我們可以確定,如果對象中有__iter__函數,那我們可以認為這個對象遵守了可迭代協議。 就可以擷取到相應的的迭代器。這裡的__iter__是來協助我們擷取對象的迭代器,我們可以使用迭代器中的__next__() 來擷取到迭代器中的元素。
s = ‘我愛北京天安門‘c = s.__iter__() # 擷取迭代器print(‘c.__next__()‘) # 使用迭代器進行迭代,擷取一個元素 我print(‘c.__next__()‘) # 愛print(‘c.__next__()‘) # 北print(‘c.__next__()‘) # 京print(‘c.__next__()‘) # 天print(‘c.__next__()‘) # 安print(‘c.__next__()‘) # 門print(‘c.__next__()‘) # StopIteration
for迴圈的機制:
for i in [1,2,3,]: print(i)
使用while迴圈+迭代器來類比for迴圈(必須掌握)
lat = [1,2,3,]lst__iter = lst.__iter__() while True: try; i = lst__iter__.__nexy__() print(i) except StopIteration: break
.總結:
lterable:可迭代對象,內不包含函數__iter__()函數lterator:迭代器,內部包括含__tier__()同時包含__next__().迭代器的特點: 1.節省記憶體 2.惰性機制 3.不能反覆,只能向下執行
函數名的運用