函式名的使 以及第 類物件 閉包 迭代器

2022-03-16 16:22:25 字數 4432 閱讀 3138

一丶函式名的應用

函式名是乙個變數,但它是乙個特殊的變數,與括號配合可以執行函式的變數.

1.函式名的記憶體位址

def

func():

print("呵呵"

)print

(func)

結果:

2.函式名可以賦值給其他變數

def

func():

print("呵呵"

)

print

(func)

a = func #

把函式當成乙個變數賦值給另乙個變數

a() #

函式呼叫 func()

3.函式名可以當做容器類的元素

def

func1()

print("呵呵"

)def

func2()

print("呵呵"

)def

func3

print("呵呵"

)list =[func1,func2,func3]

for i in

lst:

i()

4.函式名可以當做函式的引數

def

my():

print("

我是my")

def proxy(fn): #

**模式. 裝飾器

print("

在處理之前")

fn()

print("

在處理之後")

proxy(my)

#把函式名作為引數傳遞給另乙個函式

5.函式名可以做函式的返回值

def

func_1():

print("

這⾥是函式1")

deffunc_2():

print("

這⾥是函式2")

print("

這⾥是函式1")

retururn_2

fn = func_1() #

執⾏函式1. 函式1返回的是函式2, 這時fn指向的就是上⾯函式2

fn() #

執⾏上⾯返回的函式

二丶閉包

閉包. 在內層函式中訪問外層函式的變數

閉包的作用:

1. 可以保護你的變數不收侵害

2. 可以讓乙個變數常駐記憶體

我們可以使⽤__closure__來檢測函式是否是閉包. 使⽤函式名.__closure__返回cell就是閉包,返回none 就不是閉包.

def

func1():

name = "

alex

"def

func2():

print(name) #

閉包func2()

print(func2.__closur__) #

(0x10c3fc650>,)

func1()

函式外部呼叫內部函式

def

outer():

name = "

alex"#

內部函式

definner():

print

(name)

return

inner

fn = outer() #

訪問外部函式, 獲取到內部函式的函式位址

fn() #

訪問內部函式

在閉包中. 如果變數被銷毀了. 那內部函式將不能正常執⾏. 所

以. python規定. 如果你在內部函式中訪問了外層函式中的變數. 那麼這個變數將不會消亡.

將會常駐在記憶體中

from urllib.request import

urlopen

defbut():

content = urlopen("

").read()

defget_content():

return

content

return

get_content

fn = but() #

這個時候就開始載入校花100的內容

#後⾯需要⽤到這⾥⾯的內容就不需要在執⾏⾮常耗時的⽹絡連線操作了

content = fn() #

獲取內容

print

(content)

content2 = fn() #

重新獲取內容

print(content2)

閉包的作⽤就是讓⼀個變數能夠常駐記憶體. 供後⾯的程式使⽤.

三丶迭代器

我們可以通過dir函式來檢視類中定義好的所有⽅法. 

s = "

我的哈哈哈

"print(dir(s)) #

可以列印物件中的⽅法和函式

print(dir(str)) #

也可以列印類中宣告的⽅法和函式

在列印結果中. 尋找__iter__ 如果能找到. 那麼這個類的物件就是⼀個可迭代物件. (進⾏for迴圈的東⻄都有__iter__函式, 包括range也有)    

我們還可以通過isinstence()函式來檢視⼀個物件是什麼型別的

l = [1,2,3]

l_iter = l.__iter__

()from collections import

iterable

from collections import

iterator

print(isinstance(l,iterable)) #

true

print(isinstance(l,iterator)) #

false

print(isinstance(l_iter,iterator)) #

true

print(isinstance(l_iter,iterable)) #

true

這⾥的__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迴圈

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. 不能反覆, 只能向下執⾏.

it = lst.__iter__()#

偏方print("

__iter__"in

dir(it))

print("

__next__"in

dir(it))

可以通過dir來判斷資料是否是可迭代的, 以及資料是否是迭代器

官方方案

from collections import iterable #

可迭代物件

from collections import iterator #

迭代器print

(isinstance(lst, iterable))

print

(isinstance(lst, iterator))

print

(isinstance(it, iterable))

print(isinstance(it, iterator))

day12 01 函式名的使 以及第 類物件

函式名的運 函式名是 個變數,但它是 個特殊的變數,與括號配合可以執 函式的變數.1.函式名的記憶體位址 def func print 呵呵 print func 結果 2.函式名可以賦值給其他變數 def func print 呵呵 print func a func 把函式當成 個變數賦值給另 ...

函式名的使用,閉包,迭代器

函式名的使用 1,函式名可以當做值賦值給變數 2,函式名可以當引數去傳遞,傳遞函式名的時候,如說 就是傳遞這個函式的返回值 3,函式名可以當做返回值被返回,返回值不能加括號,接力要一層一層傳遞,中間斷了就傳不到 def foo print 2 def func msg print 1 return ...

Python函式名應用 閉包 迭代器

函式名的應用.函式名是乙個變數,但它是乙個特殊的變數,與括號配合可以執行函式的變數.1.函式名的記憶體位址 def func print 呵呵 print func 2.函式名可以賦值給其他變數 def func print 呵呵 print func a func 把函式當成乙個變數賦值給另乙個變...