Python若是玩得好的話,不只能提升工做效率,還能夠作一些頗有意思的東西,好比製做動畫並生成視頻。我曾經實現過一個生成排序算法可視化視頻的腳本,並開源到了GitHub。html
都說Python是膠水語言,調用C/C++模塊很方便,因此它用途這麼普遍其實很大程度上歸功於C/C++的生態。對於此次作的我的項目,生成視頻的步驟要用到大名鼎鼎的C庫FFMpeg,Python膠水語言的特性讓它成爲了可能。python
下面就是這個視頻成品。用Matplotlib庫實現排序算法動畫,並利用FFMpeg生成mp4原始素材,最後用Premiere進行了手工後期處理。視頻中把九種排序算法放在一塊兒做爲對比,分別是:算法
插入排序 希爾排序 選擇排序
歸併排序 快速排序 堆排序
冒泡排序 梳排序 猴子排序
複製代碼
(加入猴子排序徹底是想皮一下,畢竟一次成功的機率只有 )網絡
在構思方案的時候,我不可避免的走了一條由彎到直的路。最原始的方案是,用Python模擬各類排序算法,而後逐幀繪製生成步驟圖片,將圖片序列導入AE轉成視頻。後來以爲python直接寫圖片太麻煩,有沒有更方便的輪子?因而想到了Matplotlib庫做爲圖表工具能夠繪製柱狀圖,恰好與我想要的圖片形式重合。後來改爲了用Python+Matplotlib逐幀生成圖片,再將圖片序列導入AE轉成視頻。最後,又以爲圖片序列導入AE太麻煩,能不能直接輸出視頻?所幸Matplotlib既支持逐幀動畫,又能夠和FFMpeg結合,直接以mp4格式將動畫輸出。excited!app
至於如何獲得排序算法每一個時刻的切片,我想過將幀編號和排序算法的進度聯繫起來,邊播放邊獲取下一幀的數據。後來發現操做起來頗有難度,徹底能夠先走一遍排序算法,獲得全部幀的數據,再逐幀播放。這樣雖然多耗了點內存,實現起來仍是很簡單的。下面以基本的選擇排序爲例介紹一下:工具
def selection_sort(data_set):
ds = copy.deepcopy(data_set)
for i in range(0, Data.data_count-1):
for j in range(i+1, Data.data_count):
if ds[j].value < ds[i].value:
ds[i], ds[j] = ds[j], ds[i]
return ds
複製代碼
選擇排序的代碼很是簡單,咱們要作的就是在算法比較有表明性的地方截取數據切片做爲幀數據,而後同時處理幀數據,爲某些重要的數值染色。最後的代碼是這樣的:學習
def selection_sort(data_set):
# FRAME OPERATION BEGIN
frames = [data_set]
# FRAME OPERATION END
ds = copy.deepcopy(data_set)
for i in range(0, Data.data_count-1):
for j in range(i+1, Data.data_count):
# FRAME OPERATION BEGIN
ds_r = copy.deepcopy(ds)
frames.append(ds_r)
ds_r[i].set_color('r')
ds_r[j].set_color('k')
# FRAME OPERATION END
if ds[j].value < ds[i].value:
ds[i], ds[j] = ds[j], ds[i]
# FRAME OPERATION BEGIN
frames.append(ds)
return frames
# FRAME OPERATION END
複製代碼
能夠看到新代碼在原先的代碼上加了三塊處理幀數據的操做,並用註釋標了出來。第一塊:初始化幀列表,原始數據做爲第一幀;第二塊:在第二層循環內部截取幀,並把第i個數據塗爲紅色(r),第j個數據塗爲黑色(k);第三塊:在幀列表中加入已排序的數據做爲最後一幀,並返回幀列表。優化
這樣,咱們就能夠用最直觀的方式看到選擇排序的過程以及i和j的意義:第i個元素一直在取j掃過部分的最小值。動畫
固然,這只是這些排序算法中較爲簡單的截取及染色方案。還有一些算法比較抽象,從排序過程當中難以看出規律,好比堆排序。我給大根堆的每一層塗上了不一樣的顏色,並用紅色表示正在下沉或上浮的結點,用黑色表示紅色結點調整位置的過程當中須要比較的孩子結點或父結點。spa
我已經把這些代碼所有開源,並優化了一下用戶接口,有如下幾種輸出:
提及Python流行的緣由,無非是其接近天然語言的語法和及其強大的生態。前者保證了熱烈的社區環境,後者使Python的用途大大增長,就算對於非IT從業人員,工做效率也會事半功倍。
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,若有問題請及時聯繫咱們以做處理
想要獲取更多Python學習資料能夠加QQ:2955637827私聊或加Q羣630390733你們一塊兒來學習討論吧!