2013年2月16日

为啥俺推荐 Python[5]:作为瑞士军刀的 Python——顺便分享俺整理的 Python 开源库

  本系列几乎变成年度系列了——上一篇帖子是去年元宵节发的。这几天正值春节假期,赶紧抽空补上本系列新的一篇,免得大伙儿以为本系列“烂尾”了。
  “瑞士军刀”,大伙儿应该很熟悉,俺就不解释了。拿“瑞士军刀”来比喻 Python 就是想说明:Python 不但短小精悍,而且功能强大。今天就来介绍一下 Python 的这两个特点(尤其是后者)。


★短小精悍


◇轻量级的的代码


  要吹嘘 Python 的轻量级,首先要吹嘘的,自然是它简洁的代码。为了让大伙儿有个初步的印象,举几个例子。

  举例1
  要得到100-200之间所有奇数的3次方,只需如下一行
[x**3 for x in range(100, 200) if (x%2)==1]

  举例2
  如果要把上述结果拼成一个逗号分隔的字符串,还是只要一行
','.join([str(x**3) for x in range(100, 200) if (x%2)==1])

  举例3
  可能有人觉得上面2个例子是小儿科,再来举一个稍微复杂点的。只需一行代码,即可实现网络扫描(用的是第三方的 Scapy 工具)。
# 传统的 ping 扫描,基于 ICMP 协议
ans,unans = sr(IP(dst="192.168.1.1-254")/ICMP())
# 局域网扫描,基于 ARP 协议
ans,unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"), timeout=2)

◇轻量级的安装环境


  比如 Python 的安装包只有十几兆,而 Java 的 JDK 安装包动辄接近100兆。

◇轻量级的运行环境


  同样是运行一个“Hello World”,用 Python 写的进程,占用的内存会更小(相比大多数其它编程语言)。而且 Python 的运行环境(Python 虚拟机)可以很方便地嵌入到 C/C++ 程序中,只需额外带一个动态库即可。


★功能强大之1——跟非常多的语言整合


  很多程序员喜欢“在一棵树上吊死”——始终只用一种编程语言。俺非常反对这种倾向。要想成为一个优秀的程序员,有必要掌握【不同风格/不同范式】的编程语言。编程语言多样化的好处在于,你可以利用不同语言的特色,以取长补短。
  而 Python 在跨语言整合方面,堪称佼佼者——你很难找到哪个语言,能像 Python 这样,跟如此多的语言进行整合。
  下面简单举几个例子:

◇跟 C/C++ 整合


  咱们常用的 Python 运行环境也称为 CPython,是用 C 语言写的。所以 Python 天生就具有跟 C/C++ 整合的能力。而且这种整合是双向的——也就是说,既可以在 Python 模块调用 C/C++ 模块,也可以在 C/C++ 模块调用 Python 模块。
  Python 跟 C/C++ 整合,可以有如下三个优点:

  1. 丰富的第三方资源
  因为 C/C++ 具有非常丰富的第三方模块(包括开源和闭源),其丰富程度超过 Java。所以 Python 可以利用这种整合能力,直接调用各种 C/C++ 的模块,来丰富自己的功能。
  举个例子
  比如 cURL 是一个C语言编写的应用层网络工具,功能非常强。而 Python 可以通过整合 cURL 直接获得 cURL 的强大功能。

  2. 性能的提升
  除了第三方模块丰富,C/C++ 开发的模块还有一个优点——性能好。所以,Python 整合了 C/C++ 模块之后,还能趁机获得性能提升。
  举个例子
  比方说你要写一个 3D 游戏,其中的 3D 渲染引擎是性能瓶颈。那么你可以用 Python 整合一个 C/C++ 的 3D 渲染引擎。而 Python 只用来实现跟游戏高层应用逻辑相关的部分。这样可以一举两得:性能不差,代码不多。
  顺便说一下:如今有不少游戏都走这个开发思路——底层引擎用【重型的】C 或 C++ 实现,以确保高性能;而高层的业务逻辑则用【轻型的】脚本语言来开发。

  3. 跟操作系统整合
  地球上的操作系统,只要是有点名气的,内核都是 C 语言写的;除了操作系统内核,大部分操作系统的运行库也都是 C/C++ 编写的。所以,Python 跟 C/C++ 整合,可以带来第三个好处——跟操作系统的整合。关于这点,待会儿俺还会专门聊。

