没错,又是一篇心路历程! 这次是在完成Coursera上Python for Everybody课程的Chapter11的作业时根据自己所学对代码进行精简的思考过程。也算是对自己学习过程中的一次记录。 作业的要求是这样的: Read through and parse a file with text and numbers. You will extract all the numbers in the file and compute the sum of the numbers. 就是通过读取一个文件,找到里面所有的数字然后求和! 好了知道要求了就开始写代码了,首先就是要打开文件,同时建立一个列表用于我们数字封装:
x = open('name.txt')
Nunmber = []
然后要进行读取,我最开始想的是通过for循环读取每一行,然后把每一行的数字找出来,这时我们要用正规则表达式把每行所有的数字匹配出来,所以我们需要导入Regular Expressions,这样我们代码如下:
import re
x = open('name.txt')
Nunmber = []
for line in x:
y = re.findall('[0-9]+',line)
这是我们通过print(y)发现,很多的空列表,如下: 因为我们遍历的每一行,所以可以想到,每一行都去找数字,没有的返回了空值,显然我们不需要这些空值。于是我想着通过if条件语句把空值过滤掉,如下:
if len(y) < 1 :
continue
再print(y)以下,结果如下: 这就是我们要的所有的数字了,但是我们需要把他们放到一个列表并且要以整数的形式,这样就可以sum()求和了,所以我们需要对每个Y进行遍历输出为整数,并把整数添加到我们的列表Nunmber中,代码如下:
for i in range(len(y)):
num = int(y[i])
Nunmber.append(num)
最后我们打印:
print(sum(Nunmber))
这样就得出我们的结果了。于是我看着我的代码,开始思考每一行的作用,这时想到了read()这个函数,这是把文本整体读取的函数,就是把整个文本返回一个字符串,如果这样我们就不用for循环每一行,直接在这个整体的字符串里找出来我们的整数不就行了,于是代码可以改成:
import re
x = open('name.txt')
t = x.read()
Nunmber = []
count = 0
y = re.findall('[0-9]+',t)
for i in range(len(y)):
num = int(y[i])
Nunmber.append(num)
count +=1
print(sum(Nunmber))
这样代码简洁了一些,但是在我交上作业之后看到作业下面有老教授的一个just for fun的提示,他让我们思考下如何通过两行代码来实现这个作业,并给出了如下提示:
import re
print( sum( [ ****** *** * in **********('[0-9]+',**************************.read()) ] ) )
其实之前的课程中,老教授有提过列表解析,只是说现在可以看看但是理解不了也没关系。不过我们根据上面的代码提示其实可以推测出来,如何填写。 首先我们看后面,是通过read()函数来整体读取文本,然后提取数字,所以后半部分应该是:
re.findall('[0-9]+',open('name.txt').read()
那我们数字找出来了,下一步就是把for循环和后半部分结合起来就可以了,如下:
int(i) for i in re.findall('[0-9]+',open('name.txt').read()
然后我们求和并打印,那么整个代码如下:
import re
print(sum([int(i) for i in re.findall('[0-9]+',open('name.txt').read() ) ]))
这样是不是更加的简洁了呢?!! 正如老教授所说的,结果不是很重要,重要的是你的思考过程,这个过程你是不是体验到了乐趣?!
|