详解Python3.1版本带来的核心变化_python

这里我们将对Python 3.1核心语言的变化进行分析,包括字符串的格式化、说明符以及其他方面的内容。希望这些变化能对大家了解Python 3.1有所帮助。

Python 3.0发布七个月之后,Python核心开发人员于2009年6月27日发布了新的Python 3.1版本。虽然此3.1版本只是对Python 3.0的一次小型升级,但是它不仅为开发者带来许多让人感兴趣的特性,同时在性能方面也有所改善。本文将为读者详细介绍Python 3.1版本在核心语言、标准程序库和性能改善方面的变化。

一、字符串的格式化

Python的最新版本为我们带来了讨人喜欢的格式字段的自动填数功能。我们知道,许多程序中经常需要格式化字符串。Python 2.x版本使用的是类似[s]printf函数的百分号操作符,如下所示:

  >>> '%s, %s!' % ('Hello', 'World') 

'Hello, World!'而Python 3.0则添加了更高级的字符串格式化功能,如下所示:

  >>> '{0}, {1}!'.format('Hello', 'World') 

'Hello, World!'如今,Python 3.1则在字符串格式化方面又有了新的改进。对于Python 3.0来说,每当您想在格式串中引用位置参数时,您必须给出每个位置参数的索引。但是在Python 3.1中,您就可以将这些索引抛在脑后了,因为Python会依次替您填充这些参数:

  >>> '{}, {}!'.format('Hello', 'World')
  'Hello, World!' 

二、PEP-378:用于千位分隔符的格式说明符

在财务应用程序中,通常要在数字中使用千位分隔符。从事金融或者财会方面工作的人士是不这样写的“您欠我$12345678”,而是“您欠我$12,345,678”,他们惯于使用逗号作为分隔符。那么,如何使用Python达到这种效果呢:

  >>> format(12345678, ',') 

'12,345,678'您可以利用其他区分符对数字进行分组。这里的宽度说明符(这里为8)包括了逗号和小数点:

 

  >>> format(1234, ',').replace(',', '_')

'12,345.7'逗号通常作为默认的分隔字符,如果要使用其他字符作为分隔字符的话,只需通过replace函数用您喜欢的字符替换逗号即可,具体如下所示:

  >>> format(1234, ',').replace(',', '_') 

'1_234'当然,您还可以使用format函数来作为字符串方法:

>>> '{0:8,.1f}'.format(123.456)

三、Maketrans函数

利用maketrans()和translate()函数,我们可以使用一组字符来替换另一组字符。使用这一替换功能时,多少有点繁琐,因为它要求使用maketrans()函数(该函数的作用是把输入字符映射到输出字符)建立一个转换表,然后,再把这个转换表传递给translate()函数。当然,string模块仍然有它自己的maketrans()函数,不过Python 3.1不赞成使用它,而是赞赏使用单独的maketrans()函数来操作字节、字节数组和字符串。

下面的例子演示了如何使用maketrans()和translate()函数处理字节对象。需要注意的是,用于字节的转换表具有256个表项(每一项对应于一个可能的字节),并且这个例子把大部分字节都映射到它们自身,只有1,2和3例外,因为它们分别映射到了4,5和6。如下所示:

  >>> tt = bytes.maketrans(b'123', b'456')
  >>> len(tt)
  256
  >>> tt
  b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\
  t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\
  x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\
  x1e\x1f !"#$%&\'()*+,-./0456456789:;<=>
  ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcd
  efghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\
  x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\
  x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\
  x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\
  xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\
  xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\
  xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\
  xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\
  xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\
  xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\
  xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\
  xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\
  xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\
  xfa\xfb\xfc\xfd\xfe\xff' 

建好转换表之后,我们只需把它传递给translate()函数即可,如下所示:

  >>> b'123456'.translate(tt) 

b'456456'我们还可以传递其它的参数作为要删除的字符:

  >>> b'123456'.translate(tt, b'5') 

