对于Python 3.1核心语言的改变,相信很多没有经验的人都无能为力。因此,本文总结了出现问题的原因和解决方法,希望大家可以通过这篇文章来解决这个问题。
在这里,我们将分析Python 3.1核心语言的变化,包括字符串的格式、描述符等方面。
Python 3.0发布7个月后,Python核心开发者于2009年6月27日发布了Python 3.1的新版本。虽然这个3.1版本只是Python 3.0的一个小升级,但是它不仅给开发者带来了很多有趣的特性,而且性能也有所提升。本文将向读者详细介绍Python版本在核心语言、标准库和性能提升方面的变化。
一、字符串的格式化
Python的* * *版本给我们带来了格式字段令人愉悦的自动填充功能。众所周知,许多程序经常需要格式化字符串。Python版本使用了类似于[s]printf函数的百分号运算符,如下所示:
%s,%s!%(“你好”,“世界”)“你好,世界!”Python 3.0增加了更高级的字符串格式化功能,如下所示:
'{0},{1}!'。格式(“你好”、“世界”)“你好,世界!”如今,Python 3.1在字符串格式方面有了新的改进。对于Python 3.0,每当您想要以格式字符串引用位置参数时,您必须给出每个位置参数的索引。但是在Python 3.1中,您可以将这些索引放在后面,因为Python会依次为您填写这些参数:
'{},{}!'。格式(“你好”、“世界”)“你好,世界!”二、PEP-378:用于千位分隔符的格式说明符
在金融应用中,数字通常使用千位分隔符。从事财务或会计工作的人不会写“你欠我12,345,678美元”,而是写“你欠我12,345,678美元”。他们习惯用逗号作为分隔符。那么,如何使用Python来实现这种效果呢:
格式(12345678,',')' 12,345,678 '您可以使用其他分隔符对数字进行分组。这里的宽度说明符(这里是8)包括逗号和小数点:
格式(1234,',')。replace(',',' _')' 12,345.7 '逗号通常用作默认分隔符。如果您想使用其他字符作为分隔符,只需通过替换功能将逗号替换为您喜欢的字符,如下所示。
格式(1234,',')。替换(',',' _')' 1 _ 234 '当然,也可以使用format函数作为字符串方法:
{0:8, 1f} '。格式(123.456)
Iii .Maketrans函数。
使用maketrans()和translate()函数,我们可以用一组字符替换另一组字符。当使用这个替换函数时,有些麻烦,因为它需要maketrans()函数(将输入字符映射到输出字符)来建立一个转换表,然后将这个转换表传递给translate()函数。当然,字符串模块仍然有自己的maketrans()函数,但是Python 3.1不赞成使用它,但是很欣赏使用单独的maketrans()函数来操作字节、字节数组和字符串。
下面的示例演示如何使用maketrans()和translate()函数来处理字节对象。需要注意的是,字节转换表有256个条目(每个条目对应一个可能的字节),除了1、2和3分别映射到4、5和6之外,这个例子将大多数字节映射到它们自己。如下图所示:
TT=字节.马克特兰(b'123 ',b'456 ')伦(TT)256吨
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核心语言的变化是怎么样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/65481.html