列表推导展示文本的函数种种—— python学习笔记五

标题列表推导展示文本的函数种种——python手册学习笔记之五

阅读到手册的第20章,列表推导的功能真是让人惊奇,竟然通过列表这种格式可以进行那么多的迭代。函数这一部分的内容太为丰富,仅仅列表推导这一小小分枝,一下子也很难全消化掉,一点一点的积累吧。
本篇记载一下学习列表推导中的一次特殊经历,反复试探过程中的一次成功。这对学习python是一个启示,对喜欢把咬文嚼字作为生活一部分的人,也是一个很好的警示。然后,这篇笔记的下余文字,则留给代码文件打开的三种方法,以巩固在第四部分函数篇中学到的一点列表推导知识。

标题一、反复试错

读书最让人纠结的是反复阅读也不解其意,而读有关python的书,除了那个文字的纠结之苦之外,还有个代码通不通得过的问题。常会碰到这样的情景,你老老实实按照书中的代码去做,却无论你重复多少遍,结果还是一个通不过。于是你尝试种种方法,这反复尝试后的结果,也常会让你失望而退。读《手册》21章,代码时间测试的那一章,我就是这样的纠结,仿佛你就是个学python的笨蛋似的。这代码时间测试,开头的那个代码怎么弄也通不过,只有缴械投降,暂时放弃,且待日后有感觉时再来试试。
但读书并非总是苦不堪言,也有让你轻松开怀之时。读20章的列表推导,读到那个“请留意:列表推导和map”(585页)方框内代码的时候,那个单行open代码,也是尝试多次通不过,一遍一遍的重来,一遍一遍通不过。
这个代码是:

>>>open(‘myfile’).readlines()

会是什么问题呢,其中有一个现成文件名。那就给我的文件夹加上一个myfile文件吧,专门做了一个myfile文件,存在我的py文件夹中,结果还是不行。
是不是该文件没有落入py所要求的目录呢?那把我的py文件夹也补上,使用cd+py文件夹名,我那个电脑文件目录就从lenono延伸到了py文件夹,可依然是不行。
再仔细检查字符的输入,标点的输入,括号的输入,没有错误,可同样的不行。
会不会是那个‘myfile’无须引号呢?这是对于字符串标识还不是那么熟悉的常见思路,我把引号去掉,输入的结果照旧是通不过。

不用再把尝试一一陈述了,似乎突然间有了点灵感似的,我想到那个引号内的文件名是不是不全,而造成了障碍。于是在myfile后加上.PY,这是文件的全名。好家伙,这一加上再来尝试,果然就通过了。文件中的代码,回车键之后,清楚地以列表的格式出现了。那个想到过的延伸目录,还真是一个必须要做的步骤。

>>> quit()
PS C:\Users\Lenovo> cd py文件夹
PS C:\Users\Lenovo\py文件夹> py

然后再来打开:

>>> open('myfile.py').readlines()
['#title = "The Meaning of Life"\n', "'aaa\\n鈥欙紝\n", "'bbb\\n',\n"]
>>>

20章后面的生成器文件迭代器部分,在使用open函数时,open后括弧内的文件名,就是文件的全名,

>>>for line in open(‘temp.txt’):

这大概在说明,前面的这个列表推导部分的open文字很可能是一个错讹,或者是因为py版本的不同而要求不同。
这个反复试错的成功,颇给人轻松愉悦之感,读书学习之乐,常常就在这些小小的成功之中。写书之人译书之人一点小小的错漏,在讲究严谨的学科之中,会给读者很多麻烦,这大概就是所谓著者、校者应该获得的警示了。

标题二、用列表推导打开文件字符

现在回到正题上来,同样的打开文件代码字符,用列表推导也可以做到,而且有很多方法。此处仅举一例,以巩固刚学到的列表推导的一些方法。
使用列表推导list comprehensive,真没有想到这个列表推导在显示文件中这么管用,在列表中可以使用多种函数,特别是for循环来做同样的事情,奇异的是,还可以对付各不相同的文件打开方式。

>>> [line.rstrip() for line in open('myfile.py').readlines()]
['#title = "The Meaning of Life"', "'aaa\\n鈥欙紝", "'bbb\\n',"]
>>>

用列表的方式,结合for循环,和去掉行文本尾部的换行标识函数rstrip,可以有open函数同样的功能,而且还去掉了换行符。那个for循环遍历了文件的每一行,同时又让函数rstrip起到了消掉换行标识的作用。其中的line,恰好就是 open(‘myfile.py’).readlines()的等同物。正因为这样一个替代,这个列表推导的行还可以简化为更短的代码。

>>> [line.rstrip() for line in open('myfile.py')]
['#title = "The Meaning of Life"', "'aaa\\n鈥欙紝", "'bbb\\n',"]
>>>

两个列表推导结果完全一样。我再试了一下,那个rstrip函数去尾,但不要r,使用strip函数,也是完全同样的结果,有点意思。

>>> [line.strip() for line in open('myfile.py')]
['#title = "The Meaning of Life"', "'aaa\\n鈥欙紝", "'bbb\\n',"]
>>>

标题三、列表推导竟然可以挑出其中元组的成员

如果一个列表是由元组tuple组成,我们又可以看到它的一个特异功能,它能够在元组中挑出成员,再构成一个列表。

>>> S = [('zhou', 45, 'engeer'), ('jiang', 40, 'student'), ('xiong', 30, 'president')]
>>> [job for (name, age, job) in S]
['engeer', 'student', 'president']

这把元组中的生活工作状态栏目组成了一个列表。自然我们可以随意再挑,例如把年龄挑出来组成一个列表。

>>> S = [('zhou', 45, 'engeer'), ('jiang', 40, 'student'), ('xiong', 30, 'president')]
>>> [job for (name, age, job) in S]
['engeer', 'student', 'president']
>>> [age for(name, age, job) in S]
[45, 40, 30]
>>>

这个列表推导好像和map组合,也可以做同样的事情,但使用map的同时,似乎总要和一个看起来有点玄乎的函数lambda合在一起用,这又需要对lambda做些更深的了解,这样的理解就暂且忽略吧。我该跨过第四部分,把对基准测试的模糊先存留起来,进入到手册下册的最后一个部分,模块和包这个部分了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值