用Python做特效,分分鐘碾壓五毛黨

2020-12-06 小老鼠Python

Python厲害已經不是一天兩天的事了,但是我怎麼也沒想到,Python還能做特效!

因為之前接觸過Python一個批量摳圖的模型庫,然後最近看視頻突然就靈光一現,為啥不用Python給視頻摳圖換個背景?於是就有了下面這個操作:

先看看效果,這是原場景:

這是換過背景的樣子:

看起來還不錯吧。

再看另一種效果,是不是要狂放許多:

重點來了!

1、具體步驟

讀取視頻,獲取每一幀畫面批量摳圖讀取場景圖片對每一幀畫面進行場景切換寫入視頻讀取原視頻的音頻給新視頻設置音頻

2、模塊安裝

我們需要使用到的模塊主要有如下幾個:

pillowopencvmoviepypaddlehub

都可以直接用pip安裝:

pip install pillowpip install opencv-pythonpip install moviepy

其中OpenCV有一些適配問題,建議選取3.0以上版本。

在我們使用paddlehub之前,我們需要安裝paddlepaddle。

用paddlehub摳圖。

我們這裡直接用pip安裝cpu版本的:

# 安裝paddlepaddlepython -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple# 安裝paddlehubpip install -i https://mirror.baidu.com/pypi/simple paddlehub

有了這些準備工作就可以開始我們功能的實現了。

3、具體實現

我們導入如下包:

import cv2 # opencvimport mail # 自定義包,用於發郵件import mathimport numpy as npfrom PIL import Image # pillowimport paddlehub as hubfrom moviepy.editor import *

其中Pillow和opencv導入的名稱不太一樣,還有就是我自定義的mail模塊。

另外我們還要先準備一些路徑:

# 當前項目根目錄,系統自動獲取當前目錄BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "."))# 每一幀畫面保存的地址frame_path = BASE_DIR + '\\frames\\'# 摳好的圖片位置humanseg_path = BASE_DIR + '\\humanseg_output\\'# 最終視頻的保存路徑output_video = BASE_DIR + '\\result.mp4'

接下來我們按照上面說的步驟一個一個實現。

(1)讀取視頻,獲取每一幀畫面

def getFrame(video_name, save_path):""" 讀取視頻將視頻逐幀保存為圖片,並返回視頻的解析度size和幀率fps :param video_name: 視頻的名稱 :param save_path: 保存的路徑 :return: fps幀率,size解析度 """ # 讀取視頻 video = cv2.VideoCapture(video_name) # 獲取視頻幀率 fps = video.get(cv2.CAP_PROP_FPS) # 獲取畫面大小 width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) size = (width, height) # 獲取幀數,用於給圖片命名 frame_num = str(video.get(7)) name = int(math.pow(10, len(frame_num))) # 讀取幀,ret為是否還有下一幀,frame為當前幀的ndarray對象 ret, frame = video.read()while ret: cv2.imwrite(save_path + str(name) + '.jpg', frame) ret, frame = video.read() name += 1 video.release()return fps, size

在標處,我獲取了幀的總數,然後通過如下公式獲取比幀數大的整十整百的數:

frame_name = math.pow(10, len(frame_num))

這樣做是為了讓畫面逐幀排序,這樣讀取的時候就不會亂。

(2)批量摳圖

批量摳圖需要用到paddlehub中的模型庫,代碼很簡單,這裡就不多說了:

def getHumanseg(frames):""" 對幀圖片進行批量摳圖 :param frames: 幀的路徑 :return: """ # 加載模型庫 humanseg = hub.Module(name='deeplabv3p_xception65_humanseg') # 準備文件列表 files = [frames + i for i in os.listdir(frames)] # 摳圖 humanseg.segmentation(data={'image': files})

我們執行上面函數後會在項目下生成一個humanseg_output目錄,摳好的圖片就在裡面。

(3)讀取場景圖片

這也是簡單的圖片讀取,我們使用pillow中的Image對象:

def readBg(bgname, size):""" 讀取背景圖片,並修改尺寸 :param bgname: 背景圖片名稱 :param size: 視頻解析度 :return: Image對象 """ im = Image.open(bgname)return im.resize(size)

這裡的返回的對象並非ndarray對象,而是Pillow中定義的類對象。

