python極簡教程05:生成器和匿名函式

測試奇譚發表於2022-01-12

測試奇譚,BUG不見。

講解之前,我先說說我的教程和網上其他教程的區別:

1 我分享的是我在工作中高頻使用的場景,是精華內容;

2 我分享的是學習方法,亦或說,是指明你該學哪些、該重點掌握哪些內容;

3 基於1和2,你可以按照我的教程學,也可以網上找視訊學,也可以看書學……你得明白,掌握學習方法比找學習資料重要得多。

前5期,我已經分享了python的基礎語法,如果你按照我的文章,一步一步練習,保準你對python程式碼的語法特點、書寫方式有所瞭解,並能獨立的寫一些簡單的函式方法,甚至能嘗試開始自動化測試的實踐(基於python語法)。

當然,如果你想更進一步掌握python語法的特點,那接下來的幾篇文章一定不要錯過。

這一場,主講python的生成器和匿名函式。

目的:掌握這兩個知識點的概念和使用。

生成器

01 什麼是生成器?

記住兩個關鍵:

  • 生成器是一種特殊的函式方法。意味著它和函式(def)密不可分。
  • 基於上一點,只要函式中出現yield關鍵字,就是生成器函式

初學的你,還是太難理解?

02 通俗的講解

你可以將生成器理解為一個盒子,你可以向這個盒子裡隨意新增元素,當你需要的時候,再取出來用。

請看下面的例子:

# 普通函式
def func():
    return 1

f = func()
print("函式返回值:",f)
->函式返回值:1
print("函式返回值的型別:",type(f))
->函式返回值的型別:<class 'int'>

# 生成器
def gen_func():
    yield 1
    yield 2

g = gen_func()
print("生成器物件:",g)
->生成器物件:<generator object gen_func at 0x00000189B8CFF7C8>
print("生成器物件的型別:",type(g))
->生成器物件的型別:<class 'generator'>
# 讀取生成器物件的值,因為生成器也是一個迭代器,實現了python的迭代協議(即實現了__iter__方法)

for i in g:
    print("生成器物件的值:",i)
->生成器物件的值: 1
->生成器物件的值: 2

03 生成器到底有什麼用?

作用:惰性求值(一邊迴圈一邊計算的機制),節省效能

04 生成器的常見用途?

  • 讀大檔案
  • 網路爬蟲 scrapy 框架
  • 協程

舉個例子:斐波那契數列(0,1,1,2,3,5...),列印斐波那契數列前50個元素

# 不使用生成器,會消耗大量記憶體
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)

# 使用生成器,可節約大量記憶體
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)

匿名函式

01 什麼是匿名函式?

當:

  • 函式實現比較簡單
  • 函式不需要被多個地方呼叫
  • 懶得給這個函式起名字

時,我們可以使用匿名函式。

初學的你,還是太難理解?

02 通俗的講解

你想實現一個求x的平方的函式,但是這個函式太簡單,不值得專門def定義,同時,你忘記了平方的英文如何拼寫,要是命名成 "pingfang",又顯得自己太low,於是乎,你可以不給這個函式起名字,還能實現它。這就是匿名函式lambda表示式。

比如:求一個數的平方

# 不用 lambda 表示式
def square(x):
    return x * x
print(square(2))

# 使用 lambda 表示式
# 寫法:lambda 返回值:計算表示式
s = lambda x: x * x
print(s(2))

一如既往,做個總結

01 如果你是初學者,可以先不掌握生成器和匿名函式,待學成python後,再行琢磨;

02 在實際工作中,生成器和匿名函式的使用頻次,相對較高,並且在面試中是高頻問點。

相關文章