搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 我爱学Python > 学习python不得不知道的知识

学习python不得不知道的知识

我爱学Python 2017-10-30

引言

本文继续介绍以 Windows 平台为背景的 Python 开发相关的工具。希望能对你有所帮助。另外很多东西本文都是延续之前那篇,有这里没仔细讲的东西那都在之前的文章里。

推荐下我自己的python学习群:643692991,不管你是小白还是大牛,小编我都挺欢迎,不定期分享干货,包括我自己整理的一份2017最新的前端资料和零基础入门教程,欢迎初学和进阶中的小伙伴。

Python 大家族

首先得提一下 Python 语言和 Python 实现之间的关系。计算机语言本身可以说是一个规范,一个很好的例子就是 Scheme。R5RS 就是 Scheme 语言的一个规范文档,这里基本上规定了语言的规则,语法等方方面面。但是光有文档肯定还是不行的,所以就会有人根据语言的规范来实现一个能用的语言编译器或者解释器。对于 Python 来说,其语言的规范在文档里的 The Python Language Reference。而我们常用的 Python 常常被称为 CPython,这是官方提供的,也是使用最广泛的一个实现。事实上 Python 作为一个流行的语言还有着很多不同的实现。下面会介绍一些其他的 Python 实现,和一些 Python 衍生的语言。

PyPy

如果你经常关注 Python 相关的新闻那你一定看到过 PyPy。概括的讲它的目标是实现一个与 Python 完全兼容但速度要快很多的 Python 实现。在官方提供的评测页面中,你可以看到现在 PyPy 比 CPython 要快5倍左右。然而它自身也有一个很麻烦的问题就是 PyPy 不兼容 C 扩展,这也是它一直以来难以得到普及的一个原因。

对于我等一般用户来说,PyPy 已经算是相当成熟了。现在的 PyPy 2.0 是一个与 Python 2.7 兼容的版本,其中绝大部分标准库的内容都是可以使用的,而且大部分纯 Python 库也没有问题。官方现在提供包括 Windows 的各种版本的包裹下载。你可以自己尝试下使用 PyPy 有没有使你的程序跑的更快。如果可以的话那你就完全不费力气的获得了性能的提升,这也是 PyPy 项目吸引人的地方之一。

另一方面 PyPy 本身也提供了一套开发语言解释器的框架。官方博客有一篇文章介绍了如何编写一个简单 Brainfuck 解释器。

IronPython

IronPython 是微软 .Net 平台上的一个 Python 实现。事实上这基本上算是来自微软的一个开源项目,其所使用的 DLR 也是 .Net 4.0 中一个新的重要功能。

由于工作的原因我之前试着用了下 IronPython,感觉真是...惊呆了。如果试过在 C/C++ 项目中嵌入 Lua 或者其他脚本语言的经验,你会觉的要能让他正常的跑起来其实还是挺难的。起码你自己要处理将 C 的函数或者 C++ 的 Class 暴露到脚本语言中,处理脚本中的异常等等。总之就是挺麻烦。

但如果是用 IronPython 那基本上那你要操心的事情就非常少了。像 Class 都可以直接暴露给 IronPython,C# 可以直接接到 IronPython 中的异常,也可以很容易的取得 IronPython 中的值或者 Class。而且 IronPython 可以很简单的使用 .Net 中的类,事实上你都可以用 IronPython 来写 WinForms 程序。总而言之,就是太方便了。

在效率方面的话其实 IronPython 跟 CPython 没有太大区别。但是如果你是 .Net 开发者的话一定得看看 IronPython。说不定就有机会用到。

相对于 .Net 平台,在 Java 上也有对应的 Jython 项目。不过这个我完全没有用过所以没什么可以说的。

Cython

"在Python中性能不够的地方,你可以用C语言来重写从而提升效率" - 我估计你应该在哪里看到过类似的说法。但这个到底应该怎么做呢? 要用 C 语言来重写 Python 模块说实话是个挺麻烦的事情。好消息是 Cython 就是针对这个问题的一个项目。Cython 提供了一个类似 Python 的强类型语言,Cython 可以将其编译为 C 的代码,然后你可以很轻松的将其编译成 Python 的 C 扩展 .pyd 文件。pyd 文件在 Windows 下其实就是 dll,如果使用 Cython 的话你就可以省去很多麻烦的事情。

但是坏消息是所有扯到 C 语言的东西在 Windows 上都显得非常麻烦。Cython 的配置也相对比较复杂。好消息是你还是可以通过安装超牛逼的 PythonXY 来把所有事情都搞定。

