python教程之生成器和匿名函數(shù)
生成器
01 什么是生成器?
記住兩個(gè)關(guān)鍵:
- **生成器是一種特殊的函數(shù)方法。**意味著它和函數(shù)(def)密不可分。
- 基于上一點(diǎn),只要函數(shù)中出現(xiàn)yield關(guān)鍵字,就是生成器函數(shù)。
初學(xué)的你,還是太難理解?
02 通俗的講解
你可以將生成器理解為一個(gè)盒子,你可以向這個(gè)盒子里隨意添加元素,當(dāng)你需要的時(shí)候,再取出來用。
請(qǐng)看下面的例子:
# 普通函數(shù) def func(): return 1 f = func() print("函數(shù)返回值:",f) ->函數(shù)返回值:1 print("函數(shù)返回值的類型:",type(f)) ->函數(shù)返回值的類型:<class 'int'> # 生成器 def gen\_func(): yield 1 yield 2 g = gen_func() print("生成器對(duì)象:",g) ->生成器對(duì)象:object gen\_func at 0x00000189B8CFF7C8> print("生成器對(duì)象的類型:",type(g)) ->生成器對(duì)象的類型:<class 'generator'> # 讀取生成器對(duì)象的值,因?yàn)樯善饕彩且粋€(gè)迭代器,實(shí)現(xiàn)了python的迭代協(xié)議(即實(shí)現(xiàn)了\_\_iter\_\_方法) for i in g: print("生成器對(duì)象的值:",i) ->生成器對(duì)象的值: 1 ->生成器對(duì)象的值: 2
03 生成器到底有什么用?
作用:惰性求值(一邊循環(huán)一邊計(jì)算的機(jī)制),節(jié)省性能
04 生成器的常見用途?
- 讀大文件
- 網(wǎng)絡(luò)爬蟲 scrapy 框架
- 協(xié)程
舉個(gè)例子:斐波那契數(shù)列(0,1,1,2,3,5…),打印斐波那契數(shù)列前50個(gè)元素
# 不使用生成器,會(huì)消耗大量?jī)?nèi)存 def fib(idx): res=[] n, a, b = 0, 0, 1 while n < idx: res.append(b) a, b = b, a+b n += 1 return res res = fib(100) print(res) # 使用生成器,可節(jié)約大量?jī)?nèi)存 def gen\_fib(idx): n, a, b = 0, 0, 1 while n < idx: yield b a, b = b, a+b n += 1 for i in gen_fib(100): print(i)
匿名函數(shù)
01 什么是匿名函數(shù)?
當(dāng):
- 函數(shù)實(shí)現(xiàn)比較簡(jiǎn)單
- 函數(shù)不需要被多個(gè)地方調(diào)用
- 懶得給這個(gè)函數(shù)起名字時(shí),我們可以使用匿名函數(shù)。
初學(xué)的你,還是太難理解?
02 通俗的講解
你想實(shí)現(xiàn)一個(gè)求x的平方的函數(shù),但是這個(gè)函數(shù)太簡(jiǎn)單,不值得專門def定義,同時(shí),你忘記了平方的英文如何拼寫,要是命名成 “pingfang”,又顯得自己太low,于是乎,你可以不給這個(gè)函數(shù)起名字,還能實(shí)現(xiàn)它。這就是匿名函數(shù)lambda表達(dá)式。
比如:求一個(gè)數(shù)的平方
# 不用 lambda 表達(dá)式 def square(x): return x * x print(square(2)) # 使用 lambda 表達(dá)式 # 寫法:lambda 返回值:計(jì)算表達(dá)式 s = lambda x: x * x print(s(2))
總結(jié)
1 如果你是初學(xué)者,可以先不掌握生成器和匿名函數(shù),待學(xué)成python后,再行琢磨;
2 在實(shí)際工作中,生成器和匿名函數(shù)的使用頻次,相對(duì)較高,并且在面試中是高頻問點(diǎn)。
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用keras實(shí)現(xiàn)非線性回歸(兩種加激活函數(shù)的方式)
這篇文章主要介紹了使用keras實(shí)現(xiàn)非線性回歸(兩種加激活函數(shù)的方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07Django文件存儲(chǔ) 自己定制存儲(chǔ)系統(tǒng)解析
這篇文章主要介紹了Django文件存儲(chǔ) 自己定制存儲(chǔ)系統(tǒng)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python RuntimeError: thread.__init__() not called解決方法
這篇文章主要介紹了Python RuntimeError: thread.__init__() not called解決方法,需要的朋友可以參考下2015-04-04python中的?sorted()函數(shù)和sort()方法區(qū)別
這篇文章主要介紹了python中的?sorted()函數(shù)和sort()方法,首先看sort()方法,sort方法只能對(duì)列表進(jìn)行操作,而sorted可用于所有的可迭代對(duì)象。具體內(nèi)容需要的小伙伴可以參考下面章節(jié)2022-02-02python GUI庫(kù)圖形界面開發(fā)之PyQt5動(dòng)態(tài)加載QSS樣式文件
這篇文章主要介紹了python GUI庫(kù)圖形界面開發(fā)之PyQt5動(dòng)態(tài)加載QSS樣式表,需要的朋友可以參考下2020-02-02Pandas?DataFrame.drop()刪除數(shù)據(jù)的方法實(shí)例
pandas作為數(shù)據(jù)分析強(qiáng)大的庫(kù),是基于numpy數(shù)組構(gòu)建的,專門用來處理表格和混雜的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Pandas?DataFrame.drop()刪除數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-07-07