日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python 3 学习——函数扩展and迭代器生成器装饰器

發(fā)布時(shí)間:2023/12/20 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 3 学习——函数扩展and迭代器生成器装饰器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python 學(xué)習(xí)的第九小節(jié)

?寫此博客 是為了激勵(lì)自己,并且將自己的心得以及遇到的問題與人分享

一、學(xué)習(xí)筆記

  1.?高階函數(shù)

    函數(shù)名可以作為函數(shù)參數(shù)輸入 、可以進(jìn)行賦值、還可以作為返回值。

  2.作用域

    在Python中,只有模塊、類以及函數(shù)才會(huì)引入新的作用域,其它的代碼塊(if? try? for)是不會(huì)引入新的作用域。

  3.遞歸函數(shù)

  關(guān)于階層的遞歸函數(shù):

def fact(n):if n ==1 :return 1return n * fact(n-1)print(fact(2))

  特點(diǎn):1.調(diào)用自身函數(shù)  2.有一個(gè)結(jié)束條件  3.每進(jìn)入更深一層遞歸時(shí),問題規(guī)模相比上次要有所減少。

  但凡是遞歸可以寫的程序,循環(huán)都可以解決。遞歸的效率在一定情況下非常低。

  4.內(nèi)置函數(shù)

    重點(diǎn):

      filter( 函數(shù)名字 , 序列 ) ---------------注意map?與 filter?的區(qū)別

        遍歷序列的元素,每個(gè)元素進(jìn)入函數(shù)里面,可以起到一個(gè)過濾器的作用。不會(huì)改變?cè)?#xff0c;最多就是過濾。

      map(?函數(shù)名字,序列 )

        遍歷序列的元素,每個(gè)元素進(jìn)入函數(shù)中,可以對(duì)元素進(jìn)行一個(gè)處理。

      reduce(?函數(shù)名字,序列 )

        調(diào)用之前要加------------?from? functools? import? reduce?

        reduce?的結(jié)果就是一個(gè)值。

      lamda? ------------匿名函數(shù)?

        lamda? 參數(shù) :?代碼塊

        函數(shù)式編程用的多,可以用在reduce?這類配合進(jìn)行使用。

  5.閉包

    定義:如果在一個(gè)內(nèi)部函數(shù)中,對(duì)在外部作用域的變量(但不是在全局作用域中)進(jìn)行引用,這就叫做閉包。

def outer():x = 10                          定義函數(shù)時(shí)的環(huán)境def inner():#條件一 inner就是內(nèi)部函數(shù)         函數(shù)塊print(x)#條件二 外部環(huán)境的一個(gè)變量         return inner()#結(jié)論 內(nèi)部函數(shù)inner就是一個(gè)閉包

    關(guān)于閉包:閉包 =?函數(shù)快 +?定義函數(shù)時(shí)的環(huán)境?

  6.裝飾器(重點(diǎn)!!!)

    遵守開放封閉原則:對(duì)修改封閉,對(duì)擴(kuò)展開放。

    裝飾器的作用就是為已經(jīng)存在的對(duì)象添加額外的功能。

#author:"LFD" #date: 2018/3/27 import timedef show_time(f): #裝飾器函數(shù)def inner():start = time.time()f()end = time.time()print('spend %s' % (end - start))return inner()@show_time def foo():print('liufeiduo')time.sleep(2) @show_time def bar():print('chengjunfei')time.sleep(3)# foo=show_time(foo) # # bar = show_time(bar)

    功能函數(shù)加參數(shù)

import time # 加法器 并且計(jì)算加法器運(yùn)行的時(shí)間。 def show_time(f): #裝飾器函數(shù)def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print('spend %s' % (end - start))return inner@show_time def add(*args):sums = 0for i in args:sums += iprint(sums)time.sleep(1)add(1,2,3,4,5)

    裝飾器參數(shù)

