- 译者序
- 前言
- 第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 各部分练习题的解答
- 作者介绍
- 封面介绍
版本独立的打印
此外,可以在Python 2.6代码中编写Python 3.0的print函数,通过像下面这样一条语句支持该函数调用的变体:
这条语句把Python 2.6修改为支持Python 3.0的print函数。通过这种方法,我们可以使用Python 3.0 print功能,并且如果随后迁移到Python 3.0的话不必修改print。
还要记住,简单的打印,就像表11-5的头两行那样,在两个Python版本中都有效,因为任何表达式都可以包含在圆括号中,我们总是可以在Python 2.6中通过添加外围的圆括号,来伪装成调用一个Python 3.0 print函数。这么做的唯一缺点是,如果有多个要打印对象的话,它会产生一个元组(超出了已打印的对象),因为它们会打印出额外的外围圆括号。例如,在Python 3.0中,调用的圆括号中可能列出任意多个对象:
第一个在Python 2.6中也同样地工作,但是,第二个会在输出中产生一个元组:
要真正做到可移植,可以把打印字符串格式化为一个单个的对象,使用字符串格式化表达式或方法调用,或者我们在第7章介绍的其他字符串工具:
当然,如果你专门地使用Python 3.0的话,可以完全忘记这一映射,但很多程序员不编写Python 2.X的代码和系统的话,至少会遇到它们。
注意:我在整本书中使用Python 3.0的print函数调用。我通常将会提醒你,该结果在Python 2.6下可能有额外的外围圆括号,因为多个项是一个元组,但我有时候不会提醒你,因此,请把这个提醒当作一个额外的警告——如果你在Python 2.6的打印文本中看到额外的圆括号的话,要么在print语句中删除圆括号,使用这里给出的版本独立方案重新编写打印代码;要么学习习惯多余的文本。
为什么要注意print和stdout
print语句和sys.stdout之间的等效是很重要的。这样才有可能把sys.stdout重新赋值给用户定义的对象(提供和文件相同的方法,就像write)。因为print语句只是传送文本给sys.stdout.write方法,可以把sys.stdout赋值给一个对象,而由该对象的write方法通过任意方式处理文字,通过这个对象捕捉程序中打印的文本。
例如,你可以传送打印的文字给GUI窗口,或者定义一个有write方法的对象,它会做所需要的发送工作,从而可以提供给多个目的地。本书后面介绍类的时候,你会看到这个技巧的例子,它基本上看起来如下面的代码段。
这样行得通是因为print是本书下一部分中的所谓的多态运算:sys.stdout是什么不重要,只要有个方法(接口)称为write即可。在Python 3.0中使用文件关键字参数以及在Python 2.6中使用print的扩展形式>>,这种对象的重定向甚至变得更简单,因为我们不再需要刻意重设sys.stdout——常规的print仍然定向到stdout流:
Python内置的raw_input()函数会从sys.stdin文件读入,所以你可以用类似方式拦截对读取的请求:使用类来实现类似文件的read方法。参考第10章中关于raw_input和while循环的例子。
注意:因为打印的文字进入stdout流,这也是在CGI脚本中打印HTML的方式。这也可以让你在操作系统命令行中对Python脚本的输入和输出进行像往常一样的重定向:
Python的打印操作重定向工具实质上是这些Shell语法形式的纯Python替代。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论