b'45646'我们可以看到,原来的5已经从123456从删掉了,但是转换得到的5(请记住,我们的映射表将2转化为5)并没有删除。这说明,系统是先从原来的字符串中删除相应的字符,然后才进行的转换操作。
字符串的转换稍微有些不同,字符串版本的maketrans函数返回的是一个字典:

  >>> tt = str.maketrans('123', '456')
  {49: 52, 50: 53, 51: 54}
  >>> '123456'.translate(tt)
  '456456' 

四、与数学有关的变化

  >>> int.bit_length(19)
  5
  >>> bin(19) 

3.1版本在与数学有关的方面也有所改变。

Int添加了一个bit_length方法

新版本中,int变量具有一个bit_length方法,它能返回该int变量以二进制数表示的时候的位数。例如,数字19的二进制表示为10011,那么它的位数就是5:

'0b10011'浮点数的舍入

在Python 3.0以及早先的round()函数有点反复无常:如果您不指定精度的时候,它返回的是一个整数;如果指定精度的话,它返回的是您输入数据的类型:

  >>> round(1000)
  1000
  >>> round(1000.0)
  1000
  >>> round(1000, 2)
  1000
  >>> round(1000.0, 2) 

1000.0在Python 3.1中,只要输入的数字是一个整数(即使它是用浮点数的形式表示的,例如1000.0),那么它总是返回一个整型数:

  >>> round(1000)
  1000
  >>> round(1000.0)
  1000
  >>> round(1000, 2)
  1000
  >>> round(1000.0, 2) 

1000浮点数的表示

目前,实数在大部分的硬件和操作系统中都是用32位(单精度)或者64位(双精度)来表示的。然而,这会导致一些实数无法精确表示。由于计算机存储器的二进制特性,某些数字利用十进制表示形式非常简洁,但是要是使用浮点方案表示的话,就要复杂了。举例来说,利用32位的单精度浮点数表示数字0.6,则为0.59999999999999998:

>>> 0.6

0.59999999999999998对于这种表示方案,上面的数字是为了做到尽可能的精确,但是对用户来说却很不友好。 Python 3.1使用了一个新算法,以便使得原值的表示尽可能得简练。所以在Python 3.1中,人们输入上面的数字,一个更简洁的表示:

>>> 0.6

0.6这已经很精确了,除非遇到算术运算。举例来说,表达式0.7+0.1的值用32位浮点表示法表示的话,它是 0.79999999999999993,而数字0.8的值用32位浮点数表示则是 0.80000000000000004。 这样一来,就意味着0.7+0.1并不等于0.8,这会导致一些问题。例如,下面的循环将永不休止:

  >>> x = 0.0
  >>> while x != 1.0:
  ... print(repr(x))
  ... x += 0.1输出的结果:
  0
  0.10000000000000001
  0.20000000000000001
  0.30000000000000004
  0.40000000000000002
  0.5
  0.59999999999999998
  0.69999999999999996
  0.79999999999999993
  0.89999999999999991
  0.99999999999999989
  1.0999999999999999
  1.2
  1.3
  1.4000000000000001
  1.5000000000000002
  1.6000000000000003 

...在Python 3.0中,repr()函数返回的是实际表示;而在Python 3.1中,它返回的是简洁表示。无论是在Python 3.0还是在Python 3.1中,print()函数显示的都是简洁表示:

  >>> print(0.1)
  0.1
  >>> print(0.10000000000000001) 

0.1Python语言还有一个称为decimal的模块,可用于精确的实数表示。它使用一个不同的表示方案来表示浮点数,并且在内存运行的情况下,用尽量多的数位来表示一个实数——并且,当进行算术的时候不会出现舍入误差。在Python 3.0中,Decimal类型使用了一种新方法来从一个字符串初始化它表示的值;在Python 3.1中,又增加了另一个新方法即from_float()来接收浮点数。注意,即使当使用from_float()的时候,Decimal模块也会比32位更精确。

  >>> from decimal import Decimal
  >>> Decimal.from_float(0.1)
  Decimal('0.1000000000000000055511151231257827021181583404541015625') 

五、改进的WITH语句

