作者:赖勇浩

前言

前几日发了一篇<为什么<Dive into Python>不值得推荐>的贴子,有朋友指出这本书虽然不适合初学者,但里面的一些内容还是可以当作提高篇的,最大的问题也许在于它基于老版本的 Python,并提出给 DIP 打补丁的想法。我觉得打补丁的想法还是很有意义的,而我也正好想宣传一下 Python 的新特性,所以决定写这 DIP 大补贴这样的系列文章,狗尾续貂,还请大家多多指教。

这一份补丁基于官网中文版5.4b(http://www.woodpecker.org.cn/diveintopython)的第二章至第六章,更新 DIP 的内容到适合 Python2.5 版本,涉及的特性有较大一部分必须2.5版本才能应用。

本文假定读者已经掌握 Python 的语法和常用模块,完全不懂 Python 者不是作者的预期读者,请先读 Tutorial。

另,本文会提到 Python3.0 版本的一些变化,但不会深入讨论 3.0 特性,只是告诉大家这东西已经变了样儿啦。想在这方面了解更多,请阅读 Python3.0 的在线文档。

第一贴

在第2章第一节(http://www.woodpecker.org.cn/diveintopython/getting_to_know_python/index.html)的例2.1 更新以后的代码为:

def buildConnectionString(params):

"""Build a connection string from a dictionary of parameters.

Returns string."""

return ";".join("%s=%s" % (k, v) for k, v in params.iteritems())

if __name__ == "__main__":

myParams = {"server":"mpilgrim",

"database":"master",

"uid":"sa",

"pwd":"secret"

}

print buildConnectionString(myParams)

改变有三个:

一、去除了定义 myParams 时的续行符;

二、去除了 join() 实参中的临时列表,使用生成器表达式;

三、字典的 items() 函数改为 iteritems()。

下面具体来讲讲这三个新特性。

续行规则

Python 的续行规则分为两种:显式续行和隐式续行。显式即 DIP 中的在物理行结束符前加续行符表示下一行与本行是处于同一逻辑行。显式有两个缺点,一是加入续行符让代码看起来比较丑陋,不够 Pythonic;二是续行符后面必须是换行符,无法在同一行添加行注释。

隐式续行完美地解决了这两个问题,除了一个限制:隐式换行只可以出现在圆括号、方括号和花括号之间。简单来说,就是我们只有在定义函数、调用函数、定义元组、列表和字典时使用隐式续行,如:

>>> def foo(a, # 这是一个行注释,显式续行做不到哦~

...                 b):

...     print a, b

...

>>> foo(100,

...             10)

100 10

>>> atuple = (1, 2, 3,

...                     4, 5, 6)

>>> alist = [1, 2, 3,

...                 4, 5, 6]

>>> adict = {'abc' : 1,

...                 'def' : 2}

隐式续行在 from ... import ... 语句中也能发挥重要作用:

>>> from os.path import (isfile, isdir,

...                                  islink, ismount)

生成器表达式(Genetaor Expression)

原文使用的”["%s=%s" % (k, v) for k, v in params.items()]”称为list comprehension(译为列表包含或列表理解的都有,因为统一,本文使用英文),改为生成器表达式是为了提升性能,优化内存的使用。生成器表达式 是用来生成函数调用时序列参数的一种迭代器写法,在语法上跟 list comprehension 差不多,不过把方括号换成了圆括号,如:

>>> i = (i for i in xrange(10))

大家千万别以为 i 是一个元组,其实它是一个生成器对象:

>>> i

<generator object at 0x830b32c>

生成器对象可以遍历或转化为列表(或元组等数据结构),但不能切片(slicing)。当函数的唯一的实参是可迭代序列时,便可以去掉生成器表达式两端的圆括号,写出更优雅的代码:

>>> sum(i for i in xrange(10))

45

需要注意的是函数接受多个实参时,必须加上圆括号:

>>> map(str, (i for i in xrange(10)))

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

dict 的迭代遍历

随着 Python 的发展,迭代器理念在社区中深得人心,语言也源源不断地增加新特性来支持它。作为最常用的数据结构之一,dict 提供内置的迭代遍历方法是必然的。调用dict.items()函数族(包括dict.keys()和dict.values())都返回实实在在的列表 对象,这在遍历元素众多的 dict 对象时往往会引起垃圾收集机制动行,导致性能下降。

现代 Python 改造了 dict,为它增加了 iteritems() 函数族(包括 dict.iterkeys() 和 dict.itervalues())。它们的返回值是一个迭代器对象,而非占用大量内存的列表对象,这一特性使得基于 dict 的迭代更加高效。

类似的机制还有 xrange 对象、file.xreadlines() 等。值得一提的是 dict 和 file 提供更简洁的方式进行迭代遍历:

>>> for key in adict:

...     do_something_with(key)

>>> for line in file_obj:

...     do_something_with(line)

这里的 adict、file_obj 与 adict.iterkeys()、file_obj.xreadlines()有相同的效果,但显得更为 Pythonic,是推荐写法。

Python3.0

dict 的 iteritems() 函数族也好,xrange()也罢,在 Py3.0 里都改头换面了。Py3.0 是更彻底的基于迭代器编程的语言,dict 的 items() 函数族直接返回迭代器,就是说它的行为跟 Py2.x 的 iteritems() 函数族是一样的;而 iteritems() 函数族则直接“消失”了。类似的还有 range() 返回生成器,file.readlines() 返回迭代器;去除了 xrange() 内置函数和 file.xreadlines() 方法。

<Dive into Python>大补贴相关推荐

  1. <Dive into Python>大补贴(2)

    赖勇浩(http://laiyonghao.com) 第二贴 在 2.2 节函数声明中,DIP 讲述了关于函数定义的一些基础知识,后来又在 4.2 节使用可选参数和命名参数中讲述了关于函数参数的较为深 ...

  2. <Dive into Python>大补贴(1)

    <Dive into Python>大补贴 作者:赖勇浩 前言 前几日发了一篇<为什么<Dive into Python>不值得推荐>的贴子,有朋友指出这本书虽然不 ...

  3. Dive into Python

    写这篇文章的原因完全是为了督促自己每天晚上看完两章<Dive Into Python>这本书,因此,很多内容都是摘抄自原书的翻译版或者是自己瞎想,于是就顺带着记录了下来.此前已经看完前两章 ...

  4. 《Dive Into Python》非死不可

    译者言: 早在 2008 年 8 月,我就曾在自己的博客发表了一篇<为什么<Dive into Python>不值得推荐>(http://blog.csdn.net/lanph ...

  5. 为什么《Dive into Python》不值得推荐

    2010 年 5 月 5 日更新:我翻译了一篇<<Dive Into Python>非死不可>作为对本文观点的进一步支持和对评论的回复,请见:http://blog.csdn. ...

  6. 深入python3 (Dive Into Python 3) 在线阅读与下载

    在线阅读:http://book.doucube.com/diveintopython3/  中文版 下载地址:https://github.com/downloads/diveintomark/di ...

  7. 深入 Python :Dive Into Python 中文版 读书笔记 第13,14,15单元测试

    2019独角兽企业重金招聘Python工程师标准>>> 第 13 章 单元测试 13.4. 正面测试 (Testing for success) 13.5. 负面测试 (Testin ...

  8. dive into python 3_对象方法Dive into Python读书笔记3

    近期朋友几篇文章介绍了改对象方法的文章. 关联文章的地址 XML,以及网络部份直接跳过了. 单元测试部份很好,但是我前目是小作坊式的发开,更重视效率,所以也略过. 当前有机遇 会返来看这几章的. 1. ...

  9. 对象方法Dive into Python读书笔记3

    近期朋友几篇文章介绍了改对象方法的文章. 关联文章的地址 XML,以及网络部份直接跳过了. 单元测试部份很好,但是我前目是小作坊式的发开,更重视效率,所以也略过. 当前有机遇 会返来看这几章的. 1. ...

最新文章

  1. 使用recon/domains-hosts/baidu_site模块,枚举baidu网站的子域
  2. FJ省队集训DAY3 T1
  3. Xftp5解决“要继续使用此程序,您必须应用最新的更新或使用新版本”
  4. jquer 的简输出
  5. DataGridView使用技巧十:单元格表示值的自定义
  6. react脚手架快速创建react项目
  7. Windows SDK编程之一 窗口示例程序
  8. HDU-5532Almost Sorted Array LIS问题
  9. 中立安全、赋能产业,UCloud优刻得凭差异化路线进军产业互联
  10. 语言五子棋无ai程序框图_微软多语言预训练模型T-ULRv2登顶XTREME排行榜
  11. php和python-浅析PHP与Python进行数据交互
  12. 5款Mac极速下载工具推荐和下载
  13. StringUtil
  14. Nofollow标签的写法以及nofollow使用介绍
  15. 铁蛋白-AHLL纳米颗粒|人表皮生长因子-铁蛋白重链亚基纳米粒子(EGF-5Cys-FTH1)|铁蛋白颗粒包载氯霉素Chloramphenicol-Ferritin
  16. 怎么做应力应变曲线_如何用Origin画应力应变曲线 - 图文 -
  17. 数字电视业务PSI/SI学习系列
  18. 数据结构(三)---树
  19. web前端大作业:旅游网页主题网站设计——武汉旅游网页设计(11页)HTML+CSS+JavaScript
  20. Super-FAN论文阅读

热门文章

  1. 前端使用支付宝和微信进行移动支付
  2. 远传oa智能网络办公系统 v2006 下载
  3. glide加载不了图片,证书问题
  4. JavaWEB九:thymeleaf 之 分页显示和关键字查询
  5. 代理服务器对比HA,NGINX
  6. EMR 重磅发布智能运维诊断系统(EMR Doctor)——开源大数据平台运维利器
  7. 只有自律的人才配拥有真正的自由!
  8. TypeScript篇.01-简介,类,接口,基础类型的简单介绍
  9. dymola学习笔记-第五天——学习软件自带教程DymolaUserManualVolume1,page104-最后
  10. 人工智能行业火爆:AI研究生没毕业被抢光