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

2022-03-26 06:50:02 字數 3982 閱讀 6695

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

函式物件可以像變數一樣進行賦值,還可以作為列表的元素進行使用,可以作為返回值返回,可以作為引數進行傳遞

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("呵呵")

def func4():

print("呵呵")

lst = [func1, func2, func3]

for i in lst:

i()

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

def func():

print("吃了麼")

def func2(fn):

print("我是func2")

fn() # 執行傳遞過來的fn

print("我是func2")

func2(func) # 把函式func當成引數傳遞給func2的引數fn.

5.函式名可以作為函式的返回值

def func_1():

print("這里是函式1")

def func_2():

print("這里是函式2")

print("這里是函式1")

return func_2

fn = func_1() # 執行函式1. 函式1返回的是函式2, 這時fn指向的就是上面函式2

fn() # 執行上面返回的函式

閉包就是內層函式,對外層函式(非全域性)變數的引用

通過**檢視乙個閉包:

__closure__來檢測是否閉包,返回cell就是閉包,返回none就不是閉包
檢測閉包:

def

func1():

a = 10

deffunc2():

return

a func2()

print(func2.__closure__

)func1()

#(,) 這個就是閉包

在函式外部呼叫內部函式:

def

outer():

definner():

print('

我是內部函式')

return

inner

a =outer() # 訪問外部函式, 獲取到內部函式的函式位址

a() # 訪問內部函式

#我是內部函式

閉包的好處:

1.保護變數不被侵害

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

下面的這個爬蟲的**就用到了閉包的好處

from urllib.request import

urlopen

defbut():

content = urlopen("

www.dytt.com

").read()

defget_content():

return

content

return

get_content

fn = but() #

這時就在載入內容了

#後面需要用到這裡面的內容就不需要在執行非常耗時的網路連線操作了

c1 = fn() #

獲取內容

print

(c1)

c2 = fn() #

重新獲取內容

print(c2)

由它我們可以引出閉包的好處. 由於我們在外界可以訪問內部函式. 那這個時候內部函式訪問的時間和時機就不一定了, 因為在外部, 我可以選擇在任意的時間去訪問內部函式. 這個時候.如果⼀個函式執行完畢. 則這個函式中的變量以及區域性命名空間中的內容都將會被銷毀. 在閉包中. 如果變量被銷毀了. 那內部函式將不能正常執行. 所以. python規定. 如果你在內部函式中訪問了外層函式中的變量. 那麼這個變數將不會消亡.將會常駐在記憶體中. 也就是說. 使用閉包, 可以保證外層函式中的變量在記憶體中常駐.

iterable: 可迭代物件.內部包含__iter__()函式

iterator: 迭代器. 內部包含__iter__() 同時包含 __next__()

迭代器的特點:

1. 省記憶體

2. 惰性機制

3. 只能向前, 不能後退

1.  _iter_函式判斷可迭代的,  dir(資料):返回這個資料可以執行的所有操作

s = '

abc'

print(dir(s)) #

列印物件中的方法和函式

print(dir(str)) #

列印類中宣告的方法和函式

在列印結果中,尋找__iter__如果能找到. 那麼這個類的物件就是乙個可迭代物件

['

__add__

', '

__class__

', '

__contains__

', '

__delattr__

', '

__dir__

', '

__doc__',

'__eq__

', '

__format__

', '

__ge__

', '

__getattribute__

', '

__getitem__',

'__getnewargs__

', '

__gt__

', '

__hash__

', '

__init__

', '

__init_subclass__

','__iter__',

2. __iter__  , __next__ 迭代器

官方的判斷迭代器的方法:

from

collections immport iterable ,iterator

isinstance(物件,iterable)是否是可迭代的

isinstance(物件,iterator)是否是迭代器

l = [1,2,3]

l_iter = l.__iter__

()from collections import

iterable,iterator

print(isinstance(l,iterable)) #

true

print(isinstance(l,iterator)) #

false

print(isinstance(l_iter,iterable)) #

true

print(isinstance(l_iter,iterator)) #

true

使用isinstance判斷示例

使用while模擬for迴圈:

迭代器每次通過__next__() 來完成的,當程式遇到stopiteration將結束迴圈

模擬for迴圈

lst=

it =lst.__iter__()

while 1:

try:

it.__next__()

except

stopiteration:

break

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

函式名的使用 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 把函式當成乙個變數賦值給另乙個變...

函式名的應用和閉包

函式名的命名規範和變數是一樣的 函式名其實就是變數 可以作為列表中的元素進行儲存,def func1 pass def func2 pass lst func1,func2 for el in lst el 可以作為引數傳遞給函式 def func pass def proxy fn proxy f...