- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
变量命名规则
语法:(下划线或字母)+(任意数目的字母、数字或下划线)
变量名必须以下划线或字母开头,而后面接任意数目的字母、数字或下划线。_spam、spam以及Spam_1都是合法的变量名,但1_Spam、spam$以及@#!则不是。
区分大小写:SPAM和spam并不同
Python程序中区分大小写,包括创建的变量名以及保留字。例如,变量名X和x指的是两个不同的变量。就可移植性而言,大小写在导入的模块文件名中也很重要,即使是在文件系统不分大小写的平台上也是如此。
禁止使用保留字
定义的变量名不能和Python语言中有特殊意义的名称相同。例如,如果使用像class这样的变量名,Python会引发语法错误,但允许使用kclass和Class作为变量名。表11-3列出当前Python中的保留字。
表11-3针对Python 3.0。在Python 2.6中,保留字的范围略有不同:
·print是一个保留字,因为打印是一条语句,而不是一个内置函数(本章稍后更详细地介绍)。
·exec是一个保留字,因为它是一条语句,而不是一个内置函数。
·nonlocal不是一个保留字,因为这条语句不可用。
在更早的Python中,情况或多或少也有些不同,有以下一些变化:
·with和as在Python 2.6之前都不是保留字,只有在上下文管理器正式可用之后,它们才是。
·yield在Python 2.3之前都不是保留字,只有在生成器函数可用后它才是。
·在Python 2.5中,yield从语句变为表达式,但它仍然是一个保留字,而不是一个内置函数。
你将会看到,大多数Python保留字都是小写的。而且它们确实是保留字,不像本书下一部分介绍的内置作用域中的变量名,你无法对保留字做赋值运算(例如,and=1会造成语法错误)[1]。
除了大小写是混合的,表11-3中的前三项True、False和None的含义多少有些特殊——它们也出现在第17章所介绍的Python的内置函数作用域中,并且它们也是可以分配给对象的技术名称。在所有其他的含义下,它们确实都是保留字,并且,在脚本中,除了它们所表示的对象之外,不可用于任何其他的用途。所有其他的保留字在Python的语法中都是固定的,只能在其本意的特定环境中使用。
此外,因为import语句中的模块变量名会变成脚本中的变量,这种限制也会扩展到模块的文件名:你可以写and.py和my-code.py这类文件。但是你无法将其导入,因为其变量名没有".py"扩展名时,就会变成代码中的变量。因此必须遵循刚才所提到的所有变量规则。保留字是禁区,破折号不行,不过下划线可以。第五部分我们会再次介绍这个概念。
Python的废弃协议
注意保留字在一种语言的各个阶段是如何变化的,这是一件有趣的事情。当一种新的功能可能会影响到已有的代码的时候,Python通常会使其成为可选的,并且将其发布为“废弃的”,以便在正式使用该功能之前的一个或多个发布中提出警告。这种思路使你有足够的时间注意到警告,并且在迁移到新的发布之前更新自己的代码。对于像Python 3.0这样的重要的新的发布(它广泛地影响到已有的代码),情况并非如此,但在大多数情况下,这是成立的。
例如,在Python 2.2中,yield是一个可选的扩展,但是,它在Python 2.3中是一个标准的关键字。它和生成器函数联合使用。这是Python违反向后兼容的一小部分实例中的一个。然而,yield随着时间逐步变化:在Python 2.2中它开始产生废弃警告,并且直到Python 2.3都还没有使用。
类似地,在Python 2.6中,with和as变成了用于上下文管理器(异常处理的一种新形式)的新的保留字。这两个单词在Python 2.5中不是保留字,除非用一个from__future__import(本书稍后介绍)手动打开环境管理器功能。使用Python 2.5的时候,with和as产生关于将要发生的变化的警告——除非是在Python 2.5中的IDLE版本中,它似乎已经支持此功能(即,在Python 2.5中使用这些单词作为变量名称确实会产生错误,但只是在其IDLE GUI的版本中会产生错误)。
命名惯例
除了这些规则外,还有一组命名惯例——这些并非是必要的规则,但一般在实际中都会遵守。例如,因为变量名前后有下划线时(例如,__name__),通常对Python解释器都有特殊意义,你应该避免让变量名使用这种样式。以下是Python遵循的一些惯例。
·以单一下划线开头的变量名(_X)不会被from module import*语句导入(第22章说明)。
·前后有下划线的变量名(__X__)是系统定义的变量名,对解释器有特殊意义。
·以两下划线开头、但结尾没有两个下划线的变量名(__X)是类的本地(“压缩”)变量(第30章说明)。
·通过交互模式运行时,只有单个下划线的变量名(_)会保存最后表达式的结果。
除了这些Python解释器的惯例外,还有Python程序员通常会遵循的各种其他惯例。例如,本书后面会看见类变量名通常以一个大写字母开头,而模块变量名以小写字母开头。此外,变量名self虽然并非保留字,但在类中一般都有特殊的角色。到了第17章,我们会研究另一种更大类型的变量名,称为内置变量名,这些是预先定义的变量名,但并非保留字(所以,可以重新赋值:open=42行得通,不过有时你可能会希望不能这样做)。
变量名没有类型,但对象有
本部分内容算是对前文的复习,这是让Python的变量名和对象保持鲜明差异的重点所在。如第6章所介绍的,对象有类型(例如,整数和列表),并且可能是可变的或不可变的。另一方面,变量名(变量)只是对象的引用值。没有不可变的观念,也没有相关联的类型信息,除了它们在特定时刻碰巧所引用的对象的类型。
在不同时刻把相同的变量名赋值给不同类型的对象,程序允许这样做:
在稍后的例子中,你会看到变量名的这种通用化的本质,是Python程序设计具有的决定性的优点[2]。第17章会介绍变量名也会存在于所谓的作用域内,作用域定义了变量名在哪里可以使用;对一个名字赋值的地点,决定了它在哪里可见。
注意:要了解其他的命名建议,参见Python的半官方风格指南PEP 8中的"Naming conventions"。可以从http://www.python.org/dev/peps/pep-0008访问该指南,或者通过Web搜索"Python PEP 8"。从技术上讲,这个文档把Python库代码的编码标准形式化了。
尽管很有用,但编码标准通常的缺陷在这里也适用。首先,PEP 8所附带的细节比你在本书中目前为止所了解的要更详细。并且,坦率地说,它变得比需要的更为复杂、严格和主观——其一些建议根本没有被实际工作的Python程序员普遍接受和遵守。此外,当今使用Python的一些最为优秀的公司,它们有自己的不同的编码标准。
然而,PEP 8确实包含了Python知识中的一些有用的规则,并且,对于Python初学者来说,它是很好的读物,只要你把它的推荐当做指南,而不是真理。
[1]不过,在Jython版的Python实现中,用户定义的变量名偶尔可以和Python的保留字相同。参见本书第2章对Jython的概要介绍。
[2]如果你用过像C++这样更加严格限定的语言,可能会想知道,Python中并没有所谓的C++的const声明的概念。有些对象是不可变的,但变量名总是可以赋值的。Python也有些方式可以在类和模块内隐藏变量名,但是和C++的声明并不相同(如果你对隐藏属性感兴趣,可以参阅第24章对_X模块名的介绍,第30章对_X类名的介绍,以及第38章中的Private和Public类装饰器示例)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论