(4)對每一幀畫面進行場景切換

簡單來說就是將摳好的圖片和背景圖片合併

def setImageBg(humanseg, bg_im):""" 將摳好的圖和背景圖片合併 :param humanseg: 摳好的圖 :param bg_im: 背景圖片,這裡和readBg()函數返回的類型一樣 :return: 合成圖的ndarray對象 """ # 讀取透明圖片 im = Image.open(humanseg) # 分離色道 r, g, b, a = im.split() # 複製背景,以免源背景被修改 bg_im = bg_im.copy() # 合併圖片 bg_im.paste(im, (0, 0), mask=a)return np.array(bg_im.convert('RGB'))[:, :, ::-1]

在標處,我們複製了背景,如果少了這一步的話,生成的就是我們上面的「千手觀音效果」了。

其它步驟都很好理解,只有返回值比較長,我們來詳細看一下:

# 將合成圖轉換成RGB,這樣A通道就沒了bg_im = bg_im.convert('RGB')# 將Image對象轉換成ndarray對象,方便opencv讀取im_array = np.array(bg_im)# 此時im_array為rgb模式,而OpenCV為bgr模式,我們通過下面語句將rgb轉換成bgrbgr_im_array = im_array[:, :, ::-1]

最後bgr_im_array就是我們最終的返回結果。

(5)寫入視頻

為了節約空間,我並非等將寫入圖片放在合併場景後面,而是邊合併場景邊寫入視頻:

def writeVideo(humanseg, bg_im, fps, size):""" :param humanseg: png圖片的路徑 :param bgname: 背景圖片 :param fps: 幀率 :param size: 解析度 :return: """ # 寫入視頻 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('green.mp4', fourcc, fps, size) # 將每一幀設置背景 files = [humanseg + i for i in os.listdir(humanseg)]for file in files: # 循環合併圖片 im_array = setImageBg(file, bg_im) # 逐幀寫入視頻 out.write(im_array) out.release()

執行完成後項目下會生成一個green.mp4,這是一個沒有音頻的視頻,後面就需要我們獲取音頻然後混流了。

(6)讀取原視頻的音頻

因為在opencv中沒找到音頻相關的處理,所以選用moviepy,使用起來也非常方便:

def getMusic(video_name):""" 獲取指定視頻的音頻 :param video_name: 視頻名稱 :return: 音頻對象 """ # 讀取視頻文件 video = VideoFileClip(video_name) # 返回音頻return video.audio

然後就是混流了。

(7)給新視頻設置音頻

這裡同樣使用moviepy,傳入視頻名稱和音頻對象進行混流:

def addMusic(video_name, audio):"""實現混流,給video_name添加音頻""" # 讀取視頻 video = VideoFileClip(video_name) # 設置視頻的音頻 video = video.set_audio(audio) # 保存新的視頻文件 video.write_videofile(output_video)

其中output_video是我們在最開始定義的變量。

(8)刪除過渡文件

在我們生產視頻時,會產生許多過渡文件,在視頻合成後我們將它們刪除:

def deleteTransitionalFiles():"""刪除過渡文件""" frames = [frame_path + i for i in os.listdir(frame_path)] humansegs = [humanseg_path + i for i in os.listdir(humanseg_path)]for frame in frames: os.remove(frame)for humanseg in humansegs: os.remove(humanseg)

最後就是將整個流程整合一下。

(9)整合

我們將上面完整的流程合併成一個函數:

def changeVideoScene(video_name, bgname):""" :param video_name: 視頻的文件 :param bgname: 背景圖片 :return: """ # 讀取視頻中每一幀畫面 fps, size = getFrame(video_name, frame_path) # 批量摳圖 getHumanseg(frame_path) # 讀取背景圖片 bg_im = readBg(bgname, size) # 將畫面一幀幀寫入視頻 writeVideo(humanseg_path, bg_im, fps, size) # 混流 addMusic('green.mp4', getMusic(video_name)) # 刪除過渡文件 deleteTransitionalFiles()

(10)在main中調用

我們可以把前面定義的路徑也放進了:

