很早就被安利过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 |
|