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