《Python 3程序开发指南(第2版•修订版)》——第2章 数据类型2.1 标识符与关键字...

    xiaoxiao2024-03-23  124

    本节书摘来自异步社区《Python 3程序开发指南(第2版•修订版)》一书中的第2章,第2.1节,作者[英]Mark Summerfield,王弘博,孙传庆 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    第2章 数据类型

    在本章中,我们开始对Python语言进行更细致的解读。我们首先讨论了对象引用命名的一些规则,并提供了Python关键字列表。之后我们介绍了Python中最重要的一些数据类型——集合数据类型除外,将在第3章进行讲解。这里讲解的数据类型都是内置的,只有一种来自于标准库。内置数据类型与标准库数据类型唯一的区别在于,对于后者,我们必须首先导入相关的模块,并且必须使用模块名对数据类型名进行限定——第5章对导入进行深度介绍。

    2.1 标识符与关键字

    创建一个数据项时,我们或者将其赋值给一个变量,或者将其插入到一个组合中(如前面章节中所讲述的,在Python中进行赋值操作时,实际上是使得某个对象引用对内存中存放数据的对象进行引用)。为对象引用赋予的名称称为标识符,或者仅仅是简单的名称。

    有效的Python标识符是任意长度的非空字符序列,其中包括一个“引导字符”以及0个或多个“后续字符”。Python标识符必须符合两条规则,并遵循某些约定。

    第一条规则是关于引导字符与后续字符的。只要是Unicode编码的字母,都可以充当引导字符,包括ASCII字母("a"、"b"、…、"z","A"、"B"、…、"Z")、下划线("_")以及大多数非英文语言的字母。后续字符可以是任意引导字符,或任意非空格字符,包括Unicode编码中认为是数字的任意字符,比如("0"、"1"、…、"9"),或者是加泰罗尼亚字符"·"。标识符是大小写敏感的,因此,TAXRATE、Taxrate、TaxRate、taxRate与taxrate 是5个不同的标识符。

    允许充当引导字符与后续字符的精确字符集在文档(Python language reference, Lexical analysis, Identifiers and keywords section)与PEP31311中进行了描述(支持非ASCII标识符)。

    第二条规则是Python标识符不能与Python关键字同名,因此,不能使用表2.1中的这些关键字作为标识符的名称。

    在前面的章节中,我们已经涉及了大多数关键字,尽管其中的11个——assert、class、del、finally、from、global、lambda、nonlocal、raise、with、yield尚未进行讨论。

    第一条约定是:不要使用Python预定义的标识符名对自定义的标识符进行命名,因此,要避免使用NotImplemented与Ellipsis,以及Python内置数据类型(比如int、float、list、str与tuple)的名,也不要使用Python内置函数名与异常名作为标识符名。读者可能会困惑如何判断自己对标识符的命名是否在上面需要避免的范围之内,Python有一个内置的名为dir()的函数,该函数可以返回对象属性列表。不带参数调用该函数时,将返回Python内置属性列表,例如:

    >>> dir()# Python 3.1's list has an extra item, '__package__' ['__builtins__', '__doc__', '__name__']

     builtins 属性在效果上是一个存放所有Python内置属性的模块。我们可以将其作为dir()函数的参数:

    >>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', ... 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

    上面输出的属性列表中大约包含130个名称,因此,使用省略号代替了其中大部分。以大写字母引导的名称是Python内置的异常名,其他的是函数名与数据类型名。

    如果记住或查询这些应该避免使用的标识符名称过于乏味,另一种替代的方法是使用Python的代码检查工具,比如PyLint(www.logilab.org/project/name/pylint),这一工具有助于识别Python程序中很多其他真正的或潜在的问题。

    第二条约定是关于下划线(_)的使用,名的开头和结尾都使用下划线的情况(_)应该避免使用,这是因为Python定义了各种特殊方法与变量,使用的就是这样的名称(对于特殊方法,我们可以对其进行重新实现,也就是说给出我们自己的实现版本),但我们自己不应该再引入这种新的名称,第6章将进行相应讲解。在有些上下文中,以一个或两个下划线引导的名称(但是没有使用两个下划线结尾)应该特殊对待。在第5章中,我们将展示何时使用单个下划线引导的名称,在第6章中将介绍何时使用两个下划线引导的名称。

    单一的下划线本身也可以当作一个标识符,在交互式解释器或Python Shell内部,下划线实际上存放了最后一个被评估的表达式的结果。在通常运行的程序中,没有下划线_,除非我们在代码中明确指定。在不关心迭代针对的具体数据项时,有些程序员喜欢在for…in循环中使用_,例如:

    for _ in (0, 1, 2, 3, 4, 5): print("Hello")

    然而,要注意的是,那些编写国际化程序的程序员一般会使用_作为其翻译函数的名称。这些程序员一般不使用gettext("translate me"),而是使用_("translate me")。(为使得上面的代码正常工作,必须首先导入gettext模块,以便可以访问其中的gettext()函数。)

    下面我们来看一段代码段中一些有效的标识符,这段代码是由讲西班牙语的程序员编写的。假设在这段代码之前已经执行了import math语句,并且变量radio与vieja_area已经创建:

    π = math.pi ( = 0.0000001 nueva_area = π * radio * radio if abs(nueva_area - vieja_area) < (: print("las areas han convergido")

    上面的代码中,我们使用了math模块,将epsilon(ε)设置为一个非常小的浮点值,并使用abs()函数获得区域大小差的绝对值——本章后面将具体讲解这些问题。这里我们主要关注的是,我们可以使用带重音的字符与希腊字符对标识符进行命名。同样地,我们也可以很容易地使用阿拉伯语、中文、希伯来语、日语与俄语字符或Unicode字符集支持的任意其他语言中的字符进行命名。

    判断是否是有效标识符的最简单方法是在交互式的Python解释器或IDLE的Python Shell中对其进行赋值操作,下面给出几个实例:

    >>> stretch-factor = 1 SyntaxError: can't assign to operator (...) >>> 2miles = 2 SyntaxError: invalid syntax (...) >>> str = 3 # Legal but BAD >>> l'impÔt31 = 4 SyntaxError: EOL while scanning single-quoted string (...) >>> l_impÔt31 = 5 >>>

    使用无效的标识符时,会产生一个SyntaxError异常。在不同的情况下,圆括号中的错误消息部分会有所变化,因此上面使用省略号对其进行替代。第一个赋值操作失败的原因在于,“-”不是一个Unicode字母、数字或下划线。第二个赋值操作失败是因为引导字符不是Unicode字母或下划线,而数字只能充当后续字符。如果标识符是有效的,就不会有异常产生——即便标识符是内置的数据类型、异常或函数的名称,因此,第三个赋值操作可以工作,尽管并不建议这样做。第四个赋值操作失败是因为引号不是Unicode字母、数字或下划线。第五个则一切正常。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)