今天我们来学习总结下Python之禅和他朋友们的第三题,这两天一直有事情没跟上大家的学习学习节奏,现在来学习一下的军哥的代码Python之禅,搞清楚每一行代码的意思
题目
统计一个文件中每个单词出现的次数,列出出现频率最多的5个单词。
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea – let’s do more of those!
在学习前我们需要了解一下几点知识:
- Python的i\o操作
- 列表解析、sort()方法、sorted()函数
- 字典Dict操作
- 正则表达式re
- lambda表达式
- Counter
- assert断言
Python的i\o操作
I\O:input\output
这里推荐网上两个参考教程,一个是廖雪峰老师的,另一个是菜鸟教程
参考链接
参考链接
读写文件
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,Python引入了with语句来自动帮我们调用close()方法
列表解析、sort()方法、sorted()函数
在军哥的代码中有一行使用了列表解析式,我们正好学习下
words = [s.lower() for s in re.findall(“\w+”, data)]
1. 列表解析
我们先看一下普通的生成列表
生成列表res的方式包含三行代码,而用列表解析只需要一行,非常简单!我们来分析下列表解析,首先制定列表名称,如res,接着定义一个表达式 x * 4 ,最后再编写一个for 循环 for x in ‘spam’
2. sort()方法
sort()方法:原地对列表进行永久性排序,而且已递增的顺序进行排序
|
|
我们可以在列表中添加reverse参数使列表反转
|
|
字典操作
这里就不总结字典使用方法了,可以参考廖雪峰老师的Python教程
我们看到军哥的代码中使用了dict中的get方法
self.mapping[word] = self.mapping.get(word, 0) + 1
字典以“键:值(key:value)”对形式表达
|
|
字典values和items方法分别返回字典的key值列表和(key, value)对元组
|
|
这里需要重点看下
读取不存在的键会报错,然而通过get()方法能够返回默认的值(None或用户定义的默认值),这是为了避免missing-key错误而填入默认值的一个方法:
|
|
正则表达式re
学习正则还是有点繁琐的,不多废话附上参考
参考链接
参考链接
lambda表达式
lambda表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名,这里不多写了,想深入了解的可以看Python学习手册
- lambda能够出现在Python语法不允许def出现的地方
- lambda的主体是一个单个的表达式,而不是一个代码块
现在我们看一下def和lambda表达式的区别:
|
|
来看个复杂点的
|
|
counter
参考链接
这里也谢谢九二同学的分享
assert断言
凡是用print()来辅助查看的地方,都可以用断言(assert)来替代,假如断言失败,就会抛出错误
这里分享下参考链接,今天翻了Python学习手册的assert,相比廖雪峰老师的教程Python学习手册的assert显得有点难懂。。。。。。。
参考链接
最后附上军哥的代码
欢迎大家访问我的博客Treehl的博客