完全用Python工作—Harness the power of Python

作者: 石雨浓

引自:完全用Python工作
第一天, 太初有道, 神谕, import light, 于是便有光.

(Quick fact: 在python解释器里输入import antigravity有彩蛋)

作为一个业余物理工作者以及入门计算机使用者, 选择一门称手的编程语言是非常重要的事. 从计算能带, 处理数据, 编写脚本到画图, 写个http服务器分享文件 (看上去很专业,实际在Python里只有一行), 做个网页, 几乎全部需要计算机完成. 但是为了这其中每个不同的目的单独去学一门语言成本简直过于高, 于是需要一个一般用途(general-purpose)的语言,处理所有的事是非常自然的事情.

编程语言的两极是Assembly和Haskell, 一个接近硬件的本质, 一个接近计算的本质. 一个是地狱, 处理着最繁琐最耗神的事情:内存分配, 系统调度, 硬件架构, 各种寄存器A1, B2… 一个是天堂, 优美的写着递归, 高阶函数, lambda表达式, 优美的并行计算(完全不用考虑race condition). 然而我们生活在人间, 所以大规模应用的语言不可能如此纯粹. 两端中间游离着很多general-purpose的语言, C, C++, Java, Ruby, 几乎都能达到我们所有日常的要求. 只不过,这些语言能做的Python都能做,而且Python做得更好。接下来我说明为什么。但是要说明本文的读者不包括写嵌入式,写javascript以及写大型项目对性能要求极高的人(即使是大型项目也可以80%用python,20%用C),当然还有就是java和C++的重度患者。(完全使用XX工作意思不是”所有人都完全使用XX工作”!显然只是部分人。更多的是,非专业编程但是想提高效率的人。比如之前有篇<完全使用*nix工作>,C#,ios开发的人显然就一下也不能用。对于我,linux再好我也只能装在老电脑上交交CS225的作业。当我把mint, opensuse, archlinux装遍了,下一步就是gentoo了的时候,否决它只有一条理由,我笔记本电池不经用,而桌面linux的电源管理…… 感谢我的cpu风扇~!)

首先,我想说的是,为什么不用下面这些大部分人很熟悉的语言:

  1. C: 你难道指针扎得不疼么? 每天收垃圾很舒服? 键盘上P右边两个键是不是已经按坏了?

  2. C++: 学C++三年以内请不要说你会C++; 学了三年以上的人, 恭喜你们, 你过去几年浪费的时间我可以拿着香飘飘环绕地球一圈了.

  3. Java: 不好意思, Java的面向对象对我来说是原子弹打原子。 而且Java7才引进Lambda表达式实在是太晚了, 即使java以后会跟python越来越像, 至于支持真正的函数式编程? 我希望下个末日之前可以实现. 而且有时候我确实需要单行执行的解释器而Java并没有。

  4. Ruby: Ruby很好,但是你为什么不直接说你只是为了用RoR?

  5. Lisp: 如果你用lisp, 你平时肯定会用python或者perl写脚本。 而且你会Lisp不去拯救世界还来看这篇文章干什么?! 抽象语法树什么的最讨厌了….

  6. Perl: 我第一次看Perl的代码就感觉像用脚写的. “为什么满屏的正则表达式?”!

  7. C#, php, javascript:呵呵。

  8. Shell: 这算语言么?

  9. Matlab: 第一,我穷酸学生没钱每年买你的正版, 看到激活码就想吐。 第二,我不想心血来潮画两个心形函数的时候用1mb的窄带花两天下个5.03Gb的文件在我128Gb的固态硬盘里装,然后用完两个小时就删,如此循环。 第三,我会python了不想再花时间学你的sb语法,熟悉你的.m文件。第四,所有对windows的垄断的血泪控诉都直接对mathwork转过来吧~什么对开源,对自由,对的打击信仰~绝对适用~ 第五,python大部分时候如果不比你好用至少跟你一样好用,而这只是它不到10%的功能,几个程序员业余时间写出来的库。真心请matlab你这个没事发邮件“培训一个星期2000刀打折700刀”的大公司滚粗。

  10. Haskell: 每次想静下心来学haskell 都会情不自禁从范畴论看起….

对于单纯程序语言的使用者来说,用途(内在逻辑)大于一切不必要的语言细节。比如我就想建个数组放东西,为什么我要懂内存回收?!

所以在易用性方面,Python相对于他们作了很大改进的部分。

好吧,你会说Python没有缺点么。确实有,而且很严重,那就是运行慢。而且是慢出风格,慢出自信。(Python 3比Python 2 慢 15%以上, 这是一种什么风格!)相同的程序Python比C慢几百倍很正常。这让Python的发展受到很多限制。但是对于个人使用来说这个缺点完全不属于缺点。第一,这个年代谁没有奔腾酷睿2什么的。你手机的运行能力都可以几毫秒内把你在厕所拍的几千张自拍液化,磨皮,磨骨好几遍了。而且你觉得0.01秒和0.5秒的区别真的那么大么?12秒也不是很久啊。第二,很大程度上程序的慢更关乎于算法,比起O(n)和O(n^2)的区别, 语言间的差异就显得很小了,第三,请注意,如果你使用过Python而且真实的觉得Python慢,那么情看下这个列表:

  1. Google创立前的第一个网络爬虫。

  2. Quora,美国最大在线知识问答平台,开复哥总是在上面拽文的。

  3. Dropbox。

  4. Youtube

  5. BT。

  6. 知乎,中国的Quora。

  7. 豆瓣,开创社交工具绿色系代表yp的先河。

你知道我要说什么了。…..恩~他们有一个共同点~ ———— 都是Python写的!如果tmd的Dropbox没有觉得Python慢,请你也有足够的信心不要觉得Python慢。另外八卦一下,现在Python之父前两天从google去Dropbox了,这是很值得自豪的事, 值得Dropbox为之自豪。

Python是荷兰人van Rossum1991年开发完成的脚本解释语言。起这个脑缺的名字是因为他是一个叫做Monty Python的脑缺喜剧团体的脑残粉(BTW,Monty Python出演的巨蟒与圣杯是英国电影史上跟大话西游同样地位的喜剧,其中亚瑟王被黑成了炭,里面圆桌骑士们拿着块石头敲来敲去各处蹦达着,看影评我才知道这是表示他们在骑马%&……×(). 于是人们知道以这么脑残的名字取的语言不是像brainfuck语言一样是brainfucker,那么就会像莫里盖尔曼以乔伊斯“芬尼根的守夜人”中虚构名词来命名的夸克一样,成为一个一个不朽的新创造。Python显然属于后者。

接下来,说正题,为什么Python如此先进(对于初学者)。

代码简洁性和可读性

写过hello world,hello android, hello **的人都知道,学语言最好的途径就是写和读(即使是学书面的自然语言)。所以代码的可读性是选择学一门语言的关键因素,因为你代以后会花很多时间读别人的代码。可读性带来的影响是非常深远的。有种说法, 说在遥远的古代阿拉伯数字传入之前欧洲之前, 其数学发展几乎为0, 而造成这种缓慢的原因就是因为复杂的罗马数字的广泛使用。这表明很多时候即使我们不愿意承认, 往往是形式决定的内容. 比如罗马数字没有0, 自然很多数学概念就难以发展. 没有流形也不可能发展广义相对论一样. 所以…………如果想以后从此过上幸福的生活, 请不要选用perl. 如果不幸选择了perl, 那么就君就 一入侯门深似海,从此萧郎是路人 了。当以后你两行清泪的看着自己十天前写的不过10几行的楔形文字时, 你就会明白.

而Python的可读性是我见过最好的:

  1. Python的代码格式使用缩进而不是括号。 首先节省了很多行数, 变得而为紧凑, 而美观. 相传的俄罗斯人偷美国NASA的C代码那个段子满屏括号的情况是不可能出现Python版本的. 第二,逻辑相当清晰. 循环的结束与开始一目了然. 第三, 屏幕右方得到充分利用. 比如使用24寸屏幕的人是不是感觉自己总是望着左边编程…..和17寸等高的屏幕区别不大, 很费右边的电.

比如, 这是某个C用来图像采样的算法的代码:

好吧, 很带萌感, 画风也很不错.

但是Python也不是写不出混乱的代码, 或者说只要有一定自由性的语言就可以写出。 比如没事写个(Pseudo Code): boolean AlwaysTrue = False; 或者int MagicNumber =42; 什么的。

这个是Python版, 完全不符合Python哲学。

Python的思想

上面一点是语言形式的, C也可以改成缩进, 所以此项不是核心优势. 而使用一门语言是使用它的思想. 于是要谈到Python的哲学, The Zen of Python. 在python命令行里输入import this可以看到,:

Beautiful is better than ugly.美优于丑

Explicit is better than implicit.晰胜于浑

Simple is better than complex. 简胜于繁

Complex is better than complicated. 繁胜于杂

Flat is better than nested. 平胜于嵌

Sparse is better than dense. 稀胜于稠

Readability counts. 可读至上

Special cases aren’t special enough to break the rules. 殊例不足违训

Although practicality beats purity. 虽实用大于纯粹

Errors should never pass silently. 谬不可疏

Unless explicitly silenced. 除明示

In the face of ambiguity, refuse the temptation to guess. 晦不存疑

There should be one– and preferably only one –obvious way to do it. 一法万用

Although that way may not be obvious at first unless you’re Dutch. 若非尼德兰红毛,法难定 (……科学没有国籍)

Now is better than never. 今胜于无

Although never is often better than right now. 无胜于促

If the implementation is hard to explain, it’s a bad idea. 难述其施,谬法也

If the implementation is easy to explain, it may be a good idea. 其施可述,或可行

Namespaces are one honking great idea – let’s do more of those!命名空间,多多益善

如果觉得俺翻译得太烂可以看英文. 但是你看到一个物品/工具/器件/用品的设计理念是如上时, 除开认为设计者装逼之外, 必定会觉得这个工具是十分可靠, 清爽的. 首先看到这个蹩脚的诗我就想到的是Unix伟大的亲嘴原则(Keep It Simple and Stupid), 而Python的确如此。(部分)解读如下:

美优于丑。我只想举一个例子,你们感受一下(哈哈哈哈)。学C语言写辗转相除的novice们先include你的stdio去吧:

   -----def gcd(x, y):while y:x, y = y, x%yreturn x----

明晰胜于浑晦:

   Python逻辑与或用and 和 or 而不是  && 和 ||

简胜于繁,繁胜于杂,平胜于嵌,稀胜于稠 可读至上:

   分别用C和Python写个hello world就能明白。

特例不足违反规则:

   这句话最好的例子是Python没有char类型。因为大伙儿认为char只是一位的字符串。

实用大于纯粹:

   于是Python里有chr().

谬不可疏 除明示:

   有时候exception还是重要的

晦不存疑,一法万用:

   1. 与其用iterator, for循环, 指针移动,数组下标移动, 不如一个for...in...直接解决问题。2. list,dict和tuple的数据结构也是希望能适用于绝大部分场合。这三位可以在必要的时候变成:列表,栈,队列,哈希表,七七八八各种东西....3. 函数的参数也勉强可以算进来。利用*和**, python的函数参数灵活性无以复加。

若非尼德兰红毛,法难定:

   第一次看到荷兰人写的xx= if yy>0 then 0 else 1 是不是想哭...

中间几句太哲学了…..:

   略过....

命名空间,多多益善:

  面向对象...

要不是科比最近战绩太差…这些特性简直可以形容为黑曼巴…灵活,准确,快速,强力。

Python语法的优美之处数不胜数,难以名状,深入人心,犬牙交错,人神共愤,不随意肌。语法是思想的延伸,有人说你学一门新语言而不学习新的思想则。还是新评装旧酒。由于我不是写tutorial,就不一一讲述所有的细节了。 只列举下最好和简单的特性, 而像decorator(面向切面),generator,多线程,itertools,一次肯定也讲不完。

  1. Python中的整数相当于C中的长整型(long), 32位的机器上整型取值范围为 -2147483648至2147483647, 64位机器上为-9223372036854775808到9223372036854775807。Python的长整型是无限制的,只要内存允许。很相似的是Python里的无限list。一个很著名的例子是使用生成器(generator),就可以生成一个无限长的Fibonacci数列;

def fib():

a=b=1

while True:

   yield a a, b= b, a+b

这个数列号称无限长,其实是需要运算哪一位时才计算。这就是著名的惰性求值。Python中的长整型和无限list的概念均来自于Haskell。

对于C和C++要处理大数据要使用高精度算法, 用一个struct表示一个大数, 使用一个array储存它, 然后自定义运算函数(加减乘除)。

  1. List comprehension,切片等操作

使用list comprehension可以杜绝掉50%以上的for循环,后者的效率极其低下(可以看看C源码的实现),而且不够紧凑。我之前上面举的第一个粒子就是list comprehension的很好的运用。随便举个python官方文档的粒子:

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x !=y]

运行结果得到,

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

反转一个数列的例子,是个one-liner :

lis[::-1]
  1. 正则表达式

Python正则表达是内置的。一个粒子是我在实验室测试Josephson Junctions时碰到的情况,简化的说就是:我有几百个文件夹,每个文件夹有几百个文件,每个文件有几万条数据,每几个数据我要处理完然后存在另外一个文件夹的另外一个文件里。我要做的工作有:

-用正则表达式找到我要的文件夹和文件,剔除不需要的。-逐行读出txt文件里面的数据-每几个数据设个参数平均,最小二乘处理,剔除几个极端情况,画出图-保存 这里Python就起到了一个脚本语言应尽的责任了。

整个从打开文件到保存 不超过150行,还加上我罗哩叭嗦的注释。如果用C写… 呵呵呵呵呵呵。当然这个用Shell也不会太差,不过实验室用的是windows,用windows脚本我还不如去死。自从我写完这个脚本后,从此我们实验室的testing就过上了幸福的生活。(可能么?)

4.reduce, lambda, filter 和map

这些全来自于函数式编程。比如找到prime之内的质数:

filter(lambda prime: all(prime%num for num in range(2, prime)), range(2,prime))

如果作为中文读出来则是(prime是之前给定的一个数):在2到prime之间,过滤出那些所有不被2到自己整除的数。难道还能更简单么!如果用的C, 呵呵。 这里出现了Zen of Python没有提到但是是Python里非常重要的一点,对“数”的操纵。毕达哥拉斯信奉一切皆数,程序语言更应算更是如此,只有对“数”和“类型”的完全掌控,才能如鱼得水。

  1. 语言的动态性 Python是动态语言,这是非常重要的一点,一直忘了说。这一点可以直接完爆C++自己一向自豪的泛型编程,模板编程。且看一个strangeness为0的粒子:
    def build(type, value):

    return type(value)

build(int, 0)

所以稀饭们请看过来, 你们家C可以三行写出这种东西么?!!没完,接着:

def impose(func, value):

   return func(value)

def anyfunc(value):

   return value*value

print impose(anyfunc, value) #此处是python2.7的语法

一看就知道是函数式编程。请问C可以么?!

当然还有之前说的函数参数的灵活性:

如果定义一个函数

def print_whatevercrapsthefuckinguserinputs(**params):

print params

你就可以想输入多少参数就输入多少了,比如print_whatevercrapsthefuckinguserinputs(“I”,”dont”, “give”, “a”, “fuck“),

只要有print函数的接口(这又涉及了鸭子类型和类似haskell的typeclass的性质, 呱….)。其实际作用是 比如你想在数据库里输入大批量用户信息,mi amigo,对于这样一个蛋疼的函数名字,调用一次就够了。

在Python里类型,函数,全部都是可操作的对象。这可以改变一切。第一个例子显示了对数据类型的操作,第二个是对函数的操作,第三个是对参数的控制。我不想想象用C写这个例子了,因为C根本写不出来。 以上所有这些Python的特性,你可能说我用C实现一个一样的就好了。诚然,你可以在C里一个个写出来自己喜欢的特性,但是你写到后面你会发现你只是再次发明了Python,然后拿C重新写了一个解释器, 而且实现得更烂而已。Please! Don’t re-invent the wheel.

Python的类库齐全

对于我们普通人来说一个语言最重要的还是库函数的齐全程度,Java在此方面已经登峰造极了。而现在的Python不输于他。一个语言的火热程度可以从类库看出, 下面是github上语言的排名:

由于Javscript的特殊性和Ruby的RoR我们就不去管它了,Python占8%,C占6%. 貌似差得不远, 恩. 但是如果你仔细看C的project,随便翻十页可能发现会有三页的项目其实是在写python的类库. 真是母亲为孩子显出一切.

另外一个说明Python类库齐全的例子是我这个学期被某教授压着要算一个固体模型的Berry’s Phase. 正值final之前, 如何有心思写这厮. 一筹莫展之际竟然发现python有个固体算能带和巴里态的库!!nm这也能有!? 仔细观摩了下源代码, 1000来行,干净整洁, 速度用之,皆大欢喜. 这种小众库都有我已经不能想象你有什么变态要求Python不能满足了. 以下是一些常用的类库.

1.如果你想写网络应用,轻量级:web.py (web.py的作者最近自杀去世,RIP)中量级:Django,Pylon 重量级:twist。其实很多人诟病Python的网络框架过于多,不能集中起来,我倒觉得无所谓。我用过Django, 写个小小的博客程序,1000多行,这是用java不可想象的。Youtube上有个半个小时的用Django写博客的演示:http://www.youtube.com/watch?v=srHZoj3ASmk 。 半个小时!!一边写一边讲!一个博客程序!!还带后台功能!What the F*! 是编程么!?我脱稿写个平衡树都不只半个小时啊!

2.如果你想做科学计算,NumPy&SciPy可以取代90%matlab的常用功能,然后让我想一想,他们好像只有几十mb!!加上Pythonxy也才700mb多!但是你没有更多的新学语法的成本,也不用付给mathwork血汗钱。

3.网络爬虫。Python的超强项,beautifulsoup的网页解析,scrapy等等,不一而足。Twitter, 微博等好像也有python的API。

4.Machine Learning,数据分析和Natural Language Processing。 请去Kaggle上看看多少参赛者是用的Python。 著名的库有Pandas。

5.写游戏。Pygame。 试过几个别人写出来的游戏,非常顺畅。

6.桌面应用。 pyqt。Dropbox貌似就是使用的pyqt写的。

最后我想讲下Python Challenge。Python作为一个强劲的编程语言有着极为活跃的社区,文档丰富,教程齐全。当然就有很好的网上解谜过关类的教程。Python Challenge是在各个类型的解谜过关性的我看到过的最好的一个。难度适中,而且可以从中学到很多。解法不局限于python,可以用perl, shell,C甚至Erlang!官方解答往往有10多种解法,精妙至极。但是你会一步步从中发现Python的优势。一共33关,在充满乐趣的智力挑战和极大的满足感后,你可以学到PIL库的使用,pickle的使用,正则表达式,完成后你会发现思维方式的改变。 什么?不知道网址在哪里?Let me google that for you。 我做了半年多已经完成得还行了,我会把答案和分析帖在这里。

Last words

神爱众人,于是带来Python。

                                      ---------------PIRATICUS 13:7

完全用Python工作---Harness the power of Python相关推荐

  1. 2018年python工作好找吗-2018年Python发展前景如何?Python就业有哪些方向?

    原标题:2018年Python发展前景如何?Python就业有哪些方向? python值不值得学?2018年Python发展前景如何?Python就业有哪些方向? 最近一两年做开发的被一门编程语言,也 ...

  2. 2018年python工作好找吗-2018年 Python面试必看的10个问题及答案

    找工作是每个学习Python人员的目标,为了更好的找到工作,刷面试题是必不可少的,了解最新企业招聘试题,可以让你面试更加的顺利.小编整理了一些2017年最新的Python面试题,来测测你技术的掌握度吧 ...

  3. python工作目录_如何使用python 3获取当前工作目录?

    When I run the following script in IDLE import os print(os.getcwd()) I get output as D:\testtool but ...

  4. 深圳python工作好找吗_深圳Python岗位需求量如何?

    准备去深圳,但能力不是很强,所以想问你到底掌握到什么程度了.深圳这座城市,我只想说岗位需求量不会太少.不过,相对其他一线城市来说,深圳还是少一些的.北京上海岗位需求量会多些,你就业的机会也多些. 考虑 ...

  5. python入门基础代码图-适合Python入门的5本基础书籍

    原标题:适合Python入门的5本基础书籍 Python 3标准库 对程序员而言,标准库与语言本身同样重要,它好比一个百宝箱,能为各种常见的任务提供完美的解决方案,所以本书是所有Python程序员都必 ...

  6. 金融工程及其python应用pdf_金融工程及其Python应用

    金融工程及其Python应用 编辑 锁定 讨论 上传视频 <金融工程及其Python应用>是2019年1月清华大学出版社出版的图书,作者是朱顺泉. 书    名 金融工程及其Python应 ...

  7. 学习python需要什么基础-要学Python编程,需要什么样的基础呢?想找这方面工作...

    原标题:要学Python编程,需要什么样的基础呢?想找这方面工作 作为一个初学Python的新手,如何学好这门语言,肯定经常是一头雾水. 那么,学好这门编程语言的基础是什么呢? 第一步,就是马上到网站 ...

  8. 自学python如何找工作-新手小白如何自学Python出去找工作?我用这五本书告诉你...

    众所周知,自从人工智能火起来之后概念以来,python行业的发展呈现出前所未有的蓬勃趋势,相应的,它所需要的人才也成倍增长.尤其是到了2018年,IT行业的薪资普遍高于其他行业,那么python到底为 ...

  9. python自学多久可以找到工作-零基础如何自学Python并且找到工作,其实也就这3点,4点...

    做Python开发多年,给大家详细分析一下这个问题 首先告诉你的是,应届生零基础开始学习Python肯定难,Python的专业程度本身就不简单,学习这事本来就是一件非常煎熬的事情,人都不愿意学习,可是 ...

最新文章

  1. KVM虚拟机安装与使用
  2. Java 集合类(一)
  3. 报错:ModuleNotFoundError: No module named ‘cv_bridge‘,以及在ROS是如何安装cv_bridge库包
  4. java分页模板_java 分页模型的模板
  5. java classpath详解_java Classpath全解(转)
  6. Angular移动工具集要让Web应用有原生的感觉
  7. 计算机辅助翻译技术工具,浅析计算机辅助翻译技术对译者的影响
  8. 多媒体计算机辅助英语教学,多媒体计算机辅助初中英语教学的实践研究
  9. matlab检验相关性显著性检验,基于matlab的栅格数据相关分析及显著性检验
  10. Word批量设置章节为标题格式
  11. 怎样将图片制作转换圆形图片
  12. 计算机键盘突然失灵,笔记本键盘突然用不了怎么办_笔记本键盘突然失灵怎么回事-win7之家...
  13. 怎么退出磁贴桌面回到传统桌面?
  14. 风行天下!翔升N61S智能主板低价上市
  15. easyexcel自定义拦截器,实现自定义单元格样式
  16. 测试人员的基本技能要求 - 快速掌握业务知识的能力
  17. 【小程序】自定义导航栏
  18. 互联网电影院带来新突破,5G+4K’
  19. ImGui添加背景图片的两种方式
  20. JavaScript脚本语言的使用

热门文章

  1. 未来世界,已经不在遥远
  2. cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix)
  3. java polygon 用法_Java Polygon.getBounds方法代码示例
  4. JAVA加密工具类实例
  5. 万兆NAS存储网络组建方案
  6. 艾宾浩斯记忆曲线(遗忘曲线)
  7. python 百度地图api
  8. ctfshow萌新计划web22
  9. 关于mikefile 萌新用法
  10. ipad发布会ipad_如何在iPad上调试网站