日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python教程之生成器和匿名函數_python

作者:qq_43479892 ? 更新時間: 2022-03-29 編程語言

生成器

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)
->生成器對象: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))

總結

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

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

原文鏈接:https://blog.csdn.net/qq_43479892/article/details/122466079

欄目分類
最近更新