◇跟 JVM(Java) 整合


  通过 Jython 这个开源项目,Python 可以无缝整合到 JVM 环境中。如此一来,Python 能直接调用所有 JVM 标准库(比如 JDBC)和第三方库(比如 Lucene),还可以跟各种 JVM 语言(比如“Java、Scale、Groovy”等)进行互操作。

◇跟 dotNet 整合


  通过 IronPython 这个开源项目,Python 可以无缝整合到 dotNet 环境中。如此一来,Python 能直接调用所有 dotNet 的标准库(比如 ADO.NET)和第三方库,还可以跟各种 dotNet 语言(比如“C#、F#”等)进行互操作。
  顺便说一下:Jython 跟 IronPython 貌似同一个作者,牛人啊!


★功能强大之2——既可以跨平台,又可以跟操作系统深度整合


◇Python 语言如何体现“跨平台性”?


  说到跨平台这个话题,俺给编程语言分一下类:
1. 可以跨平台,但无法跟操作系统深度耦合(比如 JavaScript、PHP)
2. 可以跟操作系统深度耦合,但无法跨平台(比如 VB、VBScript)
3. 既可以跨平台,又可以跟操作系统深度耦合(比如 C C++ Python)

  为啥第三类语言能做到两者兼得?因为这类语言把选择权留给了程序猿——
一方面,如果程序猿遵循跨平台的开发规范,那么写出来的代码就是跨平台的;
另一方面,程序猿也可以写出跟系统耦合很紧密的代码——这样的代码虽然不能跨平台,但可以发挥特定平台的强项。
  显然俺喜欢第三类编程语言,因为这类语言给了程序猿自由。

◇Python 语言如何“与操作系统深度整合”?


  Python 的跨平台特性,懂 Python 的同学估计都晓得了。所以俺单独说一下 Python 如何跟操作系统深度整合。为了照顾到大多数人,俺拿 Windows 来说事儿。
  在 Python 社区有一个很有名气的库,叫做 PyWin32。通过这个库,可以让 Python 代码很容易地调用 Windows 的 API 以及 COM 组件。
比方说,可以用 Python 代码直接操作 Windows 注册表
比方说,可以用 Python 代码直接读写 Windows 的系统日志
比方说,可以用 Python 代码直接操作某个窗口句柄
比方说,可以利用 COM 组件,直接调用 Word 来处理 doc 格式的文档
......


★功能强大之3——具有很丰富的第三方模块


  最后一个方面,也是最重要的一个方面,就是 Python 社区具有非常非常丰富的资源(第三方库),而且几乎都是开源的。形形色色的编程领域几乎都可以看到 Python 的身影。
  为了让众多程序员读者领略 Python 的丰富资源,俺特地整理了一个 wiki 页面(请用鼠标猛击“这里”),放上 Python 在各个编程领域的常用模块。为了显示出 Python 代码的简洁,某些模块还放上示例代码。
  最后感叹一下:
  写这篇博文只花了不到一小时,而整理这个 wiki 页面累计超过10个小时。不过这时间没白花——整理的时候顺便对某些领域有了更多的了解。这也就是写博客的好处,既可以帮助别人,又可以帮助自己。
  大伙儿如果觉得俺整理的清单有遗漏,欢迎到本页面留言补充。


回到本系列的目录

62 条评论:

  1. python系列终于更新了!放鞭炮庆祝。

    回复删除
  2. 我也想学学编程(纯粹出于个人爱好),学哪种编程语言比较好,C语言、Java还是Python?怎么入门?
    P.S.前两天给您发了两封E-mail,怎么沉了?

    回复删除
  3. 我也想学学编程(纯粹出于个人爱好),学哪种编程语言比较好,C语言、Java还是Python?怎么入门?
    P.S.前两天给您发了两封E-mail,怎么沉了?

    回复删除
    回复
    1. TO 王峥
      俺每天收到的邮件较多,所以回复不太及时。
      不过俺总是尽量回复每一封读者来信(通过1-2周之内,会有回复)。

      如果是[b]非技术背景[/b]的网友学习编程,俺强烈推荐用 Python
      另外,不建议用 C/C++/Java 作为入门语言。

      Python 的上手很快,语法很接近自然语言。
      而且作为脚本语言,具备交互模式(每输入一行代码,立即可以看到效果)

      入门的话,可以看看 Python 官网介绍的几本
      [url]http://wiki.python.org/moin/IntroductoryBooks[/url]

      删除
    2. 这发表时间我怎么越看越糊涂了,博主你这条这发表时间是2013年2月19日上午12:17:00,往后到了白天接近中午你发表的是2013年2月19日上午11:17:00等等,那个上午12:17:00应该是凌晨00:17:00。还是标注24小时的比较好,虽然知道怎么回事,可有时会看的费劲。

      删除
    3. TO 2单元的网友
      多谢批评 :)

      Google 的这个 BlogSpot 平台,显示时间有点小瑕疵。
      凌晨0点XX分,会显示为上午12点XX分。
      所以你看起来会有点怪。

      刚才俺又去 BlogSpot 的后台设置看了一下,在可选的“评论时间戳格式”里面,找不到更合适的。
      那些时间是“24小时制”格式的,日期的格式不理想(不是“XXXX年XX月XX日”格式)

      删除
    4. TO 编程兄
      请问为什么不建议c/c++/java作为入门语言呢 求解答

      删除
    5. TO 池筱沫
      C 语言比较偏底层,对于功底不深的入门者而言,偏难。
      C++/Java 太重型,同样不利于快速上手。

      删除
    6. 我也觉得初学者不要用C来入门。因为初学的时候兴趣是很重要的,快速开发有助于保持这种兴趣。另外体会编程的思想,体会程序帮你做事情的方法,都是初学者更需要做的事情。C太底层了,初学写起来比较无趣,指针虽然强大,却很容易磨掉初学者的锐气。Python简单,方便,而且强大,是入门的好语言。

      删除
  4. 中国土壤污染导致的农产品污染已成为一个大问题
    中国已经进入一个工业污染全面影响人们生活的时代!过去常为人知的是水体污染,今年1月的东部大范围雾霾天气使得空气污染开始受到重视,其实,不为人知的土壤污染的危害也许更大。春节之前,国家环保部公布的一份文件透露,在对全国30万公顷基本农田保护区土壤有害重金属抽样监测时发现,有3.6万公顷土壤重金属超标,超标率达12.1%。调查显示,华南地区部分城市50%的耕地遭到镉、砷、汞等有毒重金属,以及石油类有机物污染;长江三角洲地区有些城市连片的农田遭多种重金属污染、10%的土壤已基本丧失生产力。因重金属造成的水源与土壤污染已严重威胁内地的生态环境、食品安全、民众身体健康以及农业可持续发展。环保部门估计,全国每年因重金属污染的粮食高达1200万吨,造成的直接经济损失超过200亿元人民币。据披露,环保部和国土资源部早年曾调集2万人,对全国土壤环境状况展开联合调查,但该项耗资10亿元的调查结果却始终不向公众公布,引发社会舆论的质疑。上月底,北京律师董正伟向环保部提交申请,要求公布信息,至今也未获回应。一名土壤研究者称,受污染的1200万吨粮食,除农民自己吃外,部分已流入市场。有人测算,1200万吨粮食可养活4400万人,这意味着至少4000万人天天在吃“重金属”粮食。早在2002年,农业部稻米及制品质量监督检验测试中心,曾对全国市场稻米进行安全性抽检,结果显示,有近30%的大米含铅量超标,另有10%的镉超标。有公众舆论质问:现在中国受到普遍的严重污染,空气变毒气,地上有毒水,毒土产毒米,我们何以安全地容身?安邦的智库学者认为,中国已进入一个为普遍的工业污染偿还“债务”的时代,其代价必将十分高昂。

    回复删除
    回复
    1. 在咱们天朝,朝廷高官和特权阶层都有特供的食品。污染再严重,他们反正无所谓。
      所以,那些有权力去解决污染问题的人,其实没有动力去解决。

      要想根本解决天朝的污染问题/食品安全问题,关键还是要改变政治体制。
      在成熟的民主国家,如果严重的污染问题或食品安全问题被曝光,政府高层官员(甚至国家领导人)会下台。
      这样才能迫使官员花精力去解决问题。

      删除
  5. Python系列终于更新了,话说在等你更新Python的这段时间里……我早已不再是Python菜鸟了啊……
    对了老大,我发给你的邮件你看到了吗~x*a@gmail.com的,等着你的回复啊~~

    回复删除
    回复
    1. 俺每天收到的邮件较多,回复往往不及时,抱歉 :(
      今天晚上回复了一批,不知道是否有你的这封。

      顺便恭喜你脱离“Python 菜鸟”

      删除
  6. 我觉得python的优点就是语法简洁和可以混合其他语言,以前觉得python太简单,其实是我想复杂了。

    回复删除
  7. 很喜欢你的博客,想学习编程 可否推荐一个比较适合新手的学习顺序.谢谢~

    回复删除
    回复
    1. 如果你之前没有技术背景,可以考虑从 Python 开始接触编程。
      对于 Python,非技术人员也可以快速上手,掌握基本语法和标准库。
      熟悉之后,可以自己动手写一些小工具练手。
      自己动手实践,可以更好地了解语言和相关的库。

      删除
    2. 嗯,我也是 非技术背景的物理专业学生,现在毕业了,很想学学python 作为一个业余爱好

      删除
  8. [/URL]http://www.chinese.rfi.fr/%E6%B8%AF%E6%BE%B3%E5%8F%B0/20130221-%E9%A6%99%E6%B8%AF%E7%BD%91%E4%B8%8A%E8%B5%84%E8%AE%AF%E8%87%AA%E7%94%B1%E6%88%96%E5%B0%86%E5%8F%97%E9%98%B2%E7%81%AB%E5%A2%99%E9%99%90%E5%88%B6[URL]
    香港网上资讯自由或将受防火墙限制 香港也快沦落了

    回复删除
    回复
    1. [url]http://www.chinese.rfi.fr/%E6%B8%AF%E6%BE%B3%E5%8F%B0/20130221-%E9%A6%99%E6%B8%AF%E7%BD%91%E4%B8%8A%E8%B5%84%E8%AE%AF%E8%87%AA%E7%94%B1%E6%88%96%E5%B0%86%E5%8F%97%E9%98%B2%E7%81%AB%E5%A2%99%E9%99%90%E5%88%B6[/url]
      香港网上资讯自由或将受防火墙限制 香港也快沦落了

      删除
    2. 多谢分享 :)

      香港越来越惨 :(
      想肉身翻墙的同学,今后不要考虑“港澳”两地了。

      顺便引用该文章的其中一句:
      “香港政府企图以私隐为名禁止公众查阅董事资料,与大陆禁止公众查阅房产拥有人资料如同一辙,实际上是保护和隐藏官二代和太子党在香港财富。”

      删除
  9. 正好我这几天在CodeCademy上学Python

    回复删除
  10. 向LZ提个问题,python写mac的stand alone 程序 只能用py2app么? 生成的软件几十MB,感觉好臃肿。

    回复删除
    回复
    1. TO Chengjian Wu
      还可以再尝试一下 PyInstaller,该工具同时支持多种平台,包括 Mac OS X

      删除
  11. 我被无良父母摧残毁掉了学习能力,逻辑能力差,零基础,想学Python编程可是不懂英文怎么办?现在什么计算机的培训机构靠谱,培训是从哪学起?本屌再学其它什么计算机知识比较好就业.高端没能力,做一个IT民工就满足.

    本屌严重社恐,极度自卑,去饭店洗盘子真心适应不能觉得黑暗压抑仿佛集中营,因此目前无奈未逃离无良父母的人间地狱,恐慌中,这个屌丝被权贵奴役的社会几乎没我这种状况的人生存缝隙。

    回复删除
    回复
    1. 不必太自卑。
      能够翻墙到俺博客留言,至少说明你在获取信息方面,比很多不懂翻墙的人要好。

      关于自学软件开发,俺个人不建议去那些培训机构——关键还是靠自己(尤其是自己的兴趣和热情)
      如果有兴趣、有热情
      完全靠自学都可以成为高手,俺碰到过好多这样的人。
      如果没兴趣、没热情
      去再好的培训机构,效果也未必好

      如果想进一步交流,可以给俺发邮件

      删除
    2. 这id是在恶搞么???

      删除
    3. 发完上一条本屌才发现不用帐户用任意名称留言的方法,并不是区别对待。

      删除
    4. 如果是匿名留言,俺倒是希望大伙儿也随便起一个别名,尽量不要用“匿名”二字。
      很多人都用“匿名”,搞不清谁是谁

      删除
  12. 不懂英语应该问题不大,逻辑能力差,可能不太好解决。英语差可能导致的问题就是程序可读性差点,逻辑能力差,写程序肯定要先自己知道算法。不过学习应该在于坚持,慢慢也就好起来了了。我曾经自学c语言,开始也经历了一个艰难的过程,慢慢就顺了。不过学习过程中碰到问题最好能有个可以知道你的,这样学的轻松很多,这问题得 靠你自己解决。顺便说一句,要从0基础,到做一个初级程序猿,后面的路还比较长。

    回复删除
  13. 如果作者还看到的话:wiki补充上web开发框架 flash 和 tornado, 其中tornado拆分了torndb的库,专供/单独用于sql也很方便。

    回复删除
    回复
    1. 多谢推荐 :)
      已经把这两个框架加入到 wiki 中。

      删除
  14. 博主好,一口气看完了你的Python系列,感觉很过瘾。很久以前变听闻Python大名,一直没有付诸行动,一是比较懒,二是目前工作中还接触地比较少。现在决定开始行动了,希望博主给些建议,多谢多谢了。

    回复删除
    回复
    1. TO Daniel Guo
      关于 Python,即便工作中没用到,业余时间也可以自己折腾一下,练练手。
      而且俺在本系列前面的帖子里有提到,Python 支持的编程范式很丰富,作为程序员,了解多种不同的编程范式,对扩展思路很有帮助。

      删除
  15. 博主你总算更新了,不容易啊。

    我自己一直在用Python做开发,深知Python调用其他语言的方便之处。但是最近我同事经常询问我反过来的事情,希望我能用Python反过来给他们提供C能调用的库,请问这方面你有什么好的教程推荐吗?

    回复删除
    回复
    1. TO Linzhou Zhang
      你也太后知后觉了吧?
      这篇博文是今年2月份发布的,你现在才发现啊 :)

      如果要让 C 调用 python 模块,可以使用 python 官方提供的 C API

      删除
  16. 博主请教一下
    我注意到这个命令
    [x**3 for x in range(100, 200) if (x%2)==1]
    当时我是查了好多资料无意间在一个博客中看到的
    请教一下如果我想专门练习这样的技巧(比如上面这个命令就是把一串命令变成了一行)
    该怎么样入手?

    回复删除
    回复
    1. TO 21楼的网友
      Python 的这种简洁的写法,有人喜欢有人不喜欢。
      如果你喜欢这种写法,只要多看几个类似的例子,依样画葫芦,应该是不难的。
      如果一时半会儿学不来,也没有太大的关系——可以继续使用传统写法

      删除
    2. 我是从其他语言转到C家族的,一个很大的原因就是C可以写出如此美妙的句子。当时带我的师傅就说,如果你换了C以后还是按照老的写法,那还不如把老的语言忘掉重新学一遍。不是有本书说程序员应该每隔一段时间就学习一门新的语言吗?学习新的语言并不是简单的了解语法,知道自己现在写的程序在这个语言里怎么写,而是汲取这个语言设计的优点,尽可能地加入到自己的编码风格里面。

      删除
    3. 这是列表推导式,不难,但是好看。如果你学坚持学python的话现在已经可以写出pythonic的代码了吧

      删除
  17. 编程大哥说完了嘛?要是没有我想对你说两个字:快更!:-)
    莫介意,开个玩笑。

    回复删除
  18. 目测这个系列要成隔年系列了 :)
    大哥加把劲啊!

    回复删除
  19. 编程胸, 这文章里的推荐python模块的页面没有迁移到github啊

    回复删除
  20. 准备学习,多谢博主的无私奉献

    回复删除
  21. 講講python又講講食品問題、污染問題、政治體制,學到好多....

    回复删除
  22. 不能有效的投入到学习中,该怎么办额

    回复删除
    回复
    1. 一样= =感觉不能学以致用

      删除
  23. "写这篇博文只花了不到一小时,而整理这个 wiki 页面累计超过10个小时"

    (曾经的)良心博主啊。。。

    回复删除
  24. 非常棒的文章!

    回复删除
  25. TO 编程随想
    不知道你能不能看见这个留言,回头看看你以前得博文,发现真是有太多未竟的系列 :)
    除了这个系列,印象中还有“三年饥荒”,六四等 :)
    连掘墓人的义举也远没有结束 :(
    今年又到了最后一个月,前几天还看见你回复了一批评论,希望往后也能和你一起走到中国的黎明 :)
    我自学了一段时间编程,现在卡在了 递归,动态规划 和 AI 上,也许是因为我懒,也缺乏热情。
    活在这样的国家里,热情慢慢地被消磨殆尽,而少有补充,最难以接受的是做着让这个国家变得更好的努力,却受到最亲近的人的中伤 :(
    编程随想君,除了丛林社会的残酷,周遭的人也只有冷漠,该怎样重燃热忱呢?

    回复删除
    回复
    1. TO 地平线不及的
      老熟人,你好:
      刚才看了你在最新一篇博文的留言,特来回复。

      1、关于未完成的系列
      确实有很多坑没填上。
      因为俺精力有限,必须考虑【优先级】,并作出一些【取舍】。
      别担心,只要俺还在继续写博客,那么这些系列就有希望写完。

      2、关于学习编程

      2.1 实践
      不同的领域,其“理论/实践”的比例也是不同的。
      而编程是一个【非常强调实践】的领域。
      自学编程的话,【切忌】只看书不实践。
      这样的效果会很差,可能过一段时间就忘了。
      反之,如果边看书边动手,会有如下几个好处:
      2.1.1
      实践能强化记忆
      2.1.2
      实践过程中会碰到一些困难(比如碰到 bug),在解决困难的过程中,又能学到新的东西
      2.1.3
      (对某些人来说)实践的过程中,还能让你体会到编程的乐趣
      俺曾经在博客中提到过这种乐趣,俺称之为“构建的乐趣”。
      就如同小孩子喜欢搭积木,这也是一种“构建的乐趣”。

      2.2 动手实践编程,有几个注意事项:
      2.2.1
      你要写的程序,要【难度适中】
      太容易,你碰到的困难太少,就无法帮你学会“如何解决问题”
      太困难,会产生挫败感,打击你的积极性。
      2.2.2、
      你要写的程序,最好是比较【有趣】。
      这样的话,编写的过程中,即使碰到困难,你潜意识里也更愿意去克服。
      而且一个【有趣】的程序,一旦完成会给你带来快感,从而形成某种【良性循环】。

      3 关于身边人对你的影响
      最后,关于你提到的:
      [quote]最难以接受的是做着让这个国家变得更好的努力,却受到最亲近的人的中伤[/quote]

      类似的情况,俺也碰到过。
      (你身边的人,价值观未必与你完全一致)
      正好前几天发了一条长留言,谈【如何摆脱环境对自己的影响】,或许可以供你参考。
      https://program-think.blogspot.com/2018/11/share-books.html?comment=1543483701168

      删除
  26. 作为新手真的对python很动心!

    回复删除
  27. 能预言一下go是否会jvm话吗

    回复删除
  28. 有tf和torch这俩库,python未来还要厉害些

    回复删除