在Python 2.5中,WITH语句是作为一个__future__特性引入的,该语句的正式引入实际上是从Python 3.0开始的。到了Python 3.1版本,该语句已经能够支持更多的资源。最常见的情形是,它可以打开输入、输出文件并在处理完成后关闭它们。在Python 3.0中,我们要么使用嵌套的with语句,要么显式闭合在文件中。下面是一个Python 3.0的例子,它打开了一个输入文件,将其内容作为字符串读取,用字符串的title()方法处理内容,并将结果写到一个输出文件中。
这个示例中含有两个嵌套的with语句,注意嵌套的with语句中的最后一行。当代码试图读取out.txt的时候,结果为空,因为此文件是被缓冲处理的,并且还没有写入。当此with语句完成的时候,Python会关闭此文件,所以最后一行代码会认定out.txt的内容的确是大写文字。

  open('in.txt', 'w').write('abc def')
  with open('in.txt') as in_file:
  with open('out.txt', 'w') as out_file:
  text = in_file.read()
  assert text == 'abc def'
  text = text.title()
  assert text == 'Abc Def'
  out_file.write(text)
  assert open('out.txt').read() == '' 

assert open('out.txt').read() == 'Abc Def'看到嵌套的with语句,是不是感觉有点头疼,呵呵。接下来,我们要打开两个两个文件,并在处理完成后关闭它们(如果您需要打开三个文件,那么就需要三个嵌套的with语句)。 Python 3.1运行您使用单个WITH语句打开所有文件:

  open('in.txt', 'w').write('abc def')
  with open('in.txt') as in_file:
  with open('out.txt', 'w') as out_file:
  text = in_file.read()
  assert text == 'abc def'
  text = text.title()
  assert text == 'Abc Def'
  out_file.write(text)
  assert open('out.txt').read() == ''
  assert open('out.txt').read() == 'Abc Def' 

Python 3.1的另一项改进就是,gzip.GzipFile和bz2.BZ2File现在也能用于WITH语句。我们知道,这些都是压缩后的文件格式。下面的示例代码将使用gzip文件和bz2文件来存储5000个字节的内容,并显示其尺寸。这里还有用到一些额外的Python 3特性,比如带有命名属性的统计结果和高级字符串格式化。

  from bz2 import BZ2File
  from gzip import GzipFile
  import os
  with GzipFile('1.gz', 'wb') as g, BZ2File('1.bz2', 'wb') as b:
  g.write(b'X' * 5000)
  b.write(b'X' * 5000)
  for ext in ('.gz', '.bz2'):
  filename = '1' + ext
  print ('The size of the {0} file is {1.st_size} bytes'.format(ext, os.stat(filename)))输出的结果:
  The size of the .gz file is 43 bytes
  The size of the .bz2 file is 45 bytes 

六、小结

Python 3.0发布七个月之后,Python核心开发人员于2009年6月27日发布了新的Python 3.1版本。虽然此3.1版本只是对Python 3.0的一次小型升级,但是它不仅为开发者带来许多让人感兴趣的特性,同时在性能方面也有所改善。本文为读者详细介绍了Python 3.1版本在核心语言方面的变化,在接下来的文章中,我们将继续为读者介绍新版本中标准程序库和性能改善方面的变化。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
逆天问道3.1地图详解、mjrefresh3.1使用详解、python3.1、python3.1下载、opencv3.1 python3.5,以便于您获取更多的相关知识。

时间: 2024-09-20 07:48:26

详解Python3.1版本带来的核心变化_python的相关文章

详解python3百度指数抓取实例_python

百度指数抓取,再用图像识别得到指数 前言: 土福曾说,百度指数很难抓,在淘宝上面是20块1个关键字: 哥那么叼的人怎么会被他吓到,于是乎花了零零碎碎加起来大约2天半搞定,在此鄙视一下土福 安装的库很多: 谷歌图像识别tesseract-ocr pip3 install pillow pip3 install pyocr selenium2.45 Chrome47.0.2526.106 m or Firebox32.0.1 chromedriver.exe 图像识别验证码请参考:http://ww

