很早就被安利过Python这个优雅的语言,由于各种原因(并不是因为拖延症,坚定的眼神.jpg),都没有学习过,主要是基于Python3.6.4做了一下整理,记录一下学习心得。
第一章 简介
1.1 Python的定义
Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python的这个名字来自于 BBC 的 Monty Python’s Flying Cirecus 节目,和爬行类动物没有任何关系。
龟叔给Python的定位是优雅、明确、简单,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。
Python 允许你将程序分割为不同的模块,以便在其他的 Python 程序中重用。Python 内置提供了大量的标准模块,你可以将其用作程序的基础,或者作为学习 Python 编程的示例。这些模块提供了诸如文件 I/O、系统调用、Socket 支持,甚至类似 Tk 的用户图形界面(GUI)工具包接口。
| 特性 | 解释 | 
|---|---|
| 可读性强 | 相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。 | 
| 解释型语言 | 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言,因为无需编译和链接,你可以在程序开发中节省宝贵的时间。Python 解释器可以交互的使用,这使得试验语言的特性、编写临时程序或在自底向上的程序开发中测试方法非常容易。 | 
| 交互式语言 | 这意味着,你可以在一个Python提示符,直接互动执行写你的程序。 | 
| 面向对象语言 | 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。 | 
| 初学者的语言 | Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏。 | 
| 优雅的语言 | Python 让程序编写的紧凑和可读。用 Python 编写的程序通常比同样的 C、C++ 或 Java 程序更短小。 | 
内置电池和外置扩展
Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作内置电池(batteries included)。用Python开发,许多功能不必从零编写,直接使用现成的即可。
除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。
开发效率更高
当你用一种语言开始作真正的软件开发时,你除了编写代码外,还需要很多基本的已经写好的现成的东西,来帮助你加快开发进度。
比如说,要编写一个电子邮件客户端,如果先从最底层开始编写网络协议相关的代码,那估计一年半载也开发不出来。高级编程语言通常都会提供一个比较完善的基础代码库,让你能直接调用。
比如,针对电子邮件协议的SMTP库,针对桌面环境的GUI库,在这些已有的代码库的基础上开发,一个电子邮件客户端几天就能开发出来。
许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。
1.2 Python发展历史
Python是由Guido van Rossum(龟叔)在1989年圣诞节期间,为了打发无聊的圣诞节,在荷兰国家数学和计算机科学研究所设计出来的。
Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。
像Perl语言一样, Python源代码同样遵循 GPL(GNU General Public License)协议。
现在Python是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。
现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种。根据TIOBE排行榜,总的来说,其他编程语言各有千秋,但是Python的使用率一直在稳定上涨。
1.3 Python的优点
易于学习
Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
易于阅读
Python代码定义的更清晰。
易于维护
Python的成功在于它的源代码是相当容易维护的。
一个广泛的标准库
Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。
互动模式
互动模式的支持,您可以从终端输入并获得结果的语言,互动的测试和调试代码片断。
便携式
Python可以运行在多种硬件平台和所有平台上都具有相同的接口。
可扩展
可以添加低层次的模块到Python解释器。这些模块使程序员可以添加或定制自己的工具,更有效。
数据库
Python提供所有主要的商业数据库的接口。
GUI编程
Python支持GUI可以创建和移植到许多系统调用。
可扩展性
相比 shell 脚本,Python 提供了一个更好的结构,且支持大型程序。
1.4 Python的缺点
运行速度慢
和C相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C是运行前直接编译成CPU能执行的机器码,所以非常快。
但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍。
但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车的时速只有20公里,因此,作为乘客,你感觉的时速永远是20公里。
C是可以用来编写操作系统的贴近硬件的语言,所以,C适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。
代码不能加密。
如果要发布你的Python程序,实际上就是发布源代码,这一点跟C不同,C不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。
要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。
这个缺点仅限于你要编写的软件需要卖给别人挣钱的时候。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。
1.5 适合Python开发的应用
- 首选是网络应用,包括网站、后台服务等等 
- 其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等; 
- 另外就是把其他语言开发的程序再包装起来,方便使用。 
1.6 安装Python
Unix & Linux
- 打开WEB浏览器访问http://www.python.org/download/ 
- 选择适用于 - Unix/Linux的源码压缩包。
- 下载及解压压缩包。 
- 如果你需要自定义一些选项修改 - Modules/Setup
- 执行 - ./configure脚本
- make
- make install
执行以上操作后,Python会安装在 /usr/local/bin 目录中,Python库安装在/usr/local/lib/pythonXX,XX为你使用的Python的版本号。
Window
- 打开WEB浏览器访问http://www.python.org/download/ 
- 在下载列表中选择 - Window平台安装包,包格式为:- python-XYZ.msi文件 ,- XYZ为你要安装的版本号。
- 下载后,双击下载包,进入 - Python安装向导,安装非常简单,除了注意选择配置- Python到环境变量中,其他只需要使用默认的设置一直点击- 下一步直到安装完成即可。
MAC
最近的MAC系统都自带有Python环境,但是自带的Python版本为旧版本,你可以通过链接http://www.python.org/download/mac/ 查看MAC上Python的新版功能介绍。
MAC上完整的Python安装教程你可以查看:http://homepages.cwi.nl/~jack/macpython/http://www.shouce.ren/api/view/a/7505
环境变量概念
程序和可执行文件可以在许多目录,而这些路径很可能不在操作系统提供可执行文件的搜索路径中。
path(路径)存储在环境变量中,这是由操作系统维护的一个命名的字符串。这些变量包含可用的命令行解释器和其他程序的信息。
Unix或Windows中路径变量为PATH(UNIX区分大小写,Windows不区分大小写)。
在Mac OS中,安装程序过程中改变了python的安装路径。如果你需要在其他目录引用Python,你必须在path中添加Python目录。
下面几个重要的环境变量,它应用于Python情况。
| 变量名 | 描述 | 
|---|---|
| PYTHONPATH | PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找。 | 
| PYTHONSTARTUP | Python启动后,先寻找PYTHONSTARTUP环境变量,然后执行此文件中变量指定的执行代码。 | 
| PYTHONCASEOK | 加入PYTHONCASEOK的环境变量, 就会使python导入模块的时候不区分大小写. | 
| PYTHONHOME | 另一种模块搜索路径。它通常内嵌于的PYTHONSTARTUP或PYTHONPATH目录中,使得两个模块库更容易切换。 | 
手动设置环境变量
- 在 Unix/Linux 设置环境变量,注意: /usr/local/bin/python代指Python的实际安装目录。
| 1 | #在 csh shell: 输入 | 
- 在 Windows设置环境变量,在环境变量中添加Python目录
| 1 | #在命令提示框中(cmd) : 输入 | 
注意: C:\Python代指Python的实际安装目录。
1.7 Python解释器
当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。
由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。
IDLE
当我们从Python官方网站下载并安装好Python 3.6后,我们就直接获得了一个官方版本的解释器:IDLE。
IPython
IPython是基于IDLE之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和IDLE是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
IDLE用>>>作为提示符,而IPython用In [序号]:作为提示符。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和IDLE有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和IDLE的不同点。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
小结
Python的解释器很多,但使用最广泛的还是IDLE。如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。
1.8 编码规范建议
- 使用 - 4 空格缩进,而非- TAB,在小缩进(可以嵌套更深)和大缩进(更易读)之间,- 4空格是一个很好的折中。- TAB引发了一些混乱,最好弃用。
- 折行以确保其不会超过 79 个字符。这有助于小显示器用户阅读,也可以让大显示器能并排显示几个代码文件。 
- 使用空行分隔函数和类,以及函数中的大块代码。 
- 可能的话,注释独占一行。 
- 使用文档字符串。 
- 把空格放到操作符两边,以及逗号后面,但是括号里侧不加空格: - a = f(1, 2) + g(3, 4)。
- 统一函数和类命名。 
- 推荐类名用 驼峰命名, 函数和方法名用 小写 - _和- _下划线。总是用- self作为方法的第一个参数(关于类和方法的知识详见 初识类 )。
- 不要使用花哨的编码,如果你的代码的目的是要在国际化环境。 - Python的默认情况下,- UTF-8,甚至普通的- ASCII总是工作的最好。
- 同样,也不要使用非 - ASCII字符的标识符,除非是不同语种的会阅读或者维护代码。
第二章 基础
2.1 注释
2.1.1 单行注释
Python中的注释有单行注释和多行注释:
Python中单行注释以#开头,
| 1 | # 这是一个注释 | 
2.1.2 多行注释
单引号(’’’)
| 1 | # 三个单引号 | 
双引号(”””)
| 1 | # 三个双引号 | 
2.2 输出语句
2.2.1 基础
print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
| 参数名 | 原始定义 | 个人描述 | 是否有默认值 | 
|---|---|---|---|
| value, … | the values to a stream | 一组需要输出的内容序列,可以为空 | 无 | 
| sep | string inserted between values, default a space. | 每个value之间的默认间隔内容 | 有,默认是一个空格 | 
| end | string appended after the last value, default a newline. | 输出完成之后,以什么内容结尾 | 有,默认是一个换行符 | 
| file | a file-like object (stream); defaults to the current sys.stdout. | 定义流输出的文件,必须要是一个文件流对象 | 有,默认是标准的系统输出sys.stdout | 
| flush | whether to forcibly flush the stream. | 是否立即把内容输出到流文件,不作缓存。 | 有,默认是False | 
| 1 | # 一个参数都不传 | 
2.2.2 格式化输出
基本概念
操作符%也可以用于字符串格式化。它以类似sprintf()-style的方式解析左参数,将右参数应用于此,得到格式化操作生成的字符串。
| 类型简写 | 完整单词 | 中文含义 | 
|---|---|---|
| s | string | 字符串 | 
| x or X | hexadecimal | 十六进制 | 
| d | decimal | 十进制 | 
| o | octal | 八进制 | 
| f or F | float | 浮点型 | 
基础使用案例
基础使用就是在左参数传入一个%加一个数据类型,右参数通过一个%加一个空格加上一个参数值,或者右参数传入一个%加一个空格加上括号加上参数列表,参数列表中每个参数值以英文逗号做间隔。
| 1 | print ("%s" % "Hello Watermelon") # Hello Watermelon | 
使用小技巧
- 左参数的数据类型前面可以加上数字,限制打印的数字或者文本长度。
- 右参数加上括号,可以传入多个参数。
| 1 | print ("%.*s" % (4,"Hello Watermelon")) # Hell | 
请注意
- 请注意左参数和右参数之间不存在逗号,如果写了逗号,会报错。
- 八进制类型,- 十进制类型和- 字符串类型的缩写必须是- 小写字母,换成- 大写字母会报错。
- 做类型转换的时候,浮点类型和十进制类型需要传入的参数必要是数字类型的。
- 做类型转换的时候,十六进制类型和八进制类型需要传入的参数必要是整型。
- 左参数的- 个数和- 右参数的- 个数一定要相等。
- 虽然大量 Python代码还在使用%操作符,但是旧式的格式化方法最终将从语言中去掉,应该尽量使用str.format()。
| 1 | 
 |