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你们一块儿来学习讨论吧!