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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

Python 學習的第九小節

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

一、學習筆記

  1.?高階函數

    函數名可以作為函數參數輸入 、可以進行賦值、還可以作為返回值。

  2.作用域

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

  3.遞歸函數

  關于階層的遞歸函數:

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

  特點:1.調用自身函數  2.有一個結束條件  3.每進入更深一層遞歸時,問題規模相比上次要有所減少。

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

  4.內置函數

    重點:

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

        遍歷序列的元素,每個元素進入函數里面,可以起到一個過濾器的作用。不會改變元素,最多就是過濾。

      map(?函數名字,序列 )

        遍歷序列的元素,每個元素進入函數中,可以對元素進行一個處理。

      reduce(?函數名字,序列 )

        調用之前要加------------?from? functools? import? reduce?

        reduce?的結果就是一個值。

      lamda? ------------匿名函數?

        lamda? 參數 :?代碼塊

        函數式編程用的多,可以用在reduce?這類配合進行使用。

  5.閉包

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

def outer():x = 10                          定義函數時的環境def inner():#條件一 inner就是內部函數         函數塊print(x)#條件二 外部環境的一個變量         return inner()#結論 內部函數inner就是一個閉包

    關于閉包:閉包 =?函數快 +?定義函數時的環境?

  6.裝飾器(重點!!!)

    遵守開放封閉原則:對修改封閉,對擴展開放。

    裝飾器的作用就是為已經存在的對象添加額外的功能。

#author:"LFD" #date: 2018/3/27 import timedef show_time(f): #裝飾器函數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)

    功能函數加參數

import time # 加法器 并且計算加法器運行的時間。 def show_time(f): #裝飾器函數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)

    裝飾器參數

#author:"LFD" #date: 2018/3/27 import time# 裝飾器加參數 def logger(flag=' '):def show_time(f): #裝飾器函數def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print('spend %s' % (end - start))if flag == ' ': #當logger參數為空時,打印日志記錄。不為空時則不打印。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)] #列表生成器可以使用函數進行生成print(a) print(b)

?   8.生成器

?

    生成器就是一個可迭代對象( Iterable )

?

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

   生成器一共有兩種創建方式:

    ?、倬褪巧厦婺欠N小括號的形式

    ?、趛ield 的方式?

      生成器本質上就是一個函數,但跟函數具有區別。

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

    注意:生成器在創建的時候就已經決定了能計算出來的個數,調用next?的次數超過這個值就會報StopIteration?    

    什么是可迭代對象:

     內部具有 _Iter_?方法的都是可迭代對象。列表、元組、字典、字符串都是可迭代對象。

     yield 有一個保持狀態的作用。

  9.send?方法

    send 比 next 多一個功能,向函數體中傳值,向yield 前面的變量傳一個值。

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

?

  10.迭代器

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

    什么是迭代器:

     ?、儆?iter?方法  ②有 next?方法

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

?

二、心得

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

?

?

?

轉載于:https://www.cnblogs.com/jinzejun/p/8632513.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。