作为一个数年C/Java/Python混合开发者, 我谈谈我的感触.
我认为C, Java跟Python都是十分胜利的语言, 具体选哪种看你的场景.
言归正传,来比照一个Python跟Java.
Python:
长处
语法简洁柔美, 功能强大, 规范库跟第三方库灰常弱小, 应用领域十分广:
vinta/awesome-python · GitHub
(跟PHP造成宣明比照!)
语言方面, 举几个例子:
一切都是对象!!!
类(class自身)/函数/类办法是callable的对象
因为是对象,所以你当然能够传来传去啦. 比方:
python">class A: def __init__(self): print "init A" def run(self): print "run A"threading.Thread(target=A).start() #: 在另一个线程执行A()a = A()threading.Thread(target=a.run).start() #: 在另一个线程执行a.run() ... # 惊呆没有,这是怎么做到的?? 兴许你该看看描述符的概念
List表达式(其余好多语言也有,然而我最喜爱python的写法):
把"1023"变成 [1, 2, 3]
class="highlight">
[ int(x) for x in "1023" if x != "0" ]
(以后你能够用Lisp格调的: map(int, filter(lambda x: x != "0", "1024")))
对dict也是相似:
adict = {"a":1, "b":2}{k: v*2 for k, v in adict.items() }
yield关键字:
当你须要返回很多货色而后一个一个用的时候, 你能够一次返回一个
def xrange(n): i = 0 while i < n: yield i i += 1用法:for i in xrange(10): print i
装璜器@:
把something_heavy()返回的后果缓存起来(以函数名+args为缓存的键值,只缓存最近应用的10条)
@functool.lru_cache(10)def something_heavy(args): #各种耗时操作..... pass
运算符重载:
试试numpy, 你会惊呆的, 操作向量/矩阵跟根本类型一样不便
毛病:
慢
目测python是最慢的脚本语言,比V8上的JS还慢不少. (钻研一下描述符,你会发现python调用对象办法的开销好大!)
然而python创始人说了, 个别程序的瓶颈在于20%的代码, 所以你能够把那20%的代码用C重写(而python是胶水语言,用C重写局部代码当然很easy啦)
同时,你能够试试PyPy, 引入了JIT技术
动静类型
有人说: 动静类型写时爽, 重构起来是劫难(原谅我记不得原话..).
对于不写unittest, 不做代码覆盖率测试的人来说, 动静语言当然是危险的, 拼写错误都可能被暗藏, 重构?别捣鬼!
python创始人有话说: "如果你认为编译器能够帮你解决所有问题,那你肯定干编程没多久" (鄙人深有体会,已经年少轻狂的我十分鄙视javascript), "不论什么程序,都须要写testcase, 既然要写testcase, 那么动静类型不是问题!"
在此举荐大家两个工具: py.test python-coverage
Java:
长处
用几个词形容一下Java语言: 柔美, 谨严, 强壮,不易出错.
当然, 应用也十分的宽泛: 长年盘踞编程人员数量排行榜第一名!
各种库也灰常多:
akullpp/awesome-java · GitHub
同样的代码, 相比C++(甚至python), Java代码出BUG的概率要小点(当然,写的时候个别会比python长).
Java从语言设计上尽量避免了程序员犯错, 比方主动垃圾回收, 摈弃无符号类型, 平安的枚举, 编译期泛型查看(Java1.5之后退出的泛型,然而只是用来做编译器查看,运行时跟以前一样), 强制的异样解决(遇到异样必须catch或者申明throws) 等等(当然,某些个性python也有.)
Java规范库和好多第三方代码都充斥着浓浓的设计感!!!, 各种设计模式到处可见. 从上面的语句能够看出一点来:
new BufferedInputStream(new FileInputStream(new File("somepath")))
尼玛, 好多字, 看我的:
C:
fopen("somepath", "r")
Python:
open("somepath")
Java代码多,然而API可复用行更强,抉择更多(我想一次读完文件,不要buffer呢?)
因为强壮平安,所以Java成了企业级后盾的规范. 想想银行后盾, 要害中央出点bug可不得了.
毛病:
要敲好多代码, 参考下面的例子...
没有Python那些奇葩个性, 灵活性有余,怎么写你还是Java, 而Python能够写的像Javascript/Lisp/Matlab.....
简略来说, Python是给人设计的(人生苦短,请用Python), C/C++更像是为机器设计的,而Java则介于两者之间.
如果你是高手, 写出的代码没什么bug, 也不必怎么调试, 那举荐你用python(前提是他的慢你能忍耐. 当然,高手眼里, 他会的就是最好的....)
如果你写的代码bug多,大部分工夫在调试代码,你可能须要理解一下Java, 或者写足够多的testcas