跟目标 Cython 类似的,调用 C/C++ 原生代码扩展的框架还有 cffi, swig 以及标准库中的 ctypes。

Windows 上同时安装 Python3 和 Python2

到 2014 年初,Python3 发布已经整整五年了。虽然用的人不多,但现在的情况是大部分流行的纯 Python 的库,特别是 Web 相关的基本都有了 Python3 的版本。毕竟现在 2.x 系列版本已经停止了新功能的开发,而 Python 3 虽然没有什么大的变动,但一直在加入一些有意思的库和新功能。现在 Python 3 已经即将发布 3.4 版本,是时候开始试试了。

但是现实生活总是这么残酷,你不太可能立马卸载掉系统上的 Python 2 换上新的。在 Linux 下很多发行版提供了额外的 Python 3 包裹,可以用python3来调用就很方便。事实上在 Windows 上也可以,只是需要很多手动操作而且会有莫名的问题。现在 Python 3.3 版本为 Windows 特地加入了一个 Launcher,让 2.x 和 3.x 在 Windows 上并存变得非常简单。

安装 Python 3.3+

首先,下载 Python 3.3 以上的版本进行安装。过程中需要注意在配置界面,取消掉 "Register Extensions" 和 "Add python.exe to Path" 两个选项,这样就不会影响到你系统中的 Python 2.x。

对这方面感兴趣,想要学习python或者想要了解python可以加群:643692991

完成安装之后,会有 py.exe和 pyw.exe两个可执行文件被拷贝到你的 windows目录下,它们总是默认在 path上的,所以可以直接在命令行里被调用。之后你就可以用 py来选择你要使用的 Python 版本

学习python不得不知道的知识

更棒的是,py.exe 可以解析你运行的程序第一行的 #! (shebang)。这个在 Windows 下其实是不管用的,但是 py.exe 会根据里面写的内容来运行对应的版本:

学习python不得不知道的知识

对这方面感兴趣,想要学习python或者想要了解python可以加群:643692991

但有一个比较麻烦的问题是,Python 3 安装目录下的 Scripts 文件夹,也就是存放各种库的可执行文件的文件夹,默认不会被放到 Path 上,而且就算你手动放上去偶尔也会弄混。好在 py.exe 在 '-3' 后面的参数都会正常的传给真正运行的 Python 解析器。利用这一点我们可以不需要额外配置,就调用到库的脚本。

python -m

相信很多人应该用过这个东西,Python 很多标准库都提供这样的调用方式来实现一些简单的命令行功能。Python 3 现在自带 pip。比如我们想使用 Python 3 的 pip 来安装别的库,我们可以这样:

py -3 -m pip install bottle

跟你预料的一样,这样就可以了。当然你可以用个 .bat 文件来把这些包裹起来并放在 Path 上,一个简单的例子,把下面的内容写到一个叫 pip3.bat 的文件里:

@echo off

py -3 -m pip %*

并放到 Path 上,就可以方便调用了。其中 %* 负责传递所有的命令行参数。

实际上 python -m 可以用的东西还真的挺多,这里给出一个不完全的列表:

学习python不得不知道的知识

对这方面感兴趣,想要学习python或者想要了解python可以加群:643692991

安装 IPython

IPython 2.0 最近发布了,采用了新的 wheel 格式来打包二进制,然后使得在 Windows 上的安装变得非常简单。运行:

py -3 -m pip install ipython

然后如果你已经把 C:Python3xScripts 放到 PATH 上了后,直接运行 ipython3 就好了。

我的 Python 开发流程

我一直觉得我的 Python 使用情况应该很有代表性。我经常写独立的脚本或者几个文件一起组成一个小的程序,没有正式的写过要给别人用的库。所以我在做 Python 开发的时候大多数时候都是写几行跑一下,大部分时间在跑程序。我自觉地找到了一个感觉非常好的开发流程,这里简单的介绍一下,希望能对你有帮助。

I P Y T H O N

现在我做任何 Python 相关的东西都离不开 IPython 了。虽然没有用到任何里面向科学计算的高端的功能,但是就算是日常开发我感觉 IPython 也能带来极大的效率提升。而 IPython 也是我在 Python 开发上完全放弃 IDE 的原因。用 IPython 加上你最喜欢的文本编辑器,感觉就像能飞起来!

IPython 和 Python 自带的 repl 比起来就像是 Windows 上的 cmd 和 Linux 下的 bash 之间的区别。IPython 不需要任何配置就可以进行 tab 键补全,按上下选取历史命令(甚至支持 Ctrl + R!),和 pdb 有非常完美的集成。

一个实际的例子

