在开始学习 Python 之前
Python语言简述
Python简史
Python 是由 Guido van Rossum (龟叔) 在1989年,为了打发圣诞节假期而创作的。Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言。1991年,第一个Python编译器诞生。它是用C语言实现的,并能够调用C语言的库文件。从一出生,Python已经具有了:类,函数,异常处理,包含表和词典在内的核心数据类型,以及模块为基础的拓展系统。
版本
Python 1.0 - January 1994 增加了 lambda, map, filter and reduce.
Python 2.0 - October 16, 2000,加入了内存回收机制,构成了现在Python语言框架的基础
Python 2.4 - November 30, 2004, 同年目前最流行的WEB框架Django 诞生
Python 2.5 - September 19, 2006
Python 2.6 - October 1, 2008
Python 2.7 - July 3, 2010
Python 3.0 - December 3, 2008
Python 3.1 - June 27, 2009
Python 3.2 - February 20, 2011
Python 3.3 - September 29, 2012
Python 3.4 - March 16, 2014
Python 3.5 - September 13, 2015
Python 3.6 - june 13, 2016
Python 3.7 - Sept. 19, 2017
Python 3.8 - Feb. 3, 2019
Python语言类型
Python是动态语言,是强类型定义语言(是类型安全的语言) 是一门脚本语言
- 编译型
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
- 解释型
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
- 强类型定义语言
在声明或定义变量时为变量指定某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型。
- 弱类型定义语言
数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。例如js
- 动态类型
动态类型语言类型的检查是在运行时做的,类型对于变量,属性,方法以及方法的返回类型都做不要求,只有当变量被赋值时由值来确定它的类型, 之后,还可以赋值不同类型的值。例如Python、Ruby、JavaScript等。
- 静态类型
静态类型语言的类型检查是在运行前的编译阶段做的,例如C/C++、java、C#都是静态类型的语言。静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要,也就是动态类型语言天生就具有多态的特性。
Python语言特点
- 高级语言————无需考虑寄存器和内存等一类的底层细节。
- 可移植性————Python已经被移植到大多数平台上。这意味着代码可以轻易的移植到其他平台上。
- 可扩展性————可以用C/C++编写时间复杂度大的模块进行性能和功能上的优化和拓展,然后用Python来调用。
- 可嵌入性————你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
- 开发效率非常高,拥有丰富的第三方库,大大降低开发周期,避免重复造轮子。
- Python代码“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,不但对初学者非常友入门门容易,而且支持复杂的项目开发。
- 速度慢,Python 的运行速度比java慢,比C/C++更慢,但是很多时候,Python 的效率完完全全可以满足用户的性能需求。
- Python由于GIL即全局解释器锁(Global Interpreter Lock)的存在,使得任意时刻仅能有一个线程在执行,极大限制了Python的性能。
Python的版本问题
python2.x 和 Python3.x
Python2.x版本中源码不标准,混乱,重复代码太多,语言的特性体现的并不是很强,并且字符编码采用ASCII码,局限性大,但是相对于早期的Python版本,Python3.0版本是一个较大的升级。为了不带入过多的累赘,Python 3.0在设计的时候向下兼容并没有作为很重要的标准,力求让Python代码更为标准、简洁、严谨、优雅,充分体现Python 的语言特性。所以早期Python版本设计的程式大多无法在Python 3.0上正常执行。由于Python早期就已经积累了大量的外部模块、一些大的项目基于Python2.x版本,版本的迁移是一个大的问题,外部模块经常无法很短时间内跟进Python的版本,为了照顾现有程式,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。因此从2.x向3.x迁移是一个痛苦的过程。
Python安装
Windows环境安装:
安装时 勾选Add Python3.6 to PATH选项(就自动讲Python添加到环境变量)
Linux / OS X 环境安装:
Python2.x版本 系统原生自带
Python3.x 如果原生不带Python3.X版本 前往官网下载 地址同上
download Python
每个语言的第一个程序,都像一个仪式~ 我们致敬一下Python~!
在终端创建hello.py文件 并写入以下代码:
print(“hello world!\n”)
在终端执行: python3 hello.py 命令 会出现 hello world! 结果
JIAdeMacBook-Air:~ monkey$ vim hello.py
JIAdeMacBook-Air:~ monkey$ python3 hello.py
hello world!
命令中“python3” 告诉系统用python3解释器 来执行这个文件
如果想直接运行这个文件 要在文件的第一行 加上解释器的位置告诉系统由谁来执行这个文件。
#!/usr/bin/env python3
添加之后 给文件执行权限chmod 755 hello.py
这样就可以通过./hello.py的方式执行脚本了
完整代码为:
#!/usr/bin/env python3
#_*_ coding: utf-8 _*_
print('hello world!\n')
其中#_*_ coding: utf-8 _*_
告诉解释器 编码方式为 utf-8。
因为 在Python2.x版本中默认的是ASCII编码,是不支持中文的,即使是在注释中也不行,所以要在开头指明这个python文件的编码方式以支持中文。
字符编码问题
详细解释一下上面提到编码的问题,我们知道所有的文件在计算机上存储都是以01二进制存储的, n位二进制数可以组合成2的n次方个不同的信息,给每个信息规定一个具体码组,这种过程也叫编码。
ASCII码
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。
标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 。在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添0;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1 。
最后128个字符称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。
GBK编码
《汉字内码扩展规范》(GBK) 于1995年制定,兼容GB2312、GB13000-1、BIG5 编码中的所有汉字,使用双字节编码,编码空间为 0x8140~0xFEFE,共有 23940 个码位,其中 GBK1 区和 GBK2 区也是 GB2312 的编码范围。收录了 21003 个汉字。GBK向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物。ISO 10646 是国际标准化组织ISO 公布的一个编码标准,即 Universal Multilpe-Octet Coded Character Set(简称UCS),大陆译为《通用多八位编码字符集》,台湾译为《广用多八位元编码字元集》,它与 Unicode 组织的Unicode编码完全兼容。ISO 10646.1 是该标准的第一部分《体系结构与基本多文种平面》。我国 1993 年以 GB 13000.1 国家标准的形式予以认可(即 GB 13000.1 等同于 ISO 10646.1)
Unicode编码
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
Unicode能够使计算机实现跨语言、跨平台的文本转换及处理。
UTF-8
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
Python代码的执行过程
Python解释器分类
CPython解释器
当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python
就是启动CPython解释器。
CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。
IPython解释器
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。
CPython用>>>
作为提示符,而IPython用In [序号]:
作为提示符。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
Python解释器的工作原理
解释器由一个编译器和一个虚拟机构成,编译器负责将源代码转换成字节码文件,而虚拟机负责执行字节码。所以,解释型语言其实也有编译过程,只不过这个编译过程并不是直接生成目标代码,而是中间代码(字节码),然后再通过虚拟机来逐行解释执行字节码
Python源程序的执行过程
执行 python XX.py (python3 xx.py),python解释器的编译器会将.py源文件编译(解释)成字节码生成PyCo3deObject字节码对象存放在内存中。
python解释器的虚拟机将执行内存中的字节码对象转化为机器语言,虚拟机与操作系统交互,使机器语言在机器硬件上运行。
运行结束后python解释器则将PyCodeObject写回到.pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
这样一来可以省去每次都将Python脚本文件转成字节码的过程,所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。