Python案例分析docx.docx
- 文档编号:27120059
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:29
- 大小:37.43KB
Python案例分析docx.docx
《Python案例分析docx.docx》由会员分享,可在线阅读,更多相关《Python案例分析docx.docx(29页珍藏版)》请在冰豆网上搜索。
Python案例分析docx
Python知识讲解
Python版本3,也被称为 Python3000 或 Py3K(仿效Microsoft®Windows®2000操作系统而命名的昵称)是GuidovanRossum通用编程语言的最新版本。
虽然新版本对该核心语言做了很多改进,但还是打破了与2.x版本的向后兼容性。
其他一些变化则是人们期待已久的,比如:
∙真正的除法—例如,1/2 返回的是 .5。
∙long 和 int 类型被统一为一种类型,删除了后缀 L。
∙True、False 和 None 现在都是关键字。
本文—Python3系列文章中的第一篇—的内容涵盖了新的 print() 函数、input()、输入/输出(I/O)的变化、新的 bytes 数据类型、字符串和字符串格式化的变化以及内置的 dict 类型的变化。
本文面向的是那些熟悉Python并对新版本的变化很感兴趣但又不想费力读完所有PythonEnhancementProposal(PEP)的编程人员。
(本文后面的 参考资料 部分提供了有关这些PEP的链接。
)
新的print()函数
如今,您将需要让手指习惯于键入 print("hello"),而不是原来的 print"hello",这是因为 print 现在是一个函数,不再是一个语句。
我知道,这多少有点痛苦。
我认识的每个Python程序员—一旦安装了版本3并得到“语法不正确”错误—都会郁闷地大叫。
我知道这两个额外的符号十分讨厌;我也知道这将会破坏向后兼容性。
但是这种改变还是有好处的。
让我们考虑这样的情况,即需要将标准输出(stdout)重定向到一个日志。
如下的例子会打开文件log.txt以便进行追加并将对象指定给 fid。
之后,利用 print>> 将一个字符串重定向给文件 fid:
>>>fid=open("log.txt","a")
>>>print>>fid,"logtext"
另外一个例子是重定向给标准错误(sys.stderr):
>>>print>>sys.stderr,"anerroroccurred"
上述两个例子都不错,但还有更好的解决方案。
新的语法只要求给 print() 函数的关键字参数 file 传递一个值就可以了。
比如:
>>>fid=open("log.txt","a")
>>>print("log.txt",file=fid)
这样的代码,语法更为清晰。
另一个好处是通过向 sep 关键字参数传递一个字符串就能更改分割符(separator),通过向 end 关键字参数传递另外一个字符串就能更改结束字符串。
要更改分割符,可以利用:
>>>print("Foo","Bar",sep="%")
>>>Foo%Bar
总地来说,新的语法为:
print([object,...][,sep=''][,end='endline_character_here'][,file=redirect_to_here])
其中,方括号([])内的代码是可选的。
默认地,若只调用 print() 自身,结果会追加一个换行符( \n)。
回页首
从raw_input()到input()
在Python版本2.x中,raw_input() 会从标准输入(sys.stdin)读取一个输入并返回一个字符串,且尾部的换行符从末尾移除。
下面的这个例子使用 raw_input() 从命令提示符获取一个字符串,然后将值赋给 quest。
>>>quest=raw_input("Whatisyourquest?
")
Whatisyourquest?
Toseektheholygrail.
>>>quest
'Toseektheholygrail.'
与之不同,Python2.x中的 input() 函数需要的是一个有效的Python表达式,比如 3+5。
最初,曾有人建议将 input() 和 raw_input() 从Python内置的名称空间一并删除,因此就需要进行导入来获得输入能力。
这从方法上就不对;因为,简单键入:
>>>quest=input("Whatisyourquest?
")
将会变为:
>>>importsys
>>>print("Whatisyourquest?
")
>>>quest=sys.stdin.readline()
对于一个简单输入而言,这太过繁琐,并且对于一个新手,这未免太难理解。
往往需要向他们讲述模块 和导入 究竟是怎么回事、字符串输出以及句点操作符又是如何工作的(如此麻烦的话,与Java™语言就没什么差别了)。
所以,在Python3内,将raw_input() 重命名为 input(),这样一来,无须导入也能从标准输入获得数据了。
如果您需要保留版本2.x的 input() 功能,可以使用 eval(input()),效果基本相同。
回页首
有关bytes的简介
新的数据类型bytesliteral及 bytes 对象的用途是存储二进制数据。
此对象是0到127的不可修改的整数序列或纯粹的ASCII字符。
实际上,它是版本2.5中 bytearray 对象的不可修改版本。
一个 bytesliteral 是一个前面冠以 b 的字符串—例如,b'byteliteral'。
对bytesliteral的计算会生成一个新的 bytes 对象。
可以用 bytes() 函数创建一个新的 bytes 对象。
bytes 对象的构造函数为:
bytes([initializer[,encoding]])
例如:
>>>b=(b'\xc3\x9f\x65\x74\x61')
>>>print(b)
b'\xc3\x83\xc2\x9feta'
会创建一个 bytes 对象,但这是多余的,因为通过赋值一个byteliteral就完全可以创建 bytes 对象。
(我只是想要说明这么做是可行的,但是我并不建议您这么做。
)如果您想要使用iso-8859-1编码,可以尝试下面的做法:
>>>b=bytes('\xc3\x9f\x65\x74\x61','iso-8859-1')
>>>print(b)
b'\xc3\x83\xc2\x9feta'
如果初始化器(initializer)是一个字符串,那么就必须提供一种编码。
如果初始化器是一个bytesliteral,则无须指定编码类型:
请记住,bytesliteral并不是字符串。
但是与字符串相似,可以连接多个字节:
>>>b'hello'b'world'
b'helloworld'
用 bytes() 方法代表二进制数据以及被编码的文本。
要将 bytes 转变为 str, bytes 对象必须要进行解码(稍后会详细介绍)。
二进制数据用 decode() 方法编码。
例如:
>>>b'\xc3\x9f\x65\x74\x61'.decode()
'ßeta'
也可以从文件中直接读取二进制数据。
请看以下的代码:
>>>data=open('dat.txt','rb').read()
>>>print(data)#dataisastring
>>>#contentofdata.txtprintedouthere
它的功能是打开文件以便在二进制模式内读取一个文件对象,并在整个文件内进行读取。
回页首
字符串
Python具有单一的字符串类型 str,其功能类似于版本2.x的unicode类型。
换言之,所有字符串都是unicode字符串。
而且—对非拉丁文的文本用户也非常方便—非-ASCII标识符现在也是允许的。
例如:
>>>césar=["author","consultant"]
>>>print(césar)
['author','consultant']
在Python之前的版本内,repr() 方法会将8-位字符串转变为ASCII。
例如:
>>>repr('é')
"'\\xc3\\xa9'"
现在,它会返回一个unicode字符串:
>>>repr('é')
"'é'"
正如我之前提到的,这个字符串是内置的字符串类型。
字符串对象和字节对象是不兼容的。
如果想要得到字节的字符串表示,需要使用它的 decode() 方法。
相反,如果想要从该字符串得到bytesliteral表示,可以使用字符串对象的 encode() 方法。
回页首
字符串格式化方面的变化
很多Python程序员都感觉用来格式化字符串的这个内置的 % 操作符太有限了,这是因为:
∙它是一个二进制的操作符,最多只能接受两个参数。
∙除了格式化字符串参数,所有其他的参数都必须用一个元组(tuple)或是一个字典(dictionary)进行挤压。
这种格式化多少有些不灵活,所以Python3引入了一种新的进行字符串格式化的方式(版本3保留了 % 操作符和 string.Template模块)。
字符串对象现在均具有一个方法 format(),此方法接受位置参数和关键字参数,二者均传递到 replacement字段 。
Replacement字段在字符串内由花括号({})标示。
replacement字段内的元素被简单称为一个字段。
以下是一个简单的例子:
>>>"Ilove{0},{1},and{2}".format("eggs","bacon","sausage")
'Iloveeggs,bacon,andsausage'
字段 {0}、{1} 和 {2} 通过位置参数 eggs、 bacon 和 sausage 被传递给 format() 方法。
如下的例子显示了如何使用 format() 通过关键字参数的传递来进行格式化:
>>>"Ilove{a},{b},and{c}".format(a="eggs",b="bacon",c="sausage")
'Iloveeggs,bacon,andsausage'
下面是另外一个综合了位置参数和关键字参数的例子:
>>>"Ilove{0},{1},and{param}".format("eggs","bacon",param="sausage")
'Iloveeggs,bacon,andsausage'
请记住,在关键字参数之后放置非关键字参数是一种语法错误。
要想转义花括号,只需使用双倍的花括号,如下所示:
>>>"{{0}}".format("can'tseeme")
'{0}'
位置参数 can'tseeme 没有被输出,这是因为没有字段可以输出。
请注意这不会产生错误。
新的 format() 内置函数可以格式化单个值。
比如:
>>>print(format(10.0,"7.3g"))
10
换言之,g 代表的是 一般格式,它输出的是宽度固定的值。
小数点前的第一个数值指定的是最小宽度,小数点后的数值指定的是精度。
formatspecifier的完整语法超出了本文的讨论范围,更多信息,可以参见本文的 参考资料 小节。
回页首
内置dict类型的变化
3.0内的另一个重大改变是字典内 dict.iterkeys()、 dict.itervalues() 和 dict.iteritems() 方法的删除。
取而代之的是.keys()、 .values() 和 .items(),它们被进行了修补,可以返回轻量的、类似于集的容器对象,而不是键和值的列表。
这样的好处是在不进行键和条目复制的情况下,就能在其上执行 set 操作。
例如:
>>>d={1:
"dead",2:
"parrot"}
>>>print(d.items())
注意:
在Python内,集 是惟一元素的无序集合。
这里,我创建了具有两个键和值的一个字典,然后输出了 d.items() 的值,返回的是一个对象,而不是值的列表。
可以像 set 对象那样测试某个元素的成员资格,比如:
>>>1ind#testformembership
True
如下是在 dict_values 对象的条目上进行迭代的例子:
>>>forvaluesind.items():
...print(values)
...
dead
parrot
不过,如果您的确想要得到值的列表,可以对所返回的 dict 对象进行强制类型转换。
比如:
>>>keys=list(d.keys())
>>>print(keys)
[1,2]
回页首
新的I/O
元类
Wikipedia对元类的定义是这样的,“一个元类 是这样一个类,其实例也是类。
”在本系列的第2部分我会对这个概念进行详细的介绍。
在深入研究I/O的新机制之前,很有必要先来看看抽象基类(abstractbaseclasses,ABC)。
更深入的介绍将会在本系列的第2部分提供。
ABC 是一些无法被实例化的类。
要使用ABC,子类必须继承自此ABC并且还要覆盖其抽象方法。
如果方法的前缀使用 @abstractmethod 修饰符(decorator),那么此方法就是一个抽象方法。
新的ABC框架还提供了 @abstractproperty 修饰符以便定义抽象属性。
可以通过导入标准库模块 abc 来访问这个新框架。
清单1所示的是一个简单的例子。
清单1.一个简单的抽象基类
fromabcimportABCMeta
classSimpleAbstractClass(metaclass=ABCMeta):
pass
SimpleAbstractClass.register(list)
assertisinstance([],SimpleAbstractClass)
register() 方法调用接受一个类作为其参数并会让此ABC成为所注册类的子类。
这一点可以通过在最后一行上调用 assert 语句进行验证。
清单2是使用修饰符的另外一个例子。
清单2.使用修饰符的一个抽象基类
fromabcimportABCMeta,abstractmethod
classabstract(metaclass=ABCMeta):
@abstractmethod
defabsMeth(self):
pass
classA(abstract):
#mustimplementabstractmethod
defabsMeth(self):
return0
了解了ABC之后,我们就可以继续探究新的I/O系统了。
之前的Python发布版都缺少一些重要但是出色的函数,比如用于类似于流的对象的 seek()。
类似于流的对象 是一些具有 read() 和 write() 方法的类似于文件的对象—比如,socket或文件。
Python3具有很多针对类似于流的对象的I/O层—一个原始的I/O层、一个被缓冲的I/O层以及一个文本I/O层—每层均由其自身的ABC及实现定义。
打开一个流还是需要使用内置的 open(fileName) 函数,但是也可以调用 io.open(fileName))。
这么做会返回一个缓冲了的文本文件;read() 和 readline() 会返回字符串(请注意,Python3内的所有字符串都是unicode)。
您也可以使用 open(fileName,'b')打开一个缓冲了的二进制文件。
在这种情况下,read() 会返回字节,但 readline() 则不能用。
此内置 open() 函数的构造函数是:
open(file,mode="r",buffering=None,encoding=None,errors=None,newline=None,closefd=True)
可能的模式有:
∙r:
读
∙w:
打开供写入
∙a:
打开供追加
∙b:
二进制模式
∙t:
文本模式
∙+:
打开一个磁盘文件供更新
∙U:
通用换行模式
默认的模式是 rt,即打开供读取的文本模式。
buffering 关键字参数的期望值是以下三个整数中的一个以决定缓冲策略:
∙0:
关闭缓冲
∙1:
行缓冲
∙>1:
完全缓冲(默认)
默认的编码方式独立于平台。
关闭文件描述符或 closefd 可以是True或False。
如果是False,此文件描述符会在文件关闭后保留。
若文件名无法奏效的话,那么 closefd 必须设为True。
open() 返回的对象取决于您所设置的模式。
表1给出了返回类型。
表1.针对不同打开模式的返回类型
模式
返回对象
文本模式
TextIOWrapper
二进制
BufferedReader
写二进制
BufferedWriter
追加二进制
BufferedWriter
读/写模式
BufferedRandom
请注意:
文本模式可以是 w、 r、wt、 rt 等。
清单3中所示的例子打开的是一个缓冲了的二进制流以供读取。
清单3.打开一个缓冲了的二进制流以供读取
>>>importio
>>>f=io.open("hashlib.pyo","rb")#openforreadinginbinarymode
>>>f#fisaBufferedReaderobject
>>>f.close()#closestream
BufferedReader 对象可以访问很多有用的方法,比如 isatty、 peek、raw、 readinto、readline、 readlines、seek、seekable、tell、 writable、write 和 writelines。
要想查看完整列表,可以在 BufferedReader 对象上运行 dir()。
回页首
结束语
Python社区是否会接?
?
版本3还尚在人们的猜测之中。
打破向后兼容性意味着将要为两种版本提供支持。
一些项目开发人员可能不太想迁移其项目,即便是使用版本2到3的转化器。
就我个人而言,我发现从Python版本2迁移到3其实不过是对几个事情的重新认识:
它当然不会像从Python迁移到Java或Perl语言那样变化强烈。
很多变化是早就在人们意料中的,比如对 dict 的实质更改。
执行 print() 远比执行Java的 System.out.println() 容易得多,学习起来也相对容易,所以的确能带来一些好处。
我猜想,blogosphere内的一些帖子会让Python的支持者也会误认为其中的某些变更—例如对向后兼容性的打破—具有破坏性的影响。
Lambda本来就是准备好要删除的,只不过一直没有这么做,仍保留了其原始的格式。
有关保留项目的完整列表,请访问Python 核心开发站点。
如果您具备足够的探索精神愿意深入研究所有的PEP,那么您一定能够从中获得更深入的信息。
本系列的下一期文章将会涵盖更高级的主题,比如元类语法、ABC、修饰符、integerliteral支持、基类型和异常。
Python3初探,第2部分:
高级主题
元类、修饰符及其他的一些奇异特性
CesarOtero,顾问,自由职业
简介:
Python3是GuidovanRossum功能强大的通用编程语言的最新版本。
它虽然打破了与2.x版本的向后兼容性,但却清理了某些语法方面的问题。
本文是这个由两部分组成的系列文章中的第二篇,本文构建在此系列 前一期文章 的基础之上,内容涵盖了Python更多的新特性和更高深的一些主题,比如在抽象基类、元类和修饰符等方面的变化。
查看本系列更多内容
标记本文!
发布日期:
2009年5月04日
级别:
中级
其他语言版本:
英文
访问情况 2543次浏览
建议:
0 (添加评论)
平均分(共3个评分)
有关Python版本3—,也即 Python3000 或 Py3K—的前一篇文章讨论了Python内打破向后兼容性的一些基本变化,比如新的print() 函数、 bytes 数据类型以及 string 类型的变化。
本文是该系列文章的第2部分,探究了更为高深的一些主题,比如抽象基类(ABC)、元类、函数注释和修饰符(decorator)、整型数(integerliteral)支持、数值类型层次结构以及抛出和捕获异常,其中的大多数特性仍然会打破与版本2x产品线的向后兼容性。
类修饰符
在Python之前的版本中,对方法的转换必须在方法定义之后进行。
对于较长的方法,此要求将定义的重要组成部分与PythonEnhancementProposal(PEP)318(有关链接,请参见 参考资料)给出的外部接口定义分离。
下面的代码片段演示了这一转换要求:
清单1.Python3之前版本中的方法转化
defmyMethod(self):
#dosomething
myMethod=transformMethod(myMethod)
为了让此类情景更易于读懂,也为了避免必须多次重用相同的方法名,在Python版本2.4中引入了方法修饰符。
修饰符 是一些方法,这些方法可以修改其他方法并返回一个方法或另外一个可调用对象。
对它们的注释是在修饰符的名称前冠以“at”符号(@)—类似Java™注释的语法。
清单2显示了实际应用中的修饰符。
清单2.一个修饰符方法
@transformMethod
defmyMethod(self):
#dosomething
修饰符是一些纯粹的语法糖(syntacticsugar)—或者(如Wikipedia所言)“对计算机语言语法的补充,这些补充并不影响语言的功能,而是会让语言变得更易于被人使用。
”修饰符的一种常见用法是注释静态方法。
比如,清单1和清单2相当,但清单2更容易被人读懂。
定义修饰符与定义其他方法无异:
defmod(method):
method.__name__="John"
returnmethod
@mod
defmodMe():
pass
print(modMe.__name__)
更棒的是Python3现在不仅支持针对方法的修饰符,并且支持针对类的修饰符,所以,取代如下的用法:
classmyClass:
pass
myClass=doS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 案例 分析 docx