详解Python如何获取列表(List)的中位数_python

前言 中位数是一个可将数值集合划分为相等的上下两部分的一个数值.如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数:如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的中位数.在这个任务里,你将得到一个含有自然数的非空数组(X).你必须把它分成上下两部分,找到中位数. 输入: 一个作为数组的整数(int)列表(list)的. 输出: 数组的中位数(int, float).  示例 get_median([1, 2, 3, 4, 5]) == 3 get_medi

详解Python中的__new__()方法的使用_python

先看下object类中对__new__()方法的定义: class object: @staticmethod # known case of __new__ def __new__(cls, *more): # known special case of object.__new__ """ T.__new__(S, ...) -> a new object with type S, a subtype of T """ pass obj

详解Windows 10版本布局 最好用的是它

自从微软于2014年秋季发布会上正式公布了Windows 10之后,正式宣布了毁誉参半的Windows 8/8.1的一页已经揭去,而微软将数字从8直接升至10,不仅意味着功能上的大步伐跃进,也意味着相比之前封闭式的内部测试,Windows 10是微软第一次尝试将操作系统的开发任务部分交予用户.虽然这在开放与交流上是一次不可多得的尝试,但也是第一次将诸多专业词汇推至用户面前:通道.分支 (Branch).预览.Ring,等等.故本文仅在于扫盲,向刚刚接触Windows 10的用户简单介绍一下细节,

详解android6.0版本下悬浮窗实现

悬浮窗在安卓中实现起来还是比较容易的,这几天在网上温习了相关资料,运行在我安卓6.0手机上才发现,原来在6.0手机上不是行的. 第一反应肯定是权限相关问题,做了相关处理后,果然让悬浮窗原形毕露了.直接贴代码. public class MainActivity extends AppCompatActivity { private static final int ALERT_WINDOW_PERMISSION_CODE = 100; private Button start_float; @O

Oracle 12c多租户特性详解:从Schema到PDB的变化与隔离

(题图来自Oracle VP , Sally Piao的摄影佳作,感谢摄影师授权) 编辑手记:Oracle 12c的多租户特性是Oracle Database历史上最重要的革新之一,在云时代这一特性展现出强大的整合威力,这篇文章来自<深入解析Oracle>一书的摘录. 在Oracle Database 12c版本中,一个重要的新特性:插接式数据库(Pluggable Database)被引入进来.在12c之前的版本中,Oracle数据库中的多用户管理通过Schema – 模式管理方式来实现,而

详解python的几种标准输出重定向方式_python

一. 背景 在Python中,文件对象sys.stdin.sys.stdout和sys.stderr分别对应解释器的标准输入.标准输出和标准出错流.在程序启动时,这些对象的初值由sys.__stdin__.sys.__stdout__和sys.__stderr__保存,以便用于收尾(finalization)时恢复标准流对象. Windows系统中IDLE(Python GUI)由pythonw.exe,该GUI没有控制台.因此,IDLE将标准输出句柄替换为特殊的PseudoOutputFile

详解Python中的join()函数的用法_python

函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下:     join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串     os.path.join():  将多个路径组合后返回 一.函数说明 1.join()函数 语法:  'sep'.join(seq) 参数说明 sep:分隔符.可以为空 seq:要连接的元素序列.字符串.元组.字典 上面的语法即:以sep作为分隔符,将s

阿里HotFix2.0升级详解——技术运营小二畅谈热修复领域那些事

在阿里HotFix2.0升级详解直播中,阿里HotFix核心开发工程师悟二从热修复背景.常见的热修复方案.阿里HotFix历程及2.0的突破与创新三个方面展开了详细的演讲.分享中,他重点介绍了百川Hotfix2.X 类.SO文件.资源文件修复方案以及管理后台服务,并对百川Hotfix 2.X将来需要新增的功能也做了展望. 以下内容根据直播视频和PPT整理而成. 热修复背景 正常Bug修复流畅包括版本上线.用户安装.发现Bug.紧急修复.重新发版.用户安装六步.该流程中存在着明显的不足,首先重新发