#author:"LFD" #date: 2018/3/27 import time# 裝飾器加參數(shù) def logger(flag=' '):def show_time(f): #裝飾器函數(shù)def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print('spend %s' % (end - start))if flag == ' ': #當(dāng)logger參數(shù)為空時(shí),打印日志記錄。不為空時(shí)則不打印。print('日志記錄')return innerreturn show_time@logger(' ') # @show_time def add(*args):sums = 0for i in args:sums += iprint(sums)time.sleep(1)add(1,2,3,4,5)

   7.列表生成式

def f(n):return n**3a = [y for y in range(10)] b = [f(x) for x in range(10)] #列表生成器可以使用函數(shù)進(jìn)行生成print(a) print(b)

?   8.生成器

?

    生成器就是一個(gè)可迭代對(duì)象( Iterable )

?

s = (x for x in range(3)) # # print(s) # # print(next(s)) #等價(jià)于s._next_() in Py2: s.next() # print(next(s)) # # print(next(s))for i in s:print(i)

   生成器一共有兩種創(chuàng)建方式:

     ①就是上面那種小括號(hào)的形式

     ②yield 的方式?

      生成器本質(zhì)上就是一個(gè)函數(shù),但跟函數(shù)具有區(qū)別。

def foo():print('ok')yield 1 # 只要有yield的就是生成器對(duì)象 # return 1print('ok2')yield 2foo() # 生成器對(duì)象 g = foo() next(g) # 調(diào)用生成器對(duì)象 next(g) for i in foo():  #會(huì)將yield也打印出來 也就是下面的1 和 2 。 print(i)
--------------
ok
ok2
ok
1
ok
2
--------------  

    注意:生成器在創(chuàng)建的時(shí)候就已經(jīng)決定了能計(jì)算出來的個(gè)數(shù),調(diào)用next?的次數(shù)超過這個(gè)值就會(huì)報(bào)StopIteration?    

    什么是可迭代對(duì)象:

     內(nèi)部具有 _Iter_?方法的都是可迭代對(duì)象。列表、元組、字典、字符串都是可迭代對(duì)象。

     yield 有一個(gè)保持狀態(tài)的作用。

  9.send?方法

    send 比 next 多一個(gè)功能,向函數(shù)體中傳值,向yield 前面的變量傳一個(gè)值。

send():f().send(None) #等價(jià)于next(f())

?

  10.迭代器

    生成器都是迭代器,迭代器不一定都是生成器。

    什么是迭代器:

      ①有 iter?方法  ②有 next?方法

l = [1,2,34,5] d = iter(l) print(d) #<list_iterator object at 0x000001D9FFF09438>print(next(d))# for 循環(huán)做了三件事: # 1.調(diào)用可迭代對(duì)象的iter 方法返回一個(gè)迭代器對(duì)象。 # 2.通過一個(gè)while循環(huán)不斷的調(diào)用迭代器的next 方法。 # 3.處理StopIteration異常。 for i in [1,2,34,5]:  一般都是通過for i in Iterable 進(jìn)行取值iter([1,2,34,5])

?

二、心得

  Python中的函數(shù)有著更多的方法作用,感覺功能強(qiáng)大但需要去發(fā)掘,裝飾器也是起到了豐富其功能,使其可以用更短的代碼做更多的事,裝飾器的作用需要繼續(xù)去體會(huì),要代碼量的上升才可以對(duì)它的了解更加深入。掌握Python的內(nèi)置函數(shù),通過內(nèi)置函數(shù)縮短自己的代碼行數(shù)。生成器以及迭代器兩者的關(guān)系還沒有弄透,以及如何搭配使用,實(shí)現(xiàn)更加復(fù)雜的功能還要進(jìn)行多次實(shí)驗(yàn)。

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/jinzejun/p/8632513.html

總結(jié)

以上是生活随笔為你收集整理的Python 3 学习——函数扩展and迭代器生成器装饰器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。