作为一个数年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