一.python简介
1.1 python的诞生
python的创始人吉多.范罗苏姆(Guido van Rossum),他在开发python语言之前曾使用过几年的ABC语言,ABC是一门主要用于教学的语言(教计算机系的学生如何设计一门开发语言),Guido在开发python时借鉴了很多ABC语言的特性,所以后来人们包括Guido自己也认为,python语言的前生就是ABC语言,关于创作python语言的初衷,Guido在1996年写的到:
在六年前的1989.12月份,我为了在圣诞假期打发无聊时间找点事干(估计是写代码找不到对象,哈哈),决定为我最近一直在构思的一门新语言写个解释器,这门语言的前生ABC(就Guido本人看来,ABC这种语言非常优美和强大,是专门为专业的程序设计师使用的,但是ABC语言没有成功,究其原因,吉多认为是非开放造成的,吉多决心在python中避免这一错误,并取得非常好的效果,完美结合了C和其他一些语言)语言更多是被UNIX/C黑客使用,我选择python这个名字做为这个开发项目的名字,起这个名字的一个原因是因为我是Month Python's Flying Circus(英国的一个电视喜剧)的超级粉丝。就这样,python在Guido手中诞生了。
1.2 常见编程语言的分类
编译型和解释型,静态语言和动态语言,强类型定义语言和弱类型定义语言,那么每个语言代表什么意思呢,我们一起来看看吧!
编译型和解释型:
(1)我们先看看编译型,其实它和其他汇编语言是一样的,也是有一个负责翻译的程序来对我们的源代码进行转换,生产相对应的可执行代码,这个过程说得专业一点,就称为编译(Compile),而负责编译的程序就称为编译器(Compiler),编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候就不用在进行翻译了。
(2)解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对应编译型语言要慢。
两者的区别:编译型语言就是一次把所有的代码转换成机器语言,然后写成可执行文件,而解释型语言在运行程序的前一刻,还只有程序源而没有可执行文件,而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总而言之,就是不断地解释,执行,解释,执行......所以解释型程序离不开解释程序的。编译型和解释型两者各有利有弊,前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统,大型应用程序,数据库系统等时都采用它,像c/c++,Pascal/Object Pascal(Delphi),VB等基本都可以视为编译语言,而一些网页脚本,服务器脚本挤辅助开发借口这样的对速度要求不高,对不同系统平台间的兼容性有一定要求的程序则通常使用解释型语言,如java,javaScript,VBScript,Perl,Python等。随着设计技术与硬件的不断发展,编译型与解释型两种方式界限正在不断变的模糊。
动态语言和静态语言:
(1)动态语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来,python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
(2)静态类型语言:静态类型语言和动态类型语言刚好相反,它的数据类型是在编译期间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++就是静态语言的典型代表,其他静态类型语言还有C#,JAVA等。
强类型定义语言和弱类型定义语言:
(1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就用于是这个数据类型了,举个例子:如果你定义了一个整型变量a,那么程序不可能将a当作字符串类型处理,强类型定义语言是类型安全的语言。
(2)弱类型定义语言:数据类型可以被忽略的语言,它与强类型定义语言相反,一个变量可以赋不同数据 类型的值。
强类型定义语言在速度上略逊色与弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误,另外“这门语言是不是动态语言”和“这么语言是否类型安全”之间是完全没有联系的!
例如:python是动态语言,是强类型定义语言,VBScript是动态语言,是弱类型定义语言,JAVA是静态语言,是强类型定义语言,
通过上面这些介绍,我们可以看出,python是一门动态解释型的强类型定义语言。
1.3 python的优缺点
python的优点:
(1)python入门简单:python的定位是"优雅,明确,简单”,所有python程序看上去总是简单易懂,初学者学习python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
(2)开发效率高:python有非常强大的第三方库,基本上你想通过计算机实现任何功能,python官方库里都有相应的模块进行支持,直接下载调用后,在基础库的基础上在进行开发,大大降低了开发周期,避免重复造轮子 。
(3)高级语言:当你用python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
(4)可移植性:由于它的开源本质,python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。
(5)可扩展性:如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分用C或C++编写,然后在你的python程序中使用它们。
(6)可嵌入性:你可以把python嵌入到你的C/C++程序,从而像你的程序用户提供脚本功能。
python的缺点:
(1)速度慢:python的运行速度先比C,JAVA语言确实要慢很多,其实这里所指的运行速度慢在大多数情况下用户是无法直接感知的,必须借助测试工具才能体现出来,其实在大多数情况下python已经完全可以满足你多程序速度的要求,除非你要写对速度要求极高的搜索引擎等,这种情况下,当然还是建议你用C去实现。
(2)代码不能加密:因为python是解释型语言,它的源码都是以明文形式存放的。
(3)线程不能利用多CUP问题:这是python被人诟病最多的一个缺点,GIL即全局解释器锁,是计算机程序设计语言解释器用于同步线程的工具,使得如何时刻仅有一个线程在执行,python的线程操作系统是原生线程,在Linux上为pthread,在Windows上为win thread,完全有操作系统调度线程执行,一个python解释器进程内有一条主线程,以及多条用户程序的执行线程,即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行。
二:常见的python解释器
当我们编写python代码时,我们得到的是一个包含python代码的以.py为扩展名的文本文件,要运行代码,就需要python解释器去执行.py文件。
CPython--这个解释器是用C语言开发的,在命令行下运行python就可启动CPython解释器。CPython是使用最广泛的python解释器。
IPython--IPython是基于CPython之上的一个交互解释器,IPython只是在交互方式上有所增强,但是执行python代码的功能和CPython是完全一样的。
PYPY--PYPY是另一个python解释器,它的目标是执行速度,PYPY采用JIT技术,对python代码进行动态翻译(注意不是解释),所以可以显著提高python代码的执行速度。
Jython--Jython是运行在JAVA平台上的python解释器,可以直接把python代码编译成JAVA字节码执行。
IronPython--IronPython和Jython类型,只不过IronPython是运行在微软.net平台上的Python解释器,可以直接把Python代码编译成.net的字节码。
三:python版本间 的差异
3.1:2.x和3.x版本对比
| version | 2.x | 3.x |
| print""或者print()打印都可以正常输出 |
只能print()这种形式打印,否则会出现 SyntaxError类型错误 |
|
|
input raw_input |
input:输出原生的数据类型,输出什么类型的值,就输出什么类型 raw_input:全部以字符串形式输出 |
3.x版本取消了raw_input方法,只能使用input方式提示输入字符串,该方法和2.x版本的raw_input()相同 如果想要实现与2.x input()输出原生数据类型值,可以使用eval(input()) |
| class | 2.x支持新式类和经典类,使用新式类时,类继承顺序会影响最终继承的结果 | 必须使用新式类,解决了类之间继承顺序的问题 |
| / | 例如:1/2 2.x输出的值为0 | 例如:1/2 3.x输入的值为0.5 |
3.2 python的数据类型
| int 符号整型 |
如:1,12,13,-1...... , 在2.x版本中范围在-2**31~2**31-1之间, 取值决定于操作系统,不会下于这个范围 |
| float浮点型 | 有小数点的,如;1.1 1.2 -1.2...... |
| str字符串 |
如:“hello world”,"python","1".....,注意,字符串需要用引号,单双引号都可以(“hello world”) 如果不用引号引起来,python就不能把这个值识别为字符串而是识别为一个变量值 |
| bool布尔类型 | 只有两个值,真:True 假:False ,任何非零的数据类型,结果都为真,当结果为int 0时,则为假 |
| long | 这个类型只存在2.x版本中,取值范围无限大,取决于可用的虚拟内存 |
| complex 复数 | 如:3.34j, 3.453e-7j...... |
| 元组tuple | 如: (“a”,"hell", "python", "2")元组中值是不可以改变的 |
| 列表list | 如:["a","hello", "python", "2"]列表中的值是可以改变的 |
| 字典dict | 如:{“name”:"LaiYing","age":25,"job“:”IT"}字典中的值也是可以改变的 |
3.3 python编码
| python2.x | 默认使用string字符编码,1个字符只能存8bit,可以使用内置函数,chr()和ord()进行字符转换 |
| Python3.x | 默认使用unicode编码格式,可以使用内置函数unichr()和ord()进行字符转换 |
3.4 Python的命名规范
(1)所有的Python程序命名规范都应该以.py结尾。这样别人才能一看你的文件后缀名就知道这个是Python程序
(2)在程序的第一行声明要使用的解释器类型
#!/usr/bin/env python #声明使用python的解释器
(3)Python变量名(标识符)只能以字母,下划线开头,且不能包含特殊字符,注意Python保留关键字不能当作变量名,这样等于重写Python的内置方法,可能会影响其他方法的调用,具体Python关键字如下
#通过导入keyword模块,我们可以查看当前Python保留了哪些关键字 import keyword #查看Python保留的关键字 print(keyword.kwlist) #在3.x版本中需要print打印出结果 #3.x输出以下关键字 ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] #2.x输出以下关键字 ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] #注意,3.x新增了['False','None','True','nonlocal']同时去除了2.x ['exec']的关键字,大家在命名规范时,应该遵循3.x的关键字,便于向后兼容 #如果不确定变量名是否为关键字,也可以通过下面这种方法,检查是否为关键字 print(keyword.iskeyword("name")) #检查name是否为关键字,如果返回值为False就说明该变量名不是系统保留的关键字,即可用
3.5 Python的注释
Python有两种方式注释,一种是当行注释,在语句前加#,也可以多行注释,在你需要注释代码的一行开头和最后一行结尾加上三个 单引号,,也可以使用三个连续的双引号,或者选中需要注释的行然后ctrl+c就即可,例如:
'''import keyword print(keyword.kwlist) print(keyword.iskeyword("name"))''' """f = open("test.log","w") f.write("This is the first line\n") f.write("This is the second line\n") f.write("This is the 3 line\n") f.write("This is the 4 line\n") f.write("This is the 5 line\n")"""