if __name__ == '__main__':# 當前項目根目錄 BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".")) # 每一幀畫面保存的地址 frame_path = BASE_DIR + '\\frames\\' # 摳好的圖片位置 humanseg_path = BASE_DIR + '\\humanseg_output\\' # 最終視頻的保存路徑 output_video = BASE_DIR + '\\result.mp4'ifnot os.path.exists(frame_path): os.makedirs(frame_path)try: # 調用函數製作視頻 changeVideoScene('jljt.mp4', 'bg.jpg') # 當製作完成發送郵箱 mail.sendMail('你的視頻已經製作完成')except Exception as e: # 當發生錯誤,發送錯誤信息 mail.sendMail('在製作過程中遇到了問題' + e.__str__())

這樣我們就完成了完整的流程。

只是簡簡單單換個背景算什麼,下面來實現一個稍微複雜的特效——「影分身」。

有請我們本場的主演,坤製作人為我們表演他拿手的雞你太美。

實現原理和上一個操作沒有本質區別,同樣是逐幀處理,但是這裡還是詳細說一下。

首先我們要準備一個視頻,作為我們的素材。

然後我們要逐幀提取視頻中的圖像,接下來我們利用paddlehub逐幀摳取人像。這樣就有了我們的主體,和分身了。

最後我們需要在寫入視頻的時候對圖像進行處理,我直接在原圖像上粘貼了兩個人物分身,最後合成的視頻效果就是上面的效果了。

當然我們還需要添加音頻,所以最後我們需要讀取音頻並將新視頻同音頻混流。我們將整個過程分為以下幾個步驟:

1.逐幀提取圖像

2.批量摳圖

3.合成圖像(影分身)

4.寫入視頻

5.讀取音頻

6.混流

最終我們就能實現一個完整的視頻了。

具體操作:

為了方便,我們全都使用pip安裝:

pip install pillowpip install opencv-pythonpip install moviepy# 安裝paddlepaddlepython -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple# 安裝paddlehubpip install -i https://mirror.baidu.com/pypi/simple paddlehub

也就不廢話了,如果安裝過程中出了什麼問題可以自行百度。

我們先看看導入的一些模塊:

import cv2import mathimport numpy as npfrom PIL import Imageimport paddlehub as hubfrom moviepy.editor import *

我們按照上面的步驟,一步一步來。

逐幀提取圖像:

這就需要使用到我們的opencv了,具體代碼如下:

def getFrame(video_name, save_path):""" 傳入視頻名稱,將圖像幀保存到save_path下 """ # 讀取視頻 video = cv2.VideoCapture(video_name) # 獲取視頻幀率 fps = video.get(cv2.CAP_PROP_FPS) # 獲取畫面大小 width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) size = (width, height) # 獲取幀數 frame_num = str(video.get(7)) name = int(math.pow(10, len(frame_num))) ret, frame = video.read() while ret: cv2.imwrite(save_path + str(name) + '.jpg', frame) ret, frame = video.read() name += 1 video.release() return fps, size

這裡我們只需要注意OpenCV版本需要在3.0以上,如果是低版本的話會出現兼容問題。

批量摳圖:

批量摳圖需要使用到我們的paddhub模型庫,而摳圖的實現也只需要幾行代碼:

def getHumanseg(frames):""" 對frames路徑下所以圖片進行摳圖 """ # 加載模型庫 humanseg = hub.Module(name='deeplabv3p_xception65_humanseg') # 遍歷路徑下文件 files = [frames + i for i in os.listdir(frames)] # 摳圖 humanseg.segmentation(data={'image': files})

我們調用該方法後會在目錄下生成humanseg_output目錄,摳好的圖像就在裡面。

合成圖像(影分身):

這裡需要使用到我們的Pillow模塊,該模塊中提供了圖像粘貼的函數:

def setImageBg(humanseg, bg_im):""" 將摳好的圖和背景圖片合併 :param humanseg: :param bg_im: :return: """ # 讀取透明圖片 im = Image.open(humanseg) # 分離色道 r, g, b, a = im.split() # 在圖片右邊粘貼一個人物分身 bg_im.paste(im, (bg_im.size[0]//3, 0), mask=a) # 在圖片左邊粘貼一個人物分身 bg_im.paste(im, (-bg_im.size[0]//3, 0), mask=a) # 將圖形轉換成opencv能正常讀取的類型,並返回 return np.array(bg_im.convert('RGB'))[:, :, ::-1]

