函式名的運用

2022-05-06 21:18:09 字數 4112 閱讀 6920

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 之函式名定址 研究過程 通過之前的研究學習,我們得出了這樣乙個結論,函式名即組合語言中的標號,標號則就應該具有位址的屬性,但就本質而言,無論是位址,還是資料而言,都其實應該是乙個概念,以及針對於他們,同樣的要有這樣的乙個問題要問 位址在哪?資料 位址 有多大?這是在學習組合語言的時候我們...