Python:数据还是文本?

发布于 2021-01-29 16:06:00

Guido van Rossum在有关Python
3000
的演示中提到了一些要使从Python
2最终过渡到Python 3的过程。他特别在谈论文本处理,因为向Unicode过渡是Python 3中字符串的唯一表示形式是主要变化之一。

就文本处理而言,一张幻灯片(第14张)说:

  • 在2.6版中:
    • 对所有数据使用字节和b’…’(知道这些只是str和’…’的别名)
    • 对所有文本使用unicode和u’…’
  • 在2.5中:
    • ’…’表示数据,u’…’表示文本

我正在使用Python 2.6.4。这对我到底意味着什么?

在Python的世界中,数据和文本有什么区别?

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    简而言之,在Py3k中处理文本和数据的方式可以说是语言中最“重大”的变化。通过了解并尽可能避免某些Python
    2.6逻辑与3.x不同的工作方式,我们可以在发生迁移时提供便利。但是我们应该期望2.6逻辑的某些部分可能需要特别注意和修改,例如以处理不同的编码等。

    BDFL在幻灯片14上提出建议的想法可能是“ 使用
    Py3k支持的相同类型(并且仅支持这些类型),即,字符串的unicode字符串(str类型)和“数据”的8位字节序列(bytes类型)。

    上一句中的“ 使用 ”一词使用得比较宽松,因为这些类型的语义和关联的存储/编码在2.6和3.x版本之间有所不同。在Python
    2.6中,字节类型和关联的文字语法(b’xyz’)仅映射到str类型。因此

    # in Py2.6
    >>'mykey' == b'mykey'
    True
    b'mykey'.__class__
    <class 'str'>
    
    # in Py3k
    >>>'mykey' == b'mykey'
    False
    b'mykey'.__class__
    <class 'bytes'>
    

    为了回答您的问题(在下面的评论中),在2.6中,无论您使用b’xyz’还是’xyz’,Python都将其理解为一件事:str。 重要的是,
    您应该将它们 理解为[潜在/将来]两种不同的类型,它们具有不同的用途

    • str用于类似文本的信息,以及
    • 八位字节序列的字节,用于存储手头的任何数据。

    例如,再次接近您的示例/问题,在Py3k中,您将能够拥有包含两个具有相似键的元素的字典,一个具有b’mykey’,另一个具有’mykey’,但是在2.6以下,这是不可能的,因为这两个键实际上是相同的;重要的是您知道这种情况,并避免了(或以特殊方式在代码中明确标记)2.6代码在3.x中不起作用的情况。

    在Py3k中,str是一个抽象的unicode字符串,是一个unicode代码点(字符)序列,Python处理将其转换为编码形式或从其编码形式转换为任意编码(作为程序员,您确实对编码有发言权,但在处理字符串操作的时间,因此您不必担心这些细节)。相反,字节是8位“事物”的序列,语义和编码完全留给了程序员。

    因此,即使Python 2.6没什么区别,通过显式使用bytes()/ b’…’或str()/ u’…’,您…

    • …为即将到来的Py3k类型和语义做好准备,为自己和程序做好准备

    • …使源代码的自动转换(2to3工具或其他工具)更容易,从而b’…’中的b将保留,而u’…’中的u将被删除(因为唯一字符串类型为unicode)。

    有关更多信息
    Python 2.6新增功能 (请参阅PEP
    3112字节字面量)
    Python 3.0新增功能
    (请参见Text Vs. Data Instead Of Unicode Vs. 8-bit顶部)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看