def func():
print('呵呵')
print(func)
結果:
def func():
print('呵呵')
print(func)
a = func # 把函式當成乙個變數賦值給另乙個變數
a() # 函式呼叫
def func():
print('呵呵')
def func():
print('呵呵')
def func():
print('呵呵')
def func():
print('呵呵')
lst = [func1,func2,func3]
for i in lst:
i()
def func():
print('吃了嗎')
def func(fn):
print('我是func2『)
fn() # 執行傳遞過來的fn
print('我是func2')
func2(func)
def func():
print('這裡是函式1')
def func():
print('這裡是函式2')
print('這裡是函式1')
return func_2
fn = func_1() # 執行函式1,函式1返回的是函式2,這是fn指向的就是上面的函式2
fn() # 執行上面的函式
閉包:是內層函式,對外層函式(非全域性)的變數的引用
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
(,)
如何在函式內外呼叫內部函式
def outer():
name = 'alex'
# 內部函式
def inner():
print(name)
return inner
fn = outer() # 訪問外部函式,獲取到內部函式的函式位址
fn() # 訪問內部函式
結果: alex
多層巢狀
def func1():
def func2()
def func3()
print('嘿嘿')
return func3
return func2
func()()()
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 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 iterable
form collections import iterable
print(isinstence(l,iterable)) # true
print(isinstence(l,iterator)) # false
print(isinstence(l__iter__,iterabtor)) # true
print(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.不能反覆,只能向下執行
函式名的運用,裝飾器語法糖的運用
1.函式名就是函式的記憶體位址 2.函式名可以作為變數 3.函式名可以作為函式的引數 4.函式名還可以當做函式的返回值 5.函式名可以作為容器型別的元素 列表中的乙個元素 globals 作用是 返回全域性變數的乙個字典 locals 返回當前位置的區域性變數的字典 def func1 a 1b 2...
函式 函式名的本質
函式名的本質 簡單地說 可以當普通變數用 是指向記憶體位址的乙個名字,且同樣可以賦值 所謂的變數名,對於計算機都是乙個記憶體位址 func 函式名就是記憶體位址 func2 func 函式名可以賦值 func2 因此,可以將函式名存入列表中,迴圈呼叫 函式名可以作為容器型別的元素 l func,fu...
函式名定址
綜合研究2 之函式名定址 研究過程 通過之前的研究學習,我們得出了這樣乙個結論,函式名即組合語言中的標號,標號則就應該具有位址的屬性,但就本質而言,無論是位址,還是資料而言,都其實應該是乙個概念,以及針對於他們,同樣的要有這樣的乙個問題要問 位址在哪?資料 位址 有多大?這是在學習組合語言的時候我們...