函式 名的使用和第一類物件,閉包,迭代器

2022-05-15 17:33:08 字數 3364 閱讀 6600

1,函式名的運用:

def

func():

print("呵呵"

)print(func) #

a = 10

print(id(a)) #

1402039600

def

func():

print("哈哈"

)a = func #

把函式名賦值給變數a

a() #

a現在是乙個函式名,當加()表示執行函式

#

函式名可以存放到容器中

deffunc1():

print("哈哈"

)def

func2():

print("呵呵"

)def

func3():

print("啊啊"

)def

func4():

print("嗯嗯"

)lst =[func1, func2, func3, func4]

for i in

lst:

i()

#分別執行函式

def

func():

print("

呵呵呵"

)def func1(fn): #

呼叫函式func1()

print("

哈哈哈") #

列印"哈哈哈"

fn() #

此時執行的fn = func(),當fn(),其實就是呼叫你func函式

func1(func) #

執行結果是 哈哈哈 呵呵呵

def

func_1():

print("

這裡是函式1")

deffunc_2():

print("

這裡是函式2")

print("

這裡是函式1

") #

第二步列印的是"這裡是函式1"

return func_2 #

返回func_2,西施返回的是乙個函式名(無任何意義),只是返回乙個值

fn = func_1() #

第一步:先執行函式func_1(),列印"這裡是函式1", 在執行func_2賦值給fn

fn() #

第五步,在fn後邊加(),其實就是在func_2後邊加(), 即是在呼叫函式func_2

2,閉包:閉包就是內層函式對外層函式的(非全域性)變數的引用,叫做閉包,有點類似於nonlocal.

def

func():

name = "

alex"#

常駐記憶體,防止其他程式改變這個變數

definner():

print(name) #

內層函式inner訪問外部函式的變數

return inner #

返回inner這個函式名(並且是誰呼叫這個函式,就返回給誰)

ret =func()

ret()

#呼叫inner函式

#列如:

name = "

wusir"#

把變數寫在全域性是極其不安全的,因為是誰都可以改變

defadc():

global name #

把全域性變數弄到區域性來

name = "呵呵"

print

(name)

adc()

def

func1():

name = "

alex

"def

func2():

print(name) #

閉包func2()

print(func2.__closure__) #

(,)元組形式的記憶體位址

#如果不是就返回none

func1()

def

outer():

name = "

alex"#

內部函式

definner():

print

(name)

return

inner

fn = outer() #

訪問外部函式,獲取到外部函式的記憶體位址

fn() #

訪問內部函式

3,迭代器:迭代器就相當於引擎,為迴圈提供動力.

s = "

asdfg

"print("

__iter__

"in dirs(s)) #

true, 說明s是可迭代的

print(dir(s)) #

是判斷s裡面所有的內容

lst = ["

皇阿瑪", "

皇額娘", "

容麼麼", "紫薇"

]it = lst.__iter__() #

獲取迭代器

while 1: #

while迴圈,是把lst中的每一項都迴圈出來

try: #

嘗試 name = it.__next__() #

去拿下一項

except stopiteration #

那不到資料的時候

break

#終止迴圈(只有迴圈的時候才break用)

print(isinstance(lst.iterable))  #

true,判斷是否是可迭代的迭代器一定是可迭代的,可迭代的不一定是迭代器

print(isinstance(lst.iterable)) #

false,迭代器裡邊有__next__().__iter__()

print("

__iter__

"in dir(lst)) #

確定是乙個可迭代物件

print("

__next__

"in dir(lst)) #

確定不是乙個迭代器(如果乙個物件裡邊包含__next__就說明是迭代器)

lst = ["

哈哈", "呵呵"

]it = lst.__iter__() #

確定類lst是乙個可迭代物件

it.__next__() #

確定lst裡邊包含__next__

print(it.__next__()) #

開始往出拿元素

print("

我要吃黃瓜")

print(it.__next__()) #

開始往出拿第二個元素

第一類物件 函式名 變數名

第一類物件 函式名 變數名 函式物件可以像變數一樣進行賦值 還可以作為列表的元素進行使用 可以作為返回值返回 可以作為引數進行傳遞 閉包 函式的巢狀 內層函式對外層函式中的變數的使用 好處 1.保護變數不被侵害 2.讓乙個變數常駐記憶體 如何通過 檢視乙個閉包 closure 有東西就是閉包.沒東西...

Python 函式的第一類物件 使用

函式的第一類物件及使用 第一類物件 特殊點 可以當做值被賦值給變數 def func print 1 print func a func a 2.可以當做元素存放在容器中 def func print 1 lst func,func,func for i in lst i 3.函式名可以當做函式的引...

Python 基礎 第一類物件 閉包 迭代器

第一類物件 函式名 變數名 函式物件物件可以像變數一樣進行賦值 還可以作為列表的元素進行使用 可以作為返回值返回 可以作為引數進行傳遞 閉包 函式的巢狀 內層函式對外層函式中的變數的使用 好處 1.保護變數不被侵害 2.讓乙個變數常駐記憶體 如何通過 檢視乙個閉包 closure 有東西就是閉包.沒...