第四章:整体建议

来源:互联网 发布:js indexof包含用法 编辑:程序博客网 时间:2024/05/18 03:26

4.1 不要重新发明轮子

4.1.1 学习Python标准库

标准库中使用了大量地道的代码。写风格良好的代码的一部分是要使用丰富的标准库。标准库中不知不觉增强功能的代码是python初学者最清晰的指引。Python被公认为是一种拿来即用的语言,标准库包含大量覆盖了很多领域的包。

使用标准库有两个主要好处。最明显的,可以节省大量的时间,因为你不必从零开始实现一项功能。还有一个是同样重要的,如果你与阅读或者维护你代码的人使用相似的包,他们也将花更少的时间去做相应的工作。

记住,学习地道的Python代码的目的是写出清晰、易于维护、没有bug的代码。没有什么能够确保你的代码质量比Python内核开发者的代码更容易维护。随着标准库中dug的发现和修复,你的代码随着Python发行版本的而改善,而你,什么都不用做。

4.1.2 开始了解PyPI(the Python Package Index)

如果Python标准库中没有与你问题相关的包,PyPI大显身手的时候。截止到我写这个小册子,在这个索引中已经超过27,000个包。如果你想实现特定的任务,在PyPI找不到相关的包是不可能的。

这个索引包括所有可以搜索到的Python2和Python3包。当然,不是所有的包都是同时创建的,注意检查包的最后更新时间。包的文档托管在像ReadTheDocs的外部网站是一个不错的选择,GitHub上的资源也是不错的。

现在你发现了一个看起来很不错的包,怎么安装呢?最流行的管理第三方包的工具是pip。一个简单的命令pip 将下载最新版本的包,并且安装在你自己的site-package目录。如果你需要最新但可能不是很稳定的版本,pip也可以直接从git或者mercurial安装。

如果你创建了一个包,很有用,强烈建议通过发布它到PyPI的方式交给Python社区。这是举手之劳,但是未来有些开发者会很感谢你的。

4.2 模块注释

4.2.1 学习itertools模块的内容

如果你经常浏览StackOverFlow,你也许会注意到像这种形式问题“Why doesn’t Python have the following obviously useful library function?”的答案,几乎总是引用itertools 模块。这个函数式编程的中坚分子,itertools提供了被认为是最基础的模块。此外,itertools的文档有一个Recipes部分,提供了函数式编程结构的地道实现,所有的创建都使用itertools模块。总的来说,由于一些原因,几乎没有Python开发者注意到Recipes部分和itertools模块。写风格良好的代码的一部分是要知道什么时候应该重新发明一个轮子。

4.2.2 使用os.path模块中的函数处理目录路径

当写一些简单的命令行脚本,新手python程序员经常用处理字符串的费劲的手段来处理文件路径。Python有整个转门用来处理路径名字的模块:os.path。使用os.path可以减少常见错误的风险,使你的代码更简洁,更容易理解。

4.2.2.1 糟糕的代码

from datetime import date import os filename_to_archive = 'test.txt' new_filename = 'test.bak' target_directory = './archives' today = date.today() os.mkdir('./archives/' + str(today)) os.rename(     filename_to_archive,     target_directory + '/' + str(today) + '/' + new_filename)     today) + '/' + new_filename)

4.2.2.2 地道的表达

from datetime import date import os current_directory = os.getcwd() filename_to_archive = 'test.txt' new_filename = os.path.splitext(filename_to_archive)[0] + '.bak' target_directory = os.path.join(current_directory, 'archives') today = date.today() new_path = os.path.join(target_directory, str(today)) if (os.path.isdir(target_directory)):     if not os.path.exists(new_path):         os.mkdir(new_path)     os.rename(         os.path.join(current_directory, filename_to_archive),         os.path.join(new_path, new_filename))
原创粉丝点击