Python学习day13-函数进阶(1)
Python學(xué)習(xí)day13-函數(shù)進(jìn)階(1)
閉包函數(shù)
閉包函數(shù),從名字理解,閉即是關(guān)閉,也就是說把一個(gè)函數(shù)整個(gè)包起來。正規(guī)點(diǎn)說就是指函數(shù)內(nèi)部的函數(shù)對(duì)外部作用域而非全局作用域的引用。
為函數(shù)傳參的方式有常用有以下兩種:
用參數(shù)的形式
xxxxxxxxxx 5 1 def func(x): 2 ? ?print(x) 3 ? ? 4 func(1) 5 ??
包給函數(shù)
xxxxxxxxxx 11 1 def outter(x): 2 ? ?x = 1 3 ? ? 4 ? ?def inner(): 5 print(x) 6 ? ?return inner 7 f = outter(1)# outter的返回值為inner所以會(huì)執(zhí)行到print(x) 8 ? 9 f() 10 f() 11 ?閉包函數(shù)的應(yīng)用
閉包的意義在哪呢,其返回的函數(shù)對(duì)象,不僅僅是一個(gè)函數(shù)對(duì)象,在該函數(shù)外還包裹了一層作用域,這使得該函數(shù)無論在何處調(diào)用的時(shí)候,都會(huì)優(yōu)先調(diào)用外層包裹的作用域。
其主要應(yīng)用領(lǐng)域就在于延遲計(jì)算和爬蟲領(lǐng)域,可以簡(jiǎn)化代碼量,也會(huì)使代碼更加的穩(wěn)定。
裝飾器
裝飾器是一個(gè)邏輯上比較復(fù)雜的概念,所幸我們并不必追究太深,只需知道其使用方法和大概原理即可。
所以什么是裝飾器呢,個(gè)人理解裝飾器就是包裹在函數(shù)外面的另外一個(gè)函數(shù),而且裝飾器的起到對(duì)原函數(shù)增加功能的作用,且不影響原函數(shù)的調(diào)用和存在。
需要注意的是,裝飾器本身其實(shí)是任意可調(diào)用的對(duì)象,被裝飾的對(duì)象也可以是任意可調(diào)用的對(duì)象。
裝飾器的實(shí)現(xiàn)必須遵循的兩大原則在于:
- 不修改被裝飾對(duì)象的源代碼
- 不修改被裝飾對(duì)象的調(diào)用方式
裝飾器模板
這里咱們就不舉例那些非常復(fù)雜的裝飾器模型了,只會(huì)越看越暈,我們只需要記住并熟練一個(gè)裝飾器的模板就可以了,萬能模板如下:
xxxxxxxxxx 1 def deco(func): 2 ? ?def wrapper(*args,**kwargs): 3 ? # 在這里寫需要添加并實(shí)現(xiàn)的功能 4 ? ? ? ?res = fun(*args,**kwargs) 5 ? ? ? ?return res 6 ? ?return wrapper 7 # 調(diào)用方式如下 8 def f1(): 9 print('from f1') 10 ? ? 11 f1 = deco(f1) 12 f1()迭代器
迭代是一個(gè)比較常見的概念,迭代,也就是更新?lián)Q代,一個(gè)接著一個(gè)改變,但單純的重復(fù)并不是迭代。
可迭代對(duì)象
Python中一切皆對(duì)象(注意,此對(duì)象非彼對(duì)象)。對(duì)于這一切對(duì)象中,只要是有__iter__方法的對(duì)象,都是可迭代對(duì)象。
xxxxxxxxxx 1 1 name = 'nick'.__iter__ 2 lis = [1,2].__iter__ 3 tup = (1,2).__iter__ 4 dic = {'name':'nick'}.__iter__ 5 s1 = {'a','b'}.__iter__ 6 f = open('file','r',encoding = 'utf8') 7 f.__iter__ 8 f.close()?
迭代器對(duì)象
可迭代對(duì)象是有__iter__方法的對(duì)象,而迭代器對(duì)象則是同時(shí)有__iter__和__next__方法的對(duì)象。
其實(shí)只有文件本身即是可迭代對(duì)象又是迭代器對(duì)象,別的對(duì)象都需要用__iter__拿到迭代器本身才可以用__next__方法。
for循環(huán)的原理
for循環(huán)其實(shí)就是一種迭代器循環(huán),in后面必須是可迭代的對(duì)象,這點(diǎn)在leetcode刷題的時(shí)候就可以碰到,但凡是碰到鏈表類型的題目,都是不能放在for循環(huán)里的,也不能用len測(cè)量其長(zhǎng)度,就是因?yàn)殒湵眍愋筒豢傻?/p>
其實(shí)for循環(huán)的內(nèi)層原理類似于while然后捕捉錯(cuò)誤,比如:
xxxxxxxxxx 1 1 lt = [1,2,3] 2 lt_iter = lt.__iter__() 3 while 1: 4 try: 5 print(lt_iter.__next__()) 6 except StopIteration: 7 break 8 # for循環(huán)本身到最后也是報(bào)錯(cuò)的StopIteration,只不是內(nèi)部做了處理,捕捉到報(bào)錯(cuò)直接break了,所以for循環(huán)的本質(zhì)還是while循環(huán)。?
轉(zhuǎn)載于:https://www.cnblogs.com/Xu-PR/p/11342604.html
總結(jié)
以上是生活随笔為你收集整理的Python学习day13-函数进阶(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2008 Tips #004 – 您
- 下一篇: python错误 ImportError