Python笔记.doc_第1页
Python笔记.doc_第2页
Python笔记.doc_第3页
Python笔记.doc_第4页
Python笔记.doc_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

foo = abc for i in range (len(foo):print (fooi,(%d) % i)a (0)b (1)c (2) for i, ch in enumerate(foo):print (ch, (%d) %i)a (0)b (1)c (2)列表解析 squared = x * 2 for x in range(4) for i in squared:print(i)0149 sqdEvens = x * 2 for x in range(8) if not x % 2 for i in sqdEvens:print(i)041636文件读取filename = input(Enter file name:)fobj = open(filename, r)for eachLine in fobj: print(eachLine)fobj.close()这段代码一次读入文件的所有行,然后关闭文件,再迭代每一行输出,不过这段代码适合文件大小适中的文件,因为对于很大的文件,上面的代码会占用太多的内存,这时你最好一次读一行。定义函数def addMe2Me(x): apply + operation to argumentreturn (x + x)默认参数:函数的参数可以有一个默认值def foo(debug = True): determine if in debug mode with default argument if debug: print(in debug mode)print(done)如何定义类class FooClass(object): version = 0.1 def _init_(self, nm = John Doe): = nm print (Created a class instance for,nm) def showname(self): print(Your name is, ) print(My name is,self._class_._name_) def showver(self): print (self.version) def addMe2Me(self, x): return x + x使用class关键字定义类。可以提供一个可选的父类或者说基类,如果没有合适的基类,那就可以使用object作为基类。Class行之后是可选的文档字符串,静态 成员定义,及方法定义。在上面的类中,我们定义了一个静态变量version,它将被所有势力及四个方法共享,_init_(), showname(),. showver(), addMe2Me().这些show*()方法并没有做什么有用的事情,仅仅输出对应的信息。_init_()方法有一个特殊名字,所有名字开始和结束都有两个下划线的方法都是特殊方法。当一个类实例被创建时,_init_()方法会自动执行,在类实例创建完毕后执行,类似构建函数。_init_() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不创建例-它仅仅是你的对象创建后执行的第一个方法。它的目的是执行一些该对象的必要的初始化工作。通过创建自己的_init_()方法,你可以覆盖默认的 _init_()方法(默认的方法什么也不做),从而能够修饰刚刚创建的对象。在这个例子里,我们初始化了一个名为name的类实例属性(或者说成员)。这个变量仅在类实例中存在,它并不是实际类本身的一部分。_init_()需要一个默认的参数,前一节中曾经介绍过。毫无疑问,你也注意到每个方法都有的一个参数,self.什么是 self ? 它是类实例自身的引用。其他语言通常使用一个名为 this 的标识符。当一个实例被创建,_init_()就会被自动调用。不管这个_init_()是自定义的还是默认的。 foo1 = FooClass()Created a class instance for John Doe foo1.showname()Your name is John DoeMy name is FooClass foo1.showver()0.1 print(foo1.addMe2Me(5)10 import sys sys.stdout.write(Hello World!n)Hello World!13 sys.platformwin32变量赋值:变量赋值并不是直接将一个值赋给一个变量。对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。_xxx 不用from module import *导入_xxx_系统定义名字_xxx 类中的私有变量名模块结构和布局:# (1) 起始行(Unix)# (2) 模块文档 # (3) 模块导入# (4) 变量定义# (5) 类定义# (6) 函数定义# (7) 主程序模块文档:简要介绍模块的功能及重要全局变量的含义,模块外可通过 module._doc_ 访问这些内容。(3)模块导入导入当前模块的代码需要的所有模块;每个模块仅导入一次(当前模块被加载时);函数内部的模块导入代码不会被执行, 除非该函数正在执行。(4)变量定义这里定义的变量为全局变量,本模块中的所有函数都可直接使用。从好的编程风格角度说,除非必须,否则就要尽量使用局部变量代替全局变量,如果坚持这样做,你的代码就不但容易维护,而且还可以提高性能并节省内存。(5)类定义语句所有的类都需要在这里定义。当模块被导入时class 语句会被执行, 类也就会被定义。类的文档变量是class._doc_。(6)函数定义语句此处定义的函数可以通过module.function()在外部被访问到,当模块被导入时 def 语句会被执行, 函数也就都会定义好,函数的文档变量是function._doc_。(7) 主程序无论这个模块是被别的模块导入还是作为脚本直接执行,都会执行这部分代码。通常这里不会有太多功能性代码,而是根据执行的模式调用不同的函数。_name_ 指示模块应如何被加载如果模块是被导入,_name_ 的值为模块名字如果模块是被直接执行,_name_ 的值为 _main_Python 标准库中还提供了unittest 模块,有时候它被称为 PyUnit, 是一个测试框架要保持追踪内存中的对象,Python 使用了引用计数这一简单技术。也就是说Python 内部记录着所有使用中的对象各有多少引用。你可以将它想像成扑克牌游戏“黑杰克”或“21 点”。一个内部跟踪变量,称为一个引用计数器。至于每个对象各有多少个引用,简称引用计数。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0 时,它被垃圾回收。一个对象的引用计数在以下情况会减少: 一个本地引用离开了其作用范围。比如 foobar()(参见上一下例子)函数结束时。 对象的别名被显式的销毁。del y # or del x 对象的一个别名被赋值给其它的对象x = 123 对象被从一个窗口对象中移除myList.remove(x) 窗口对象本身被销毁del myList # or goes out-of-scope将经常用到的模块属性替换为一个本地引用创建文件(makeTextFile.py)#!/usr/bin/env/ pythonmakeTextFile.py- create text fileimport osls = os.linesep #get filenamewhile True: if os.path.exists(fname): print(ERROR:%salready exists % fname) else: break# get file content linesall = print(nEnter lines(. by itself to quit).n)while True: entry = input() if entry = .: break else: all.append(entry)fobj = open(fname,w)fobj.writelines(%s%s%(x, ls) for x in all)fobj.close()print(DONE)所有的Python 对像都拥有三个特性:身份,类型和值。身份:每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到。这个值可以被认为是该对象的内存地址。您极少会用到这个值,也不用太关心它究竟是什么。类型对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。您可以用内建函数type()查看Python 对象的类型。因为在Python 中类型也是对象(还记得我们提到Python 是面向对象的这句话吗?),所以type()返回的是对象而不是简单的字符串。值对象表示的数据项所有类型对象的类型都是typePython 有一个特殊的类型,被称作 Null 对象或者 NoneType,它只有一个值,那就是 None。None 没有什么有用的属性,它的布尔值总是False。代码对象是编译过的Python 源代码片段,它是可执行对象。通过调用内建函数compile()可以得到代码对象。代码对象可以被 exec 命令或 eval()内建函数来执行。帧对象表示 Python 的执行栈帧。帧对象包含Python 解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名字空间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个C 栈帧。用到帧对象的一个地方是跟踪记录对象当你的代码出错时, Python 就会引发一个异常。当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。如果一个异常有自己的处理程序,处理程序就可以访问这个跟踪记录对象。括步进切片, 多维切片,及省略切片。多维切片语法是sequencestart1 : end1,start2 : end2, 或使用省略号, sequence.,start1 : end1 . 切片对象也可以由内建函数 slice()来生成。步进切片允许利用第三个切片元素进行步进切片,它的语法为sequence起始索引 : 结束索引 : 步进值 foostr = abcde foostr:-1edcba foostr:-2eca foolist = 123, xba, 342.23, abc foolist:-1abc, 342.23, xba, 123省略对象用于扩展切片语法中,起记号作用。 这个对象在切片语法中表示省略号。类似Null 对象 None, 省略对象有一个唯一的名字 Ellipsis, 它的布尔值始终为 True.调用内建函数 xrange() 会生成一个Xrange 对象,xrange()是内建函数 range()的兄弟版本, 用于需要节省内存使用或 range()无法完成的超大数据集场合。3 4 7 # same as ( 3 4 ) and ( 4 a = 5, hat, -9.3 b = a a is bTrue a is not bFalse整数对象和字符串对象是不可变对象,所以Python 会很高效的缓存它们。这会造成我们认为Python 应该创建新对象时,它却没有创建新对象的假象。 a = 1 b = 1 a is bTrue id(a)507081216 id(b)507081216 c = 1.0 id(c)32898168 d = 1.0 id(d)32898192Python 仅缓存简单整数,因为它认为在Python 应用程序中这些小整数会经常被用到标准类型内建函数Python 提供了一些内建函数用于这些基本对象类型:cmp(), repr(), str(), type(), 和等同于repr()函数的单反引号() 运算符。函数 功能repr(obj) 或 obj 返回一个对象的字符串表示str(obj) 返回对象适合可读性好的字符串表示type(obj) 得到一个对象的类型,并返回相应的type 对象 str(1)1 str(2e10)20000000000.0 str(0, 5, 9, 9)0, 5, 9, 9 repr(0, 5, 9, 9)0, 5, 9, 9 0, 5, 9, 90, 5, 9, 9事实上 repr() 和 做的是完全一样的事情,它们返回的是一个对象的“官方”字符串表示, 也就是说绝大多数情况下可以通过求值运算(使用eval()内建函数)重新得到该对象,但str()则有所不同。str() 致力于生成一个对象的可读性好的字符串表示,它的返回结果通常无法用于eval()求值, 但很适合用于 print 语句输出。需要再次提醒一下的是, 并不是所有repr()返回的字符串都能够用eval()内建函数得到原来的对象:#!/usr/bin/env pythondef displayNumType(num): print (num, is) if isinstance(num, (int, float, complex): print (a number of type:,type(num)._name_) else: print (not a number at all!)displayNumType(-69)displayNumType(98.6)displayNumType(-5.2+1.9j)displayNumType(xxx)def displayNumType(num): print (num, is,) if type(num) = type(0): print (an integer) elif type(num) = type(0.0): print (a float) elif type(num) = type(0+0j): print (a complex number) else: print (not a number at all!)displayNumType(-69)displayNumType(98.6)displayNumType(-5.2+1.9j)displayNumType(xxx)如果让我们最啰嗦的描述标准类型,我们也许会称它们是Python 的“基本内建数据对象原始类型”。 “基本”,是指这些类型都是Python 提供的标准或核心类型。 “内建”,是由于这些类型是Python 默认就提供的 “数据”,因为他们用于一般数据存储 “对象”,因为对象是数据和功能的默认抽象 “原始”,因为这些类型提供的是最底层的粒度数据存储 “类型”,因为他们就是数据类型我们对类型进行分类的第一种方式, 就是看看这种类型的对象能保存多少个对象。Python的类型, 就象绝大多数其它语言一样,能容纳一个或多个值。一个能保存单个字面对象的类型我们称它为原子或标量存储,那些可容纳多个对象的类型,我们称之为容器存储。(容器对象有时会在文档中被称为复合对象,不过这些对象并不仅仅指类型,还包括类似类实例这样的对象)容器类型又带来一个新问题,那就是它是否可以容纳不同类型的对象。所有的Python 容器对象都能够容纳不同类型的对象.存储模型分类 Python 类型标量/原子类型 数值(所有的数值类型),字符串(全部是文字)容器类型 列表、元组、字典另一种对标准类型进行分类的方式就是, 针对每一个类型问一个问题:“对象创建成功之后,它的值可以进行更新吗?”新创建的对象被关联到原来的变量名,旧对象被丢弃,垃圾回收器会在适当的时机回收这些对象.更新模型分类 Python 类型可变类型 列表, 字典不可变类型 数字、字符串、元组 x = Python numbers and strings print(id(x)50252176 x = are immutable?!? What gives? print(id(x)50252016 i = 0 print(id(i)507081184 i = i + 1 print(id(i)507081216 aList = ammonia, 83, 85, lady aListammonia, 83, 85, lady aList285 id(aList)50034696 aList2 = aList2 + 1 aList3 = stereo aListammonia, 83, 86, stereo id(aList)50034696 aList.append(gaudy) aList.append(aList2 + 1) aListammonia, 83, 86, stereo, gaudy, 87 id(aList)50034696也就是说根据访问我们存储的数据的方式对数据类型进行分类。在访问模型中共有三种访问方式:直接存取,顺序,和映射。对非容器类型可以直接访问。所有的数值类型都归到这一类。序列类型是指容器内的元素按从0 开始的索引顺序访问。一次可以访问一个元素或多个元素,也就是大家所了解的切片(slice)。字符串,列表和元组都归到这一类。映射类型类似序列的索引属性,不过它的索引并不使用顺序的数字偏移量取值, 它的元素无序存放,通过一个唯一的key 来访问,这就是映射类型, 它容纳的是哈希键-值对的集合。访问模型分类 Python 类型直接访问 数字顺序访问 字符串、列表、元组映射访问 字典数字提供了标量贮存和直接访问。它是不可更改类型,也就是说变更数字的值会生成新的对象. aComplex = 1.23+4.56J aComplex(1.23+4.56j)通过给数字对象(重新)赋值,您可以“更新”一个数值对象。我们之所以给更新这两个字加上引号,是因为实际上你并没有更新该对象的原始数值。这是因为数值对象是不可改变对象。Python 的对象模型与常规对象模型有些不同。你所认为的更新实际上是生成了一个新的数值对象,并得到它的引用。 虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起来构成一个复数。 复数由实数部分和虚数部分构成 表示虚数的语法: real+imagj 实数部分和虚数部分都是浮点数 虚数部分必须有后缀j 或J。属性 描述num.real 该复数的实部num num.imag 该复数的虚部num.conjugate() 返回该复数的共轭复数 x = 4 + 1j x(4+1j) x.conjugate()(4-1j) x.real4.0 x.imag1.0整数转换为浮点数, 非复数转换为复数。 如果有一个操作数是复数, 另一个操作数被转换为复数。 否则,如果有一个操作数是浮点数, 另一个操作数被转换为浮点数。一个新的运算符 / 已经被增加进来,以执行地板除:/ 除法不管操作数何种数值类型,总是舍去小数部分,返回数字序列中比真正的商小的最接近的数字。 1 / 20.5 1 / 20 2 / 30 4/31 -4 / 3-2divmod()内建函数把除法和取余运算结合起来, 返回一个包含商和余数的元组。对整数来说, 它的返回值就是地板除和取余操作的结果。对浮点数来说, 返回的商部分是math.floor(num1/num2),对复数来说, 商部分是ath.floor(num1/num2).real)。 divmod(10, 3)(3, 1) divmod(3, 10)(0, 3) divmod(10, 2.5)(4.0, 0.0)内建函数round()用于对浮点数进行四舍五入运算。它有一个可选的小数位数参数。如果不提供小数位参数, 它返回与第一个参数最接近的整数(但仍然是浮点类型)。第二个参数告诉round 函数将结果精确到小数点后指定位数。 round(3)3 round(3.45)3 round(3.49999)3 round(3.49999, 1)3.5 round(-3.4)-3 round(-3.5)-4 round(-3.49, 1)-3.5round() 函数是按四舍五入的规则进行取整函数 floor()得到最接近原数但小于原数的整数函数 int()直接截去小数部分。Python 还提供了两个内建函数来返回字符串表示的8 进制和16 进制整数。它们分别是 oct()和 hex()。 hex(255)0xff oct(255)0o377函数chr()接受一个单字节整数值,返回一个字符串,其值为对应的字符。函数ord()则相反,它接受一个字符,返回其对应的整数值。 ord(a)97 chr(97)a当你的程序需要随机数功能时,random 模块就能派上用场。该模块包含多个伪随机数发生器,它们均以当前的时间戳为随机数种子。这样只要载入这个模块就能随时开始工作。下面列出了该模块中最常用的函数:两个整数参数,返回二者之间的随机整数randrange() 它接受和 range() 函数一样的参数, 随机返回range(start,stop,step)结果的一项uniform() 几乎和 randint()一样,不过它返回的是二者之间的一个浮点数(不包括范围上限)。random() 类似 uniform() 只不过下限恒等于0.0,上限恒等于1.0choice() 随机返回给定序列(关于序列,见第六章)的一个元素 s = abcdefgh s:-1hgfedcba s:2aceg for i in range(-1, -len(s), -1):print(s:i)abcdabcabastr()函数在需要把一个对象的可打印信息输出时特别有用,不仅仅是对序列类型,对其他类型的对象同样如此.Unicode()是str()函数的unicode 版本,它跟str()函数基本一样.函数名 功能enumerate(iter) 接受一个可迭代对象作为参数,返回一个enumerate 对象(同时也是一个迭代器),该对象生成由iter 每个元素的index 值和item 值组成的元组(PEP 279)len(seq) 返回seq 的长度max(iter,key=None) or max(arg0,arg1.,key=None)b 返回iter 或(arg0,arg1,.)中的最大值,如果指定了key,这个key 必须是一个可以传给sort()方法的,用于比较的回调函数.min(iter, key=None) or min(arg0, arg1. key=None)b 返回iter 里面的最小值;或者返回(arg0,arg2,.)里面的最小值;如果指定了key,这个key 必须是一个可以传给sort()方法的,用于比较的回调函数.字符串是不可变的,所以你不能仅仅删除一个字符串里的某个字符,你能做的是清空一个空字符串,或者是把剔除了不需要的部分后的字符串组合起来形成一个新串。假设你想要从Hello World!里面删除小写的l aString = Hello World! aString = aString:3 + aString4: aStringHelo World! foo = Helloworld fooHelloworld http:/ localhost :8000 /cgi-bin/friends2.pyhttp:/localhost:8000/cgi-bin/friends2.py There are %(howmany)d %(lang)s Quotation Symbols % lang: Python, howmany: 3There are 3 Python Quotation Symbols from string import Template s = Template(There are $howmany $lang Quotation Symbols) print (s.substitute(lang=Python, howmany=3)There are 3 Python Quotation Symbols from string import Template s = Template(He is $key $h boy) print (s.substitute(key = a, h = bad)He is a bad boy print (s.safe_substitute( h = bad)He is $key bad boy新式的字符串模板的优势是不用去记住所有的相关细节的,而是像现在shell 风格的脚本语言里面那样使用美元符号($).由于新式的字符串Template 对象的引进使得string 模块又重新活了过来,Template 对象有两个方法,substitute()和safe_substitute().前者更为严谨,在key 缺少的情况下它会报一个KeyError 的异常出来,而后者在缺少key 时,直接原封不动的把字符串显示出来.原始字符串的这个特性让一些工作变得非常的方便,比如正则表达式的创建(详见文档的re模块).正则表达式是一些定义了高级搜索匹配方式的字符串,通常是由代表字符,分组、匹配信息、变量名、和字符类等的特殊符号组成。正则表达式模块已经包含了足够用的符号。但当你必须插入额外的符号来使特殊字符表现的像普通字符的时候,你就陷入了“字符数字”的泥潭!这时原始字符串就会派上用场了. nn print(n) rnn print(rn)n最后我们要找一对原始的n 字符而不是换行。为了找到它,我们使用了一个简单的正则表达式,它的作用是查找通常被用来表示空白字符的反斜线-字符对(backslash-characterpairs)。 import re m = re.search(rtfvn, rHello World!n) if m is not None: m.group() m = re.search(rrtfvn, rHello World!n) if m is not None: m.group()n string = lmn max(string)n min(string)l min(ab12cd)1 min(AB12CD)1 min(ABabCDcd)A s = foobar for i, t in enumerate(s):print(i, t)0 f1 o2 o3 b4 a5 rstring.capitalize() 把字符串的第一个字符大写string.center(width) 返回一个原字符串居中,并使用空格填充至长度width 的新字符串string.count(str, beg=0,end=len(string) 返回str 在string 里面出现的次数,如果beg 或者end 指定则返回指定范围内str 出现的次数string.encode(encoding=UTF-8,errors=strict)a 以encoding 指定的编码格式编码string,如果出错默认报一个ValueError 的异常,除非errors 指定的是ignore或者replacestring.endswith(obj, beg=0,end=len(string)b,e 检查字符串是否以obj 结束,如果beg 或者end 指定则检查指定的范围内是否以obj 结束,如果是,返回True,否则返回False.string.expandtabs(tabsize=8)把字符串string中的tab符号转为空格,默认的空格数tabsize 是8.string.find(str, beg=0,end=len(string) 检测str 是否包含在string 中,如果beg 和end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1string.index(str, beg=0,end=len(string) 跟find()方法一样,只不过如果str 不在string 中会报一个异常.string.isalnum() 如果string 至少有一个字符并且所有字符都是字母或数字则返回True,否则返回Falsestring.isalpha() 如果string 至少有一个字符并且所有字符都是字母则返回True,否则返回False名词 意思ASCII 美国标准信息交换码BMP 基本多文种平面(第零平面)BOM 字节顺序标记(标识字节顺序的字符)CJK/CJKV 中文-日文-韩文(和越南语)的缩写Code point 类似于ASCII 值,代表Unicode 字符的值,范围在range(1114112)或者说0x000000 到0x10FFFF.Octet 八位二进制数的位组UCS 通用字符集UCS2 UCS 的双字节编码方式(见UTF-16)UCS4 UCS 的四字节编码方式.UTF Unicode 或者UCS 的转换格式.UTF-8 八位UTF 转换格式(无符号字节序列, 长度为一到四个字节)UTF-16 16 位UTF 转换格式(无符号字节序列,通常是16 位长两个字节,见UCS2)Unicode 是计算机可以支持这个星球上多种语言的秘密武器.在Unicode 之前,用的都是ASCII,ASCII 码非常简单,每个英文字符都是以七位二进制数的方式存贮在计算机内,其范围是32 到126.当用户在文件中键入一个大写字符A 时,计算机会把A 的ASCII 码值65写入磁盘,然后当计算机读取该文件时,它会首先把65 转化成字符A 然后显示到屏幕上.ASCII 编码的文件小巧易读。一个程序只需简单地把文件的每个字节读出来,把对应的数值转换成字符显示出来就可以了.但是ASCII 字符只能表示95 个可打印字符.后来的软件厂商把ASCII 码扩展到了8 位,这样一来它就可以多标识128 个字符,可是223 个字符对需要成千上万的字符的非欧洲语系的语言来说仍然太少Unicode 通过使用一个或多个字节来表示一个字符的方法突破了ASCII 的限制. 在这样机制下, Unicode 可以表示超过90,000 个字符.为了让Unicode 和ASCII 码值的字符串看起来尽可能的相像,Python 的字符串从原来的简单数据类型改成了真正的对象.ASCII 字符串成了StringType,而Unicode 字符串成了UnicodeType 类型.它们的行为是非常相近的.string 模块里面都有相应的处理函数.string 模块已经停止了更新,只保留了ASCII 码的支持,string 模块已经不推荐使用,在任何需要跟Unicode 兼容的代码里都不要再用该模块,Python 保留该模块仅仅是为了向后兼容。Python 里面处理Unicode 字符串跟处理ASCII 字符串没什么两样.Python 把硬编码的字符串叫做字面上的字符串,默认所有字面上的字符串都用ASCII 编码,可以通过在字符串前面加一个u前缀的方式声明Unicode 字符串,这个u前缀告诉Python 后面的字符串要编码成Unicode字符串 .codec 是COder/DECoder 的首字母组合.它定义了文本跟二进制值的转换方式,跟ASCII 那种用一个字节把字符转换成数字的方式不同,Unicode 用的是多字节.这导致了Unicode 支持多种不同的编码方式. 比如说codec 支持的四种耳熟能详的编码方式是 :ASCII,ISO8859-1/Latin-1,UTF-8 和UTF-16.中最著名的是UTF-8 编码,它也用一个字节来编码ASCII 字符,这让那些必须同时处理ASCII码和Unicode 码文本的程序员的工作变得非常轻松,因为ASCII 字符的UTF-8 编码跟ASCII 编码完全相同。UTF-8 编码可以用1 个到4 个字节来表示其他语言的字符,CJK/East 这样的东亚文字一般都是用3 个字节来表示,那些少用的、特殊的、或者历史遗留的字符用4 个字节来表示.这给那些需要直接处理Unicode 数据的程序员带来了麻烦,因为他们没有办法按照固定长度逐一读出各个字符.幸运的是我们不需要掌握直接读写Unicode 数据的方法,Python 已经替我们完成了相关细节,我们无须为处理多字节字符的复杂问题而担心.Python 里面的其他编码不是很常用,事实上,我们认为大部分的Python 程序员根本就用不着去处理其他的编码,UTF-16 可能是个例外.UTF-16 可能是以后大行其道的一种编码格式,它容易读写,因为它把所有的字符都是用单独的一个16 位字,两个字节来存储的,正因为此,这两个字节的顺序需要定义一下,一般的UTF-16 编码文件都需要一个BOM(Byte Order Mark),或者你显式地定义UTF-16-LE(小端)或者UTF-16-BE(大端)字节序.Unicode 支持多种编码格式,这为程序员带来了额外的负担,每当你向一个文件写入字符串的时候,你必须定义一个编码(encoding 参数)用于把对应的Unicode 内容转换成你定义的格式,Python 通过Unicode 字符串的encode()函数解决了这个问题,该函数接受字符串中的字符为参数,输出你指定的编码格式的内容。所以,每次我们写一个Unicode 字符串到磁盘上我们都要用指定的编码器给他编码一下,相应地,当我们从这个文件读取数据时,我们必须解码该文件,使之成为相应的Unicode 字符串对象.这些处理Unicode 字符串的例子简单到让人感到有点假,事实上,只要你遵守以下的规则,处理Unicode 就是这么简单:程序中出现字符串时一定要加个前缀 u. 不要用 str()函数,用unicode()代替. 不要用过时的 string 模块 - 如果传给它的是非ASCII 字符,它会把一切搞砸。 不到必须时不要在你的程序里面编解码 Unicod 字符.只在你要写入文件或数据库或者网络时,才调用encode()函数;相应地,只在你需要把数据读回来的时候才调用decode()函数.失误 #1: 你必须在一个极有限的时间内写出一个大型的应用,而且需要其他语言的支持,但是产品经理并没有明确定义这一点。你并没有考虑Unicode 的兼容,直到项目快要结束. ,这时候再添加Unicode 的支持几乎不太可能,不是吗?结果 #1: 没能预测到最终用户对其他语言界面的需求,在集成他们用的面向其他语种的应用时又没有使用Unicode 支持.更新整个系统既让让人觉得枯燥和更是浪费时间。失误 #2:在源码中到处使用string 模块或者str()和chr()函数.结果 #2:通过全局的查找替换把str()和chr()替换成unicode()和unichr(),但是这样一来很可能就不能再用pickle 模块,要用只能把所有要pickle 处理的数据存成二进制形式,这样一来就必须修改数据库的结构,而修改数据库结构就意味着全部推倒重来.失误 #3: 不能确定所有的辅助系统都完全地支持Unicode.结果 #3: 不得不去为那些系统打补丁,而其中有些系统可能你根本就没有源码.修复对Unicode 支持的bug 可能会降低代码的可靠性,而且非常有可能引入新的bug.decode()和encode()内建函数接受一个字符串做参数返回该字符串对应的解码后/编码后的字符串.decode()和encode()都可以应用于常规字符串和Unicode 字符串.utf-8 变量长度为8 的编码(默认编码)utf-16 变量长度为16 的编码(大/小端)utf-16-le 小端UTF-16 编码utf-16-be 大端UTF-16 编码ascii 7-bit 7 位ASCII 码表iso-8859-1 ISO 8859-1 (Latin-1) 码表unicode-escape (定义见Python Unicode 构造函数)raw-unicode-escape (定义见Python Unicode 构造函数)native Python 用的内部格式我们可以用extend()方法来代替连接操作符把一个列表的内容添加到另一个中去.使用extend()方法比连接操作的一个优点是它实际上是把新列表添加到了原有的列表里面,而不是像连接操作那样新建一个列表。 i * 2 for i in 8, -2, 5 16, -4, 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论