作者 | Peter Gleeson
译者 | 婉清
编辑 | Jane
出品 | AI科技大本营
【导读】Python 虽然是脚本语言,但是因为其易学,迅速成为科学家的工具,从而积累了大量的工具库、架构,人工智能涉及大量的数据科学,用 Python 是很自然的事。磨刀不误砍柴工,要入门人工智能领域,就必须掌握 Python。让我们来看看 Peter Gleeson 整理的 26 个 Python 有用的技巧。
Python 是世界上最流行、最受欢迎的编程语言之一。原因有很多:
很容易学习;
支持的功能丰富;
有大量的模块和库。
作为一名数据科学家,我每天都使用 Python 进行工作。一路走来,我得到了一些有用的技巧和秘诀。
在本文中,我将按照首字母从 A~Z 的顺序分享其中一些内容。
这些技巧中的大多数是我在日常工作中使用的或者偶然发现的。其中有一些,是我在浏览 Python 标准库时发现的。另外还有一些是通过在 PyPi 中搜索得到的。
译注: PyPI(Python Package Index)是 Python 官方的第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到 PyPI。PyPI 推荐使用 pip 包管理器来下载第三方库。
https://docs.python.org/3/library/
https://pypi.org/search/
此外,有一家网站非常值得赞赏:Awesome Python,我在这上面发现了四五个技巧。这是一个非常值得浏览的精选列表,收录了数百个有趣的 Python 工具和模块,有助于激发你的灵感!
译注: Awesome Python 由 vinta 发起和维护。内容包括:Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。
中文版:
https://github.com/jobbole/awesome-python-cn
英文版:
https://awesome-python.com/
▌all 或 any
Python 如此受欢迎,原因之一是因为它具有可读性和可表达性。
人们经常开玩笑说 Python 是“可执行的伪代码”,但是当你可以这样编写代码时,你就很难反驳了。
1x = [True, True, False]
2if any(x):
3 print("At least one True")
4if all(x):
5 print("Not one False")
6if any(x) and not all(x):
7 print("At least one True and one False")
▌bashplotlib
你想在控制台(console)上绘制图形吗?
1$ pip install bashplotlib
这样你在控制台中就可以绘制图形了。
▌collections 模块
Python 有一些很好的默认数据类型,但有时它们的行为并不完全像你所期望的那样。
幸运的是,Python 标准库提供了 collections 模块,这个方便的附加组件提供了更多的数据类型。参阅:
https://docs.python.org/3/library/collections.html
▌dir
你是否知道如何查看 Python 对象并查看它都有哪些属性?使用命令行:
当你通过交互方式来运行 Python,并动态地探索你正在使用的对象和模块时,这一功能就非常有用了。要了解更多信息请访问:
https://docs.python.org/3/library/functions.html#dir
▌Emoji
如何打出 emoji 表情?参阅:
https://pypi.org/project/emoji/
不要跟我说你不会去尝试噢~
▌from __future__ import
Python 如此广受欢迎还有一个原因是它总是开发新版本。要知道,新版本意味着有新功能。但你不必害怕所用的版本过时了。这个__future__模块可以让你在现有版本上导入 Python 未来版本的功能。这一特征就好像时间旅行机一样,让未来的东西穿越到现在来使用。
为什么不去导入花括号呢?请参见 stackoverflow 上的问答:
https://stackoverflow.com/questions/17811855/syntax-error-not-a-chance
▌geopy 模块
对程序员来说,地理环境可能是一个具有挑战性的领域。但是,有了 geopy 模块,这一切就都变得简单了。参阅:
https://geopy.readthedocs.io/en/latest/
geopy 模块是通过抽象出一系列不同的地理编码服务的 API 来工作。它可以让你获得某一地点的完整街道地址、维度、精度甚至海拔高度。
还有一个有用的距离类。它可以使用你喜欢的测量单位来计算两个位置之间的距离。
▌howdoi
你有没有遇到过这样的困境:遇到编码的问题忘记了以前见过的解决方案,或者需要检查 StackOverflow,但又不想离开终端。
要摆脱这一困境,你需要这个有用的命令行工具——howdoi,参阅:
https://github.com/gleitz/howdoi
有了 howdoi,无论你问它什么问题,它都会尽力回答。
但有一点要注意的是:howdoi 是从 StackOverflow 的热门答案中抓取代码,它提供的信息可能不是最有用的。
译注: Stack Overflow 是一个与程序相关的 IT 技术问答网站。用户可以在网站免费提交问题,浏览问题,索引相关内容,在创建主页的时候使用简单的 HTML。在问题页面,不会弹出任何广告,销售信息,JavaScript 窗口等。 2008 年由 Jeff Atwood 和 Joel Spolsky 创建。
▌inspect 模块
PYthon 的 inspect 模块对于理解幕后发生的事情非常有用。你甚至可以自己调用它的方法!参阅:
https://docs.python.org/3/library/inspect.html
如下所示的代码段,使用了 inspect.getsource() 来打印自己的源代码。它还使用了 inspect.getsource() 来打印定义它的模块。
最后一行代码打印出自己的行号。
当然,除去这些简单的用途之外,inspect 模块对于理解代码的作用也非常有用。你也可以使用它来写自编文档代码。
▌Jedi
Jedi 库是一个自动完成和代码分析的库。它能够使编写代码更为快速、更为高效。
除非你正在开发自己的 IDE,否则你可能对使用 Jedi 作为编辑器插件最感兴趣。幸运的是,现在加载这个插件已经可以用了!不过,你可能已经用上Jedi 了。IPython 项目的代码自动完成功能就是使用Jedi来实现的。
https://jedi.readthedocs.io/en/latest/docs/usage.html
▌**kwargs
在学习任何语言的过程中,都会遇到许多里程碑。使用Python,理解神秘的 **kwargs 语法可能就是其中之一。
dictionary 对象前面的双星号允许您将该 dictionary 的内容作为命名参数传递给函数。详见:
https://docs.python.org/3/tutorial/controlflow.html#keyword-arguments
dictionary 的键是参数名,值是传递给函数的值。你甚至不需要叫它 kwargs!
当你想编写可以处理未预先定义的命名参数的函数时,这就非常有用了。
▌List Comprehensions
关于 Python 编程,我最喜欢的事情之一是它的列表生成式(List Comprehensions),参见:
https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
这些表达式可以很容易编写出简洁的代码,读起来几乎就像自然语言一样。你可以访问下面的网址来了解 List Comprehensions 应该要怎么使用:
https://www.learnpython.org/en/List_Comprehensions
▌map
Python 是通过许多内置功能支持函数式变成。其中最有用的函数之一是 map() 函数,特别是这个函数与 lambda 函数结合使用时。参阅:
https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions
在如上所示的代码段中,map() 对每个元素 x 都应用了一个简单的 lambda 函数。它返回一个 map 对象,这个对象可以转换为某些可迭代的对象,例如 listh 或 tuple。
▌newspaper3k 模块
如果你还没见过它,那你见到 Python 的 newspaper 模块可不要被它震撼到了。参阅:
https://pypi.org/project/newspaper3k/
这个模块可以让你从一系列领先的国际出版物中检索新闻文章和相关的元数据。你可以检索图像、文本和作者姓名。
它甚至内置了一些 NLP 功能
详见:
https://newspaper.readthedocs.io/en/latest/user_guide/quickstart.html#performing-nlp-on-an-article
如果你想为你的项目使用 BeautifulSoup 或其他一些自己打造的 webscraping 库,你可以用 $ pip install newspaper3k 为你节省时间和精力。
▌Operator overloading
Python 提供了对运算符重载的支持。
详见:
https://docs.python.org/3/reference/datamodel.html#special-method-names
其实这是一个简单的概念。有没有想过为什么 Python 允许使用 + 运算符来添加数字和连接字符串?这就是运算符重载的功劳。
你可以按照自己的特定方式定义使用 Python 标准运算符符号的对象。这样,你就可以在正在使用的对象相关的上下文中使用它们。
译注:运算符重载(operator overloading),简单地说,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
▌pprint
Python 的默认 print 函数可以完成打印作业。但是如果尝试让 Python 打印任何大型的嵌套对象,打印结果会非常难看。
这就要用到 Python 标准库中的 pretty-print 模块了。这个模块能够以易于阅读的格式打印出复杂的结构化对象。参阅:
https://docs.python.org/3/library/pprint.html
这个模块对于任何使用复杂数据结构的 Python 开发者来说都是必备的。
▌Queue
Python 支持多线程,可以通过标准库的 Queue 模块来实现。
这个模块可以让你实现队列数据结构。这些数据结构允许你根据特定规则添加和检索条目。
“先进先出”(FIFO)队列允许你按照添加对象的次序来检索对象。“后进先出”(LIFO)队列允许你首先访问最近添加的对象。
最后,优先级队列允许你根据对象的排序次序来检索对象。Python 使用队列进行多线程变成的示例可参见:
https://www.tutorialspoint.com/python3/python_multithreading.htm
▌__repr__
在 Python 中定义类或对象时,提供一种将该对象表示为字符串的“官方”方法是很有用的。例如:
这使得代码的调试变得更加容易。将其添加到你的类定义中,如下所示:
▌sh
Python 是一种很棒的脚本语言,但有时候使用标准的操作系统和子进程库会让人有点头疼。
sh 库提供了一个简洁的替代方法。
http://amoffat.github.io/sh
sh 库允许你像普通函数一样调用任何程序,这点对于自动化工作流和任务非常有用,所有这些都来自 Python 内部。
▌Type hints
Python 是一种动态类型的语言。在定义变量、函数、类等时,不需要指定数据类型。
这一特性让开发者能够快速开发项目。但是,很少有比简单的输入问题导致的运行时错误更烦人的事情了。
从 Python 3.5 开始,你就可以选择在定义函数时提供 type hintsl 。详见:
https://docs.python.org/3/library/typing.html
你可以这样定义类型别名:
虽然定义类型别名不是强制性的,但是类型注释可以让你的代码更容易理解。
它们还允许你使用类型检查工具在运行时之前捕获那些零散的 TypeErrors。如果你正在开发大型复杂的项目,那么这很可能是值得一试的!
▌uuid
通过 Python 标准库的 uuid 模块,可以快速简单地生成通用唯一 ID(或“uuid”)。详见:
https://docs.python.org/3/library/uuid.html
uuid 模块会创建一个随机的 128 位数字,几乎可以肯定是唯一的。
实际上,可以生成超过 2¹²² 个可能 UUID,这一数字超过了5,000,000,000,000,000,000,000,000,000,000,000,000(数字 5 后面有 36 个数字 0)。
在给定的集合中找到重复的概率非常低。即使有一万亿的 uuid,重复存在的概率也远远小于十亿分之一。
用两行代码就实现了,还是很不错的。
译注: uuid 是通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的uuid。在这样的情况下,就不需考虑数据库创建时的名称重复问题。
▌Virtual environments
这可能是 Python 中我最喜欢的部分了。
你有可能同时会处理多个 Python 项目。然而不幸的是,有时两个项目会依赖于相同依赖关系的不同版本。你在系统上都安装了哪些版本的依赖关系呢?
幸运的是,Python 对虚拟环境的支持,参见:
https://docs.python.org/3/tutorial/venv.html
可以让你充分这两个项目的优点。在命令行输入如下内容:
现在,你可以在同一台机器上安装、运行Python不同的独立版本。
▌wikipedia
Wikipedia 有一个很棒的 API,它允许用户通过编程方式访问无与伦比的、完全免费的知识和信息。
wikipedia 模块使访问这个 API 变得非常方便。
https://wikipedia.readthedocs.io/en/latest/quickstart.html
与真实网站一样,该模块支持多种语言、页面消歧、随机页面检索,甚至还有 donate() 方法。
译注: Wikipedia,是一个基于维基技术的多语言百科全书协作计划,用多种语言编写的网络百科全书。
▌xkcd
幽默是 Python 语言的一个重要特征——毕竟,它是以英国喜剧小品节目 Monty Python 的飞行马戏团命名的。Python 的许多官方文档都参考了该剧最著名的短剧。详见:
https://en.wikipedia.org/wiki/Monty_Python%27s_Flying_Circus
然而,这些幽默并不局限于文档,试一试下面的运行方式:
绝不改变,Python。永不改变。
▌YAML
YAML 代表的是“YAML Ain’t Markup Language”,它是一种数据格式化语言,是 JSON 的超集。详见:
http://yaml.org/
与 JSON 不同,它可以存储更复杂的对象并引用自己的元素。你还可以编写注释,使其特别适合于编写配置文件。
PyYAML 模块允许你在 Python 中使用 YAML。先安装 PyYAML:
然后导入到你的项目中:
PyYAML 允许你存储任何数据类型的 Python 对象,以及任何用户定义类的实例。
详见:
https://pyyaml.org/wiki/PyYAMLDocumentation
YAML 是一种简洁的非标记语言。YAML 以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。它是类似于标准通用标记语言的子集 XML 的数据描述语言,语法比 XML 简单很多。
▌zip
这是本文最后的一个技巧了,非常酷!你有没有过需要从两个列表中创建一个字典的想法呢?
zip() 内置函数接受许多可迭代对象并返回元组列表。每个元组根据对象的位置索引对其元素进行分组。
你还可以通过调用 *zip() 来“解压缩”对象。
原文链接:
https://medium.freecodecamp.org/an-a-z-of-useful-python-tricks-b467524ee747