人生苦短,我用Python(Python快速教程 - 基础篇)

Life is short, you need Python

人生苦短,我用Python

Python简介

本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使

Python简史

Python是一门解释型的高级编程语言,特点是简单明确。Python作者是荷兰人Guido van Rossum,1982年他获得数学和计算机硕士学位后,在荷兰数学与计算科学研究所(Centrum Wiskunde & Informatica, CWI)谋了份差事。在CWI期间,Guido参与到了一门叫做ABC的语言开发工作中。ABC是一门教学语言,所以拥有简单,可读性好,语法更接近自然语言等特点。在那个C语言一统天下的年代,ABC就是一股简单的清流,毕竟是门教学语言,最后没有流行起来,不过这段经历影响了Guido。1989年的圣诞假期,闲得蛋疼的Guido决定设计一门简单易用的新语言,要介于C和Shell之间,同时吸取ABC语法中的优点。Guido用自己喜欢的一部喜剧电视剧来命名这门语言:《Monty Python's Flying Circus》。

1991年,第一版基于C实现的Python编译器诞生,因为简单,拓展性好,Python很快就在Guido的同事中大受欢迎,不久Python的核心开发人员就从Guido一人变成了一个小团队。后来随着互联网时代的到来,开源及社区合作的方式蓬勃发展,Python也借此上了发展的快车道。因为Python非常容易拓展,在不同领域的开发者贡献下,许多受欢迎的功能和特征被开发出来,渐渐形成了各种各样的库,其中一部分被加入到Python的标准库中,这让本来就不需要过多思考底层细节的Python变得更加强大好用。在不过多考虑执行效率的前提下,使用Python进行开发的周期相比传统的C/C++甚至Java等语言都大大缩短,代码量也大幅降低,所以出bug的可能性也小了很多。因此有了语言专家Bruce Eckel的那句名言:Life is short, you need Python. 后来这句话的中文版“人生苦短,我用Python”被Guido印在了T恤上。发展至今,Python渐渐成了最流行的语言之一,在编程语言排行榜TOBIE中常年占据前5的位置。另外随着Python的用户群越来越壮大,慢慢在本身特点上发展出了自己的哲学,叫做Python的禅(The Zen of Python)。遵循Python哲学的做法叫做很Python(Pythonic)。

Python拥有很好的扩充性,可以非常轻松地用其他语言编写模块供调用,用Python编写的模块也可以通过各种方式轻松被其他语言调用。所以一种常见的Python使用方式是,底层复杂且对效率要求高的模块用C/C++等语言实现,顶层调用的API用Python封装,这样可以通过简单的语法实现顶层逻辑,故而Python又被称为“胶水语言”。这种特性的好处是,无需花费很多时间在编程实现上,更多的时间可以专注于思考问题的逻辑。尤其是对做算法和深度学习的从业人员,这种方式是非常理想的,所以如今的深度学习框架中,除了MATLAB,或是Deeplearning4j这种摆明了给Java用的,其他框架基本上要么官方接口就是Python,要么支持Python接口。

安装和使用Python

Python有两个大版本,考虑到用户群数量和库的各种框架的兼容性,本文以Python2(2.7)为准,语法尽量考虑和Python3的兼容。

Unix/Linux下的Python基本都是系统自带的,一般默认为Python2,使用时在终端直接键入python就能进入Python解释器界面:

在解释器下就已经可以进行最基本的编程了,比如:

写程序的话还是需要保存成文件再执行,比如我们写下面语句,并且保存为helloworld.py:

print("Hello world!")

然后在终端里执行:

安装更多的python库一般有两种方法,第一是用系统的软件包管理,以Ubuntu 16.04 LTS为例,比如想要安装numpy库(后面会介绍这个库),软件包的名字就是python-numpy,所以在终端中输入:>> sudo apt install python-numpy

Python自己也带了包管理器,叫做pip,使用如下:>> pip install numpy

