Python学习day13-函数进阶(1)
Python學習day13-函數進階(1)
閉包函數
閉包函數,從名字理解,閉即是關閉,也就是說把一個函數整個包起來。正規點說就是指函數內部的函數對外部作用域而非全局作用域的引用。
為函數傳參的方式有常用有以下兩種:
用參數的形式
xxxxxxxxxx 5 1 def func(x): 2 ? ?print(x) 3 ? ? 4 func(1) 5 ??
包給函數
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所以會執行到print(x) 8 ? 9 f() 10 f() 11 ?閉包函數的應用
閉包的意義在哪呢,其返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得該函數無論在何處調用的時候,都會優先調用外層包裹的作用域。
其主要應用領域就在于延遲計算和爬蟲領域,可以簡化代碼量,也會使代碼更加的穩定。
裝飾器
裝飾器是一個邏輯上比較復雜的概念,所幸我們并不必追究太深,只需知道其使用方法和大概原理即可。
所以什么是裝飾器呢,個人理解裝飾器就是包裹在函數外面的另外一個函數,而且裝飾器的起到對原函數增加功能的作用,且不影響原函數的調用和存在。
需要注意的是,裝飾器本身其實是任意可調用的對象,被裝飾的對象也可以是任意可調用的對象。
裝飾器的實現必須遵循的兩大原則在于:
- 不修改被裝飾對象的源代碼
- 不修改被裝飾對象的調用方式
裝飾器模板
這里咱們就不舉例那些非常復雜的裝飾器模型了,只會越看越暈,我們只需要記住并熟練一個裝飾器的模板就可以了,萬能模板如下:
xxxxxxxxxx 1 def deco(func): 2 ? ?def wrapper(*args,**kwargs): 3 ? # 在這里寫需要添加并實現的功能 4 ? ? ? ?res = fun(*args,**kwargs) 5 ? ? ? ?return res 6 ? ?return wrapper 7 # 調用方式如下 8 def f1(): 9 print('from f1') 10 ? ? 11 f1 = deco(f1) 12 f1()迭代器
迭代是一個比較常見的概念,迭代,也就是更新換代,一個接著一個改變,但單純的重復并不是迭代。
可迭代對象
Python中一切皆對象(注意,此對象非彼對象)。對于這一切對象中,只要是有__iter__方法的對象,都是可迭代對象。
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()?
迭代器對象
可迭代對象是有__iter__方法的對象,而迭代器對象則是同時有__iter__和__next__方法的對象。
其實只有文件本身即是可迭代對象又是迭代器對象,別的對象都需要用__iter__拿到迭代器本身才可以用__next__方法。
for循環的原理
for循環其實就是一種迭代器循環,in后面必須是可迭代的對象,這點在leetcode刷題的時候就可以碰到,但凡是碰到鏈表類型的題目,都是不能放在for循環里的,也不能用len測量其長度,就是因為鏈表類型不可迭代。
其實for循環的內層原理類似于while然后捕捉錯誤,比如:
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循環本身到最后也是報錯的StopIteration,只不是內部做了處理,捕捉到報錯直接break了,所以for循環的本質還是while循環。?
轉載于:https://www.cnblogs.com/Xu-PR/p/11342604.html
總結
以上是生活随笔為你收集整理的Python学习day13-函数进阶(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2008 Tips #004 – 您
- 下一篇: html标签 marquee 滚动