Python与C++的GP比较
上次myman对python的GP没有什么兴趣。那我今天就写上一段代码,看看是否能够提起myman的兴趣。
代码很简单用冒泡排序对一组数据进行排序,虽然python有自己的sort函数但是我想自己写一个
可能更加好理解也更加能够提起myman的兴趣
代码如下
class UpSort:
def sort (self,List,CompareFucntion):
"对一个列表依据自定义的比较函数作升排序"
for k in List:
for o in List:
if getattr(self,CompareFucntion )(k,o)==1:
temp=List[List.index(k)]
List[List.index(k)]=o
List[List.index(o)]=temp
class DownSort:
def sort (self,List,CompareFucntion):
"对一个列表依据自定义的比较函数作升排序"
for k in List:
for o in List:
if getattr(self,CompareFucntion )(k,o)==0:
temp=List[List.index(k)]
List[List.index(k)]=o
List[List.index(o)]=temp
class MySort:
def __init__(self):
#定义原始数据
self.li=[5,8,45,2,68,90,12,67,23,89,29,38,0]
def mycmp (self,p,q):
"自定义比较函数"
if p>q:
return 1
else:
return 0
def excuteSort():
#为MySort装配UpSort功能
MySort.__bases__+=(UpSort,)
#生成MySort对象
obj=MySort()
#对原始数据作升排序
obj.sort(obj.li,"mycmp")
print obj.li
#为MySort删除UpSort功能
MySort.__bases__=tuple(list(MySort.__bases__).remove(UpSort))
#为MySort添加DownSort功能
MySort.__bases__+=(DownSort,)
#对原始数据作降排序
obj.sort(obj.li,"mycmp")
print obj.li
if __name__ == "__main__":
#执行程序
excuteSort()
执行结果
[90, 89, 68, 67, 45, 38, 29, 23, 12, 8, 5, 2, 0]
[0, 2, 5, 8, 12, 23, 29, 38, 45, 67, 68, 89, 90]
这段代码可能些的有写罗嗦,其实类MySort可以写一个upcmp和一个downcmp,然后传入sort函数同样可以完成功能我只所以要这些写无非要突出python的Mix_in的特性。在c++或者java中无论你用继承还是用gp一旦类的定义完成将不可能更改它的自己的语义,也就是说他们是静态语义的
譬如 用gp c++这样写
template <class T>
class DownSort {
DownSort()
{
..........
}
};
template <class T>
class UpSort {
UpSort()
{
..........
}
};
DownSort<char*> Ds;
Ds.DownSort()
UpSort<char*> Us;
Us.DownSort()
class DownSort {
DownSort()
{
..........
}
};
class UpSort {
UpSort()
{
..........
}
};
如果用继承
Class Sort :public DownSort,UpSort
{
}
但是在PYTHON中间的实现完全靠PYTHON的Mix_in.MySort类一开始没有任何SORT的功能,当我用Mix_in特性为MYSORT上加上一个DOWNSORT然后生成的对象就具有DOWNSORT功能,当我把DOWNSORT卸载掉然后加入UPSORT功能它又能加上UPSORT功能。这样的Mix_in的特性当然在C++或者JAVA中都可以用继承来实现但是继承就带来了结构上的臃肿和冗余,可能我要DOWNSORT而不要UPSORT的时候在C++或者JAVA中无论如何都要为一个类定义两种功能而PYTHON你可以随时装配。PYTHON就好比是一个可拆卸的自行车,用GP的思想实现各种各样的算法然后用过Mix_in特性装配到你需要的地方。而c++或者java只能是要多少装多少的重型卡车。PYTHON及能够实GP的现数据与算法的分离又降低了继承的层次性。
另外Python的动态语义特性能够比c++的函数指针能更好的处理gp中的抽象。
在sort函数中python通过系统函数getattr的来识别由CompareFucntion传入的函数字符串比如我传入"mycmp"然后getattr就能够得到mycmp的运行实例后面加两个参数就能够正确的运行函数
def sort (self,List,CompareFucntion):
"对一个列表依据自定义的比较函数作升排序"
for k in List:
for o in List:
if getattr(self,CompareFucntion )(k,o)==1:
在stl中相同的功能是这样处理的
sort(vectro.being(),vector.end(),mycmp)
他通过函数指针来处理
这样做的最大的好处在于可以避免冗长的switch case或者if else语句