安装和深度学习相关的框架时,一般来说推荐使用系统自带的包管理,出现版本错误的可能性低一些。另外也可以使用一些提前配置好很多第三方库的Python包,这些包通常已经包含了深度学习框架中绝大多数的依赖库,比如最常用的是Anaconda:

Download Anaconda Now!

Windows下的Python安装简单一些,从官方网站下载相应的安装程序就可以了,当然也有更方便的已经包含了很全的第三方库的选择,WinPython:

WinPython

并且是绿色的,直接执行就可以用了。

Python基本语法

There should be one-- and preferably only one --obvious way to do it.

对于一个特定的问题,应该只用最好的一种方法来解决。

-- Tim Peters

基本数据类型和运算

基本数据类型

Python中最基本的数据类型包括整型,浮点数,布尔值和字符串。类型是不需要声明的,比如:

其中#是行内注释的意思。最后一个None是NoneType,注意不是0,在Python中利用type函数可以查看一个变量的类型:

注释中是执行type()函数后的输出结果,可以看到None是单独的一种类型NoneType。在很多API中,如果执行失败就会返回None。

变量和引用

Python中基本变量的赋值一般建立的是个引用,比如下面的语句:

a赋值为1后,b=a执行时并不会将a的值复制一遍,然后赋给b,而是简单地为a所指的值,也就是1建立了一个引用,相当于a和b都是指向包含1这个值的这块内存的指针。所以c=1执行的也是个引用建立,这三个变量其实是三个引用,指向同一个值。这个逻辑虽然简单,不过也还是常常容易弄混,这没关系,Python内置了id函数,可以返回一个对象的地址,用id函数可以让我们知道每个变量指向的是不是同一个值:

注释中表示的仍是执行后的结果。如果这时候我们接下面两个语句:

可以看到b引用到了另一个变量上。

运算符

Python中的数值的基本运算和C差不多,字符串的运算更方便,下面是常见的例子:

需要提一下的几点:1)字符串用双引号和单引号都可以,区别主要是单引号字符串中如果出现单引号字符则需要用转义符,双引号也是一样,所以在单引号字符串中使用双引号,或者双引号字符串中使用单引号就会比较方便。另外三个双引号或者三个单引号围起来的也是字符串,因为换行方便,更多用于文档。2)Python2中两个数值相除会根据数值类型判断是否整数除法,Python3中则都按照浮点数。想要在Python2种也执行Python3中的除法只要执行下面语句:

3)字符串前加r表示字符串内容严格按照输入的样子,好处是不用转义符了,非常方便。

Python中的布尔值和逻辑的运算非常直接,下面是例子:

基本上就是英语,操作符优先级之类的和其他语言类似。Python中也有位操作:


==, !=和is

判断是否相等或者不等的语法和C也一样,另外在Python中也常常见到is操作符,这两者的区别在于==和!=比较引用指向的内存中的内容,而is判断两个变量是否指向一个地址,看下面的代码例子:

所以一定要分清要比较的对象应该用那种方式,对于一些特殊的情况,比如None,本着Pythonic的原则,最好用is None。

注意关键字

Python中,万物皆对象。不过这并不是这里要探讨的话题,想说的是一定要注意关键字,因为所有东西都是对象,所以一个简简单单的赋值操作就可以把系统内置的函数给变成一个普通变量,来看下边例子:

注意print是个很特殊的存在,在Python3中是按照函数用,在Python2中却是个命令式的语句,最早print的用法其实是下边这样:

这么用主要是受到ABC语法的影响,但这个用法并不Pythonic,后来加入了print函数,为了兼容允许两种用法并存。所以单纯给print赋值是不灵的,在Python2中使用Python3中的一些特性都是用from __future__ import来实现。

模块导入

因为提到了对象名覆盖和import,所以简单讲一下。import是利用Python中各种强大库的基础,比如要计算cos(π)的值,可以有下面4种方式:

一般来说最后一种方式不是很推荐,因为不知道import导入的名字里是否和现有对象名已经有冲突,很可能会不知不觉覆盖了现有的对象。