上面主要就是使用paste函數。

寫入視頻:

寫入視頻的操作同樣是OpenCV來實現的:

def writeVideo(humanseg_path, frames, fps, size):""" 傳入摳好的人像,和原圖像,以及原視頻幀率,大小,寫入新視頻 """ # 寫入視頻 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('green.mp4', fourcc, fps, size) # 將每一幀設置背景 humanseg = [humanseg_path + i for i in os.listdir(humanseg_path)] frames = [frames + i for i in os.listdir(frames)] for i in range(humanseg.__len__()): # 讀取原圖像 bg_im = Image.open(frames[i]) # 設置分身 im_array = setImageBg(humanseg[i], bg_im) # 寫入視頻 out.write(im_array) out.release()

到這裡我們就實現了一個視頻,但是現在還沒有聲音,接下來就需要我們用moviepy進行音頻的混流了。

混流:

我們混流的操作就是先獲取音頻,然後再混流,而音頻我們只需要讀取原視頻的音頻即可:

def getMusic(video_name):""" 獲取指定視頻的音頻 """ # 讀取視頻文件 video = VideoFileClip(video_name) # 返回音頻 return video.audio

其中VideoFileClip是moviepy中的一個視頻處理的類。

下面我們來添加音樂:

def addMusic(video_name, audio):"""實現混流,給video_name添加音頻""" # 讀取視頻 video = VideoFileClip(video_name) # 設置視頻的音頻 video = video.set_audio(audio) # 保存新的視頻文件 video.write_videofile(output_video)

output_video是我們自己定義的一個存放文件保存路徑的變量,需要注意,該全路徑(路徑+名稱)不能和原視頻相同。

實現特效:

也就是將整個流程整合到一起:

def changeVideoScene(video_name):""" :param video_name: 視頻的文件 :param bgname: 背景圖片 :return: """ # 讀取視頻中每一幀畫面 fps, size = getFrame(video_name, frames) # 批量摳圖 getHumanseg(frames) # 將畫面一幀幀寫入視頻 writeVideo(humanseg_path, frames, fps, size) # 混流 addMusic('green.mp4', getMusic(video_name))

在上面有些變量我們還沒有定義,我們在main函數中定義一下:

if __name__ == '__main__':# 當前項目根目錄 BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".")) # 每一幀畫面保存的地址 frames = BASE_DIR + '\\frames\\' # 摳好的圖片位置 humanseg_path = BASE_DIR + '\\humanseg_output\\' # 最終視頻的保存路徑 output_video = BASE_DIR + '\\result.mp4' # 創建文件夾 if not os.path.exists(frames): os.makedirs(frames) if not os.path.exists(background_path): os.makedirs(background_path) # 給視頻添加特效 changeVideoScene('jntm.mp4')

這樣就實現了我們完整的特效。

下面再來一個更牛的,幾行代碼實現黑客電影經典鏡頭,先看效果:

實時視頻錄製效果:

簡單示範一下:

為了顯得更加逼真,通常我不直接運行原始碼文本,一種操作如下:

在文本編輯器中寫好原始碼,將文本命名保存在某個硬碟位置中,此處假設命名為try.py,文件路徑為E:Test\go\try.py;在桌面新建一個文本文件,在文件裡編輯如下內容:

E:cd Test\gopython try.py

cd 後面所接的為原始碼try.py文件所在文件目錄路徑。

完成以上操作後,保存該文件為go.bat;雙擊該文件,完成。注意,此方法一定要先配置python的系統環境變量設置,一般安裝python後都會進行此操作,如未配置環境變量,可按照如下設置:簡要方法:在環境變量中添加Python目錄(左右滑動)(1) 安裝好Python後,右鍵點擊"計算機",然後點擊"屬性"; (2) 然後點擊"高級系統設置"; (3) 選擇"系統變量"窗口下面的"Path",雙擊打開或點擊右側添加選項; (4) 然後在"Path"行,添加python安裝路徑; (5) 更詳細教程請自行搜索。python文件原始碼

