Python_2_高级知识

  • 格式:docx
  • 大小:486.86 KB
  • 文档页数:36

Python语言的执行过程

1. 解释型语言和编译型语言的区别

计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。

编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。

解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby和Python。

因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以效率比较高。随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

2.Python的运行过程

其实Python和Java/C#一样,也是一门基于虚拟机的语言。先来从表面上简单地了解一下Python程序的运行过程。当在命令行中输入python hello.py时,其实是激活了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。Python也是一门先编译后解释的语言。

PyCodeObject和pyc文件

我们在硬盘上可以看到pyc文件,但其实PyCodeObject才是Python编译器真正编译成的结果。当程序运行时,编译的结果保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到则直接载入,否则就重复上面的过程。所以说pyc文件其实是PyCodeObject的一种持久化保存方式。pyc的目的是重用。

注:Python的解释器认为:只有import进来的模块,才是需要被重用的模块。

Python代码规范

编码排版:Code Lay-out

(1)缩进:缩进一般使用4个空格。

(2)Tabs or Spaces:空格是缩进的首选,而不是Tab键。

(3)一行的最大长度:72个字符。

(4)空白行:

顶层函数或类的定义,用2行空白行分隔;

类中的函数定义,用1行空白行分隔,相关函数组之间,也可以多加1行额外的空白行;

函数内部可用1行空白行分割不同的logical section;

(5)源文件的编码:Python3中一般使用UTF-8,Python2中一般使用ASCII码

(6)导入Import:

一般分开导入:import os import sys,而不是import os, sys;

导入顺序:standard libraryrelated third partylocal application/library;

每一组导入之间,可以用空白行隔开;

表达式和语句中的空格

有些情况下,应该避免不必要的空格。举几个典型的例子:

注释:comment和文档字符串

注释一般建议另起一行,而不是在本行的末尾进行注释;

命名规范:Naming Convention

避免使用:应该避免使用’l’, ‘O’等难辨别字符单个作为变量名; 包和模块命名:应该都是简短的、小写的名字;

类命名:一般使用大写开头的单词命名,一般采用驼峰法命名,例如FeatureSelect;

异常命名:因为exception为类的一种,所以也是使用大写开头的单词命名;

全局变量命名:如果只是在本Module中使用,应该使用__all__进行保护;

函数命名:应该使用小写单词,单词与单词之间用下划线分割;

参数命名:一般用self为instance method的第一个参数,用cls为class method的第一个参数;

常数命名:一般使用大写字符,并且单词之间用下划线分割,例如MAX_COUNT;

其他建议

(1)尽量使用if a is not b:„.而不是if not a is b:„.

(2)尽量使用def定义函数,而不是lambda定义lambda表达式。

Yes: def f(x): return 2*x No: f = lambda x: 2*x

(3)尽量使用.startswith或.endswith来检验字符串,而不是字符串slice。

Yes: if foo.startswith('bar'): No: if foo[:3] == 'bar':

(4)尽量使用isinstance函数来检验数据类型,而不是用type比较:

Yes: if isinstance(obj, int): No: if type(obj) is type(1):

(5)对于序列(string、list、tuple)、Boolean变量的判断:

Yes: if not seq: if seq: No: if len(seq): if not len(seq):

Yes: if greeting: No: if greeting == True:

Python中的编码问题

1.unicode、gbk、gb2312、utf-8的关系

UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用于解决国际字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8是unicode的一种实现方式。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:

》GBK、GB2312UnicodeUTF8

》UTF8UnicodeGBK、GB2312

2.中文编码问题

(1)py文件中的编码

Python默认脚本文件都是ANSCII编码的,当文件中有非ANSCII编码范围内的字符的时候就要使用"编码指示"来修正:# -*- coding=utf-8 -*-或#coding=utf-8。其他的编码如:gbk、gb2312也可以;否则会出现类似:SyntaxError: Non-ASCII

character '\xe4' in file xxx.py on line 1, but no encoding declared; 这样的异常信息。

(2)python中的编码与解码

Python2.x中有两种字符串类型:str和unicode。

类型str是8bit bytes序列;类型unicode的每个unit是1个unicode对象。

所以:len(u'中国')的值是2;len('ab')的值也是2。但len('中文ab')的值为8,即只有将中文的str类型的字符串转化为Unicode字符串,计算其长度,才为实际长度。

a = '中文ab' #a为str类型的字符串

print repr(a), repr(a[0]) #输出:'\xe4\xb8\xad\xe6\x96\x87ab' '\xe4'

b = a.decode('utf-8') #b为Unicode类型的字符串

print repr(b), repr(b[0]) #输出:u'\u4e2d\u6587ab' u'\u4e2d'

在读取文件,或从网络上读取内容时,保持的对象一般为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从Unicode转为特定的编码类型如:utf-8、gb2312等;

unicode字符串,编码为gb2312,utf-8等编码类型的字符串,使用s.encode(encoding)函数

# -*- coding=UTF-8 -*-

s = u'中国' #此时s为Unicode类型

s_gb = s.encode('gb2312') #此时s_gb为str类型,’gb2312’编码

utf-8,gbk编码类型的str字符串,解码为unicode字符串,使用s.decode(encoding)函数或unicode(s,encoding)函数

# -*- coding=UTF-8 -*-

s = u'中国' #s为unicode类型的字符串。type(s)为type类型 s_utf8 = s.encode('utf-8') #s_utf8为str类型,UTF-8编码。type(s_utf8)为type类型

s_unicode = s_utf8.decode('utf-8') #s_unicode为unicode类型,即再次转为Unicode类型

同理,一般的str都转为unicode字符串,使用s.decode(encoding)函数

# -*- coding=UTF-8 -*-

s = '中国' #s为str类型,即普通的str类型

s_unicode = s.decode('UTF-8') #s_unicode为unicode类型

s_str = s_unicode.encode('gb2312') #s_str为str类型,gb2312编码

#如果s为utf-8编码的字符串,如何转化为gb2312编码的字符串?

s.decode('utf-8').encode('gb2312') #先转化为Unicode字符串,在进行编码操作

在3.x版本中,字符串str是Unicode类型,等价于2.x中的Unicode,对其进行编码后,变为bytes类型。

a = ‘str’ #type(a)为,Unicode字符串

a = ‘中国’ #type(a)为,Unicode字符串

b = a.encode(‘utf-8’) #b = b'\xe4\xb8\xad\xe5\x9b\xbd' type(b)为,utf-8编码的字符串

b = a.decode(‘utf-8’) #Unicode字符串没有decode操作,报错:AttributeError: 'str' object has no attribute 'decode'

b = b’中国’ #bytes类型只能包含ASCII码字符,报错:SyntaxError: bytes can only contain ASCII literal characters.

b = b’string’ #type(b)为

a = b.decode(‘utf-8’) #a = ‘string’,type(a)为,a为Unicode字符串。