这里以一个简单的例子来讲解一下上面描述的是怎样的一个情况。我们要写一个可以将简单的数据表达式,类似 1 + (2 - 3) * 456 解析成树的 Pratt Parser。首先我们需要一个 lexer 把每个 token 解析出来,那么最开始的代码就是:

学习python不得不知道的知识

明显这个没有任何意义,但现在程序已经有足够的东西能够跑起来。我们把这个程序存为 expr.py,开启一个命令行窗口,运行 ipython 然后像这样执行它:

学习python不得不知道的知识

对这方面感兴趣,想要学习python或者想要了解python可以加群:643692991

在 IPython 里面用 run 跑的好处有很多,首先是你在程序执行完毕后整个程序的状态,比如最后全局变量的值,你写的函数这些你都是可以随便执行的!同样的你可以在 IPython 里面保存一些用来测试的常量,每次用 run 跑的话新的程序会被重新载入,你可以这样方便的测试每个函数,有一个非常动态的环境来调试你的程序

学习python不得不知道的知识

然后按照之前的想法,我们尝试把这个 lexer 写出来。在这个过程中,IPython 可以用来查看函数的文档,测试如何调用某些函数,看看返回值是什么样子等等,还是跟上面的说的一样,我们有一个动态的环境可以真真正正的执行程序,你可以在把代码写到你珍贵的主程序之前就有机会运行它,这样你可以更确认你的代码能正常工作:

学习python不得不知道的知识

对这方面感兴趣,想要学习python或者想要了解python可以加群:643692991

确认了各个步骤以后,我们把 lexer 的代码填起来。我们为了节省纵向的空间我们把很多东西写在一行里面:

学习python不得不知道的知识

对这方面感兴趣,想要学习python或者想要了解python可以加群:643692991

看起来不错,我们还是在 IPython 里执行试试,结果发现程序抛出了一个异常:

学习python不得不知道的知识

嗯?好像程序里已经处理了空格的情况。怎么会这样?不知道你碰到异常的时候一般都怎么办。你可能会选择到处添加 print,用 IDE 断点调试。其实这种情况用 pdb 是很明智的选择,在 IPython 里我们可以非常轻松的使用它。

学习python不得不知道的知识

对这方面感兴趣,想要学习python或者想要了解python可以加群:643692991

通过方便的调试和仔细检查代码,我们发现是没有正确的使用 elif 造成了问题!(我知道这个过程不是太符合情理...)。把代码里的后面的几个 if 都换成 elif 以后我们发现结果基本上是对的了。我们可以马上再跑几个类似的例子,确认不同的输入是否都有比较好的结果:

对这方面感兴趣,想要学习python或者想要了解python可以加群:643692991

在一段痛苦的调试之后,我们最终把程序写出来了。很遗憾程序超出了我预计的长度,就不贴在这里了。后面部分的开发过程跟前面基本还是一样,总结起来就是:

  1. 保持你的程序是一个可以运行并且有意义的状态,尽可能频繁的运行。

  2. 在 IPython 里查看文档,尝试小的程序片段,测试些你不确定的做法,确定之后再把东西添加到你的代码里。

  3. 用不同的参数在 IPython 里测试你正在编写的函数/class。

  4. 当遇到问题的时候,先简单的用pdb在异常处 break,十有八九都能有些头绪。

额外的注意事项

这里举的例子是你所有的开发都是在单个 .py 文件里的。现实生活中你很有可能会横跨几个文件一起修改。请务必注意,在 IPython 里你每次 run 的时候只有被 run 的那个文件里的东西会是最后修改的版本,其 import 的东西如果在期间被修改是不会反应出来的。

这个的原理就跟你在 Python shell 里在修改前修改后重复 import 某个模块不会有作用是一样的,Python 神奇的 import 机制不会去追踪其他模块的修改。你可以手动用 reload 函数来重新载入,你也可以使用 IPython 的 autoreload 功能来让你忽略这个问题。个人来说我没怎么用过这个功能,IPython 没有默认开启它可能也是有些顾虑,请自己评估看看。

另外你应该已经注意到,run 的效果基本上就是把你的代码拷贝进 IPython 里执行一遍。对于没有 __main__ 的文件,你也可以 run,这样里面定义的函数和 class 就会反映出你的更改。

我写这篇文章也是纯属个人兴趣爱好,望与广大博友共同学习和讨论。


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《学习python不得不知道的知识》的版权归原作者「Python热爱者」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注Python热爱者微信公众号

Python热爱者微信公众号:Python-520

Python热爱者

手机扫描上方二维码即可关注Python热爱者微信公众号

Python热爱者最新文章

精品公众号随机推荐