from fractions import Fractionimport timex = Fraction(3, 5)y = Fraction(1, 5)count = 0time.sleep(10)while x < 10:print(x) time.sleep(0.05) x = x * y - 1 count = count + 1 if count == 100000: breaktime.sleep(10)

一直覺得電影特效,動畫製作這些都很那什麼,其實還是有一些開發電影特效的不錯的軟體,像Houdini (電影特效魔術師) 、NUKE ,都支持python腳本開發。

學習python完全可以玩轉電影特效,影視合成,python的價值還需要被更多地去開發挖掘。

相關焦點

  • 我們能用Python做什麼?學Python有前途嗎?
    我們能用Python做什麼?目前流行的大數據分析、數據科學、機器學習等行業,Python長期穩固第一陣營,甚至就是第一語言。不管從哪個方面來考慮,都應該選擇 Python。
  • 回城撕裂虛空進入次元裂縫,特效碾壓典藏
    而最近有網友曝光了孫尚香的新皮膚,這個新皮膚和薔薇戀人的配色很像,都是粉色的,這個英雄的2技能的特效是爆炸後出現一個隨機的兔子表情,十分的可愛。大招更是在炮彈爆炸後,出現一個四稜角的異次元裂縫,特效方面做的非常的不錯。
  • 小白如何安裝Python?分分鐘搞定!
    Hello,大家好,我是橘子呀~前一期給大家簡單介紹了一下python是什麼,Python的優勢以及Python在工作中的重要性,那麼就有很多同學說:「橘子,橘子,我想學Python但是現在到第一步就卡殼了,不會安裝python軟體呀。」
  • 科悟學院介紹什麼是Python、python能做什麼?
    這是很多人想知道的,今天小編就給你揭秘一個行業——Python(AI人工智慧),有人會問python到底是什麼?能做什麼?下面科悟學院介紹什麼是python和python能做什麼,希望對於正在學習的你有所幫助。
  • 用Python畫朵玫瑰,只要五分鐘
    最近一個項目在用python,想著這次不用java了,用python給媽媽個禮物吧。Turtle庫是Python語言中一個非常強大的繪製圖像的函數庫,她提供了很多強大的方法,可以方便快速的繪圖,今天我們就來試一下,畫朵玫瑰送給媽媽。
  • 高效辦公必備:別人通宵做的 Excel,我用Python 半小時搞定!
    相反實習生做了一份數據全面、清晰易懂,還有大量圖表做直觀展示的報告,讓領導大加讚賞。 「小譚啊,多向年輕人取取經。」 下班後,小譚心裡很是憋屈,無奈向實習生請教了工作的秘訣。
  • 三分鐘從入門到精通——Python模塊
    中的模塊:假設您正在使用python解釋器。您花了30分鐘來定義一個函數,然後使用它並退出解釋器。但是突然間,您記住仍然需要再次使用該功能。您再次輸入它,但該功能的定義已消失。哎呀,好痛。現在,您再次需要花費30分鐘來鍵入相同的功能。因此,python有一種方法可以將該函數定義放入文件中並隨時使用。模塊是ModuleType類型的對象。
  • 用python識別驗證碼
    前言經常大家在做自動化測試或者做網絡爬蟲的時候,都很容易遇到驗證碼。今天,我們就簡單的說下,怎麼用python來處理驗證碼。
  • 廣州Python測試培訓
    除了極少的事情不能做之外,其他基本上都可以用,黑客編程、爬蟲編寫、機器學習、人工智慧等等。立即諮詢 03 Web開發 教學目標:1、根據UI設計,開發Web網站的前端頁面;2、PC端和移動端頁面特效開發; 3、前端頁面性能優化。
  • 學習Python對辦公真的有用嗎?用經驗告訴你答案
    目前我在做兼職文案,以我的親身經歷為例,我可以很負責的告訴大家,學習python確實可以在某些方面提升你的工作效率,但是,並不是每個人都適合去學習它。去年9月份,我刷到朋友圈的python廣告,廣告語中宣傳的「高效、省時」很是吸引人。但是,促使我真正下定決心學python的,還是這些廣告中販賣的職場焦慮。
  • 從0開始學python-6.2 用python讀寫文件
    我們還學習了用python來查找、重命名一個文件。這節課,我們一起學習一下怎麼用python操作一個文件的內容。文件操作對一個文件,我們可以1)讀取裡面的內容、2)往文件裡寫內容、3)追加文件內容。我們來看看用python怎麼做這些事情。打開文件在對文件內容操作之前,我們首先要打開文件。
  • Python為什麼這麼火?小孩子適合學習python編程嗎?
    在Python裡分分鐘就可以寫個新對象,不喜歡的話甚至還能刪掉呢。程式語言兩個非常重要的概念,即面向對象與面向過程。舉個慄子,當你想吃火鍋了,你有兩個方式:1、自己出門去菜市場,講價,買粉絲,買肉,買火鍋底料,買各種肉丸子,買各種配菜,回家洗菜,起鍋,煮菜,吃完後洗碗,拖地,收拾廚房。2、打個電話叫一份海底撈的外賣,完事兒了。
  • 被黑客分分鐘玩死的微信聊天機器人
    然後好死不死他在號稱白帽黑客歡喜地的 「i春秋-信息安全魔法學院」微信群中做機器人的調試,於是分分鐘被兇殘的壞蛋們玩壞,這個小程序猿也被微信封號處理,結果頑強不息的程式設計師為了突破微信封鎖又做了很多逗逼嘗試……因為事情過於搞笑,雷鋒網(公眾號:雷鋒網)特意向i春秋學院約稿,把故事前因後果梳理出來。截圖比較多,但是高潮迭起,值得看完。
  • 利用python做t檢驗
    >T檢驗:使用前提:       當樣本符合正態分布或趨近於正太分布時可以使用;(根據中心極限定理,當樣本n>30時,可認為近似符合正態分布)使用用途:檢驗的總體方差未知,主要檢驗單個樣本是否和已知的總體均值相等;(python
  • 三分鐘看懂Python和Java的區別
    今天就來教大家三分鐘看懂Python和Java的區別。1、對象就面向的對象而言,Java語言的設計集中於對象及其接口,提供了類機制以及動態的接口模型。對象中封裝了它的狀態變量以及相應的方法,實現了模塊化和信息隱藏;而類則提供了一類對象的原型,並且通過繼承機制,子類可以使用父類所提供的方法,實現了代碼的復用。
  • 人生苦短,我用Python,那麼問題來了,普通人要學python嗎?
    話說在金融和IT行當混跡了多年,python一直是被我隨手拿來當個小工具用用,有時候偷懶用python弄個excel自動化整理工具,有時候拿來上各種網站爬蟲搜集點信息,有時候也會拿來寫點量化小工具。那麼到底什麼是python?
  • python爬蟲-urllib、urllib2、requests三者關係
    爬蟲編程,有很多語言可選,python、php、go、java···甚至是c。這裡我們選擇python作為爬蟲的程式語言,因為它簡單易上手,並且節約生命。python爬蟲這裡需要聲明的是以下的教程都是基於python2.7的,python3已經有很大的變化了。
  • 星球大戰8,3.5分(二倍速下)總體評價+特效專評+豆瓣影評總結
    星球大戰8,3.5分(二倍速的前提下),總體評價+特效專評+豆瓣影評總結別的不說,前10分鐘飛機大戰相當不錯,開篇就給人帶來了很大的好感,特效場景非常棒,二倍速下簡直牛逼情節也比《星戰7》強,至少豐滿了一點,不再那麼單調,情節豐滿的代價是格局小了許多,雖然前期同樣無聊
  • 用Python做一個價值數萬的市場調查報告程序,分分鐘完成工作
    前些天有個朋友向我求救,他們公司最近要針對餐飲行業做數據分析,並為某些商家做出線上營銷方案。但是他一頭霧水,不知道該從哪方面下手。我提醒他,是否先從商家的線上評價作為數據分析的入口例如美團、大眾點評、餓了麼等等。朋友點頭稱是:」是個好主意,但是具體怎麼做呢?
  • Python每天一分鐘:lambda表達式 (匿名函數)及用法詳解
    lambda表達式介紹python中有一種靈活,便捷的且具有函數功能的表達式:lambda表達式!若有多個參數,則參數間用逗號隔開,冒號右邊為 lambda 表達式的返回值。lambda 表達式的本質是匿名的、單行函數體的函數,故lambda 表達式可以寫成函數的形式。