Python 是世界上最流行的编程语言之一.
这有许多原因:
容易学习
可跨平台
拥有大量的模块和库
我把使用 Python 作为数据科学家日常工作的一部分. 一路上, 我学会了一些有用的技巧和要点.
在这里, 我尝试以 A - Z 格式分享其中的一些. 这些 "技巧" 大部分是我在日常工作中使用或偶然发现的. 我在浏览 Python 标准库文档时发现了一些. 另一些是我在搜索 PyPi 时发现的.
然而, 值得称赞的是其中的四五个是我在 awesome-python.com 发现的. 这是数百个有趣的 Python 工具和模块的精选列表. 值得浏览寻找灵感!
all or any
python 之所以如此受欢迎的原因之一是因为它可读性和表现力强. 人们经常开玩笑说 Python 是 "可执行伪代码". 但是, 当你可以编写这样的代码时, 很难用其他方式反驳:
bashplotlib
你想在控制台中绘制图表吗?
你就可以在控制台中画出图表了.
collections
python 有一些很好的默认数据类型, 但有时它们表现的不如你期望的哪样. 幸运的是, Python 标准库提供了 collections 模块. 这个方便的附加组件为您提供了更多的数据类型.
dir
你有没有想过如何在 Python 对象内部查看它的属性? 这当然可以. 看看下面这条命令行:
当以交互方式运行 Python 时, 这可能是一个非常有用的功能, 可以动态地查看您正在使用的对象和模块.
emoji
是的, 这是真的!
不要假装你不想去尝试......
from __future__ import
Python 的流行导致是总是有新版本在开发中. 新版本意味着新功能 -- 除非你的版本已经过时.
然而, 不要害怕.__future__模块允许你从 Python 的未来的版本导入功能. 这简直就像时间旅行, 或者魔法什么的.
为什么不开始导入花括号?
geopy
地理可能是程序员难以挑战的领域, 时常让人找不清方向. 但是 geopy 模块让这变得异常简单.
它通过抽取一系列不同的地理编码服务 APIs 来工作. 使你能够获得一个地方的完整街道地址, 纬度, 经度和海拔. 还有一个有用的 distance 类. 以你喜欢的单位计算两个位置之间的距离.
howdoi
遇到编码问题, 但不记得你以前见过的解决方案了? 需要检索 Stack Overflow, 但不想离开终端?
那么你需要这个有用的命令行工具.
无论你有什么问题, 都要问它, 它会尽最大努力回答你的问题
但是请注意 -- 它从 Stack Overflow 的置顶答案中抓取代码. 因此可能不总是提供最有用的信息...
inspect
python 的 inspect 模块非常有助于理解幕后发生的事情. 你甚至可以用它调用它自己的方法!
下面的代码示例使用 inspect.getsource 输出它自己的源代码. 它还使用 inspect.getmodule 输出由它定义的模块.
最后一行代码打印出自己的行号.
当然, 除了这些琐碎的用途之外, inspect 模块对于理解代码正在做什么可能会很有用. 你也可以用它来编写自我记录的代码.
Jedi
Jedi 库是一个自动补全和代码分析库. 它使编写代码更快, 更有成效.
除非你正在开发自己的 IDE, 否则你可能会对使用 Jedi 作为编辑器插件最感兴趣. 幸运的是, 这已经成为现实了! 然而, 你可能已经在使用 Jedi.IPython 项目正利用 Jedi 的代码自动补全功能.
**kwargs
学习任何语言时, 都会有许多里程碑. 对于 Python 来说, 理解神秘的 **kwargs 语法可能算一个.
字典对象前面的双星号允许您将该字典的内容作为命名参数传递给函数.
字典的键是参数名, 值是传递给函数的值. 你甚至不需要用 kwargs 命名字典!,
当您想要编写能够处理事先未定义的命名参数的函数时, 这很有用.
List comprehensions
关于 Python 编程, 我最喜欢的事情之一是它的列表生成.
这些表达式使得容易编写非常干净的代码, 读起来几乎像自然语言.
你可以在这里阅读更多关于如何使用它们的信息.
map
python 通过许多内置特性支持功能编程. map 函数是最有用的函数之一 -- 特别是与 lambda 函数结合使用.
在上面的例子中, map 将一个简单的 lambda 函数应用于 x 中的每个元素. 它返回一个 map 对象, 该对象可以转换为一些可迭代的对象, 如列表或元组.
newspaper3k
如果你还没有见过它, 那么准备好让 Python 的 newspaper3k 模块震撼你.
它允许你从一系列领先的国际出版物中检索新闻文章和相关元数据. 您可以检索图像, 文本和作者姓名.
它甚至有一些内置的 NLP 功能.
因此, 如果你想在下一个项目中使用 BeautifulSoup 或其他自制的网页爬虫库, 那么省下你的时间和精力, 用
代替.
Operator overloading
python 为运算符重载提供了支持, 这是一个让你听起来像个合法的计算机科学家的术语.
这实际上是一个简单的概念. 有没有想过 python 为什么允许你使用 "+" 运算符来相加数字以及连接字符串? 这就是运算符重载.
你可以用特殊的方法定义使用 Python 标准运算符符号的对象. 这允许你在与你正在处理的对象相关的上下文中使用它们
pprint
python 的默认 print 函数的确可以完成它的工作. 但是尝试输出出任何大的嵌套对象时, 结果会很难看.
这里有 pretty-print 标准库. 可以以易于阅读的格式输出出复杂的结构化对象.
对于任何处理 non-trivial 数据类型的 Python 开发人员来说都是必不可少的.
queue
python 支持多线程, 标准库的 queue 模块有助于实现这一点.
此模块允许你实现队列数据结构. 这些数据结构允许您根据特定规则添加和检索条目.
先进先出 (FIFO) 队列允许你按对象添加的顺序检索对象. 后进先出 (LIFO) 队列允许你先访问最近添加的对象.
最后, 优先级队列允许你根据对象的排序顺序检索对象.
这里有如何在 Python 中使用队列进行多线程编程的示例.
__repr__
在 Python 中定义类或对象时, 提供一种很有用的官方支持的方式将对象呈现为字符串. 例如:
这使得调试代码更加容易. 可以添加到你的类定义中, 如下所示:
sh
python 是一种很棒的脚本语言. 有时使用标准的 os 和 sbprocess 库会有点令人头疼.
sh 库提供了一个简洁的替代方案.
它允许你调用任何程序, 就好像它是一个普通的函数一样 -- 对于自动化工作流和任务非常有用, 所有这些都可以用 Python 完成.
Type hints
Python 是一种动态类型语言. 定义变量, 函数, 类等时, 不需要指定数据类型.
这有助于缩短开发时间. 然而, 没有什么比简单的类型问题导致的运行错误更令人讨厌的了.
自 Python 3.5 以来, 你可以选择在定义函数时提供类型提示.
你也可以定义类型别名:
虽然这不是强制性的, 但是类型注释可以让你的代码更容易被理解.
它们还允许你在运行之前使用类型检查工具来捕获这些杂散的类型错误. 如果你正在进行大型复杂的项目, 这很值得的使用!
uuid
生成通用唯一标识 (UUID) 的一种快速简单的方法是使用 Python 标准库的 UUID 模块.
这可以产生一个随机的 128 位数字, 几乎可以肯定这个数字是唯一的.
事实上, 可以生成超过 2112 个可能的 UUID. 超过 5x1036(或 5,000,000,000,000,000,000,000,000,000,000,000,000).
在给定的集合中找到重复的概率非常低. 即使有万亿个 UUID, 重复存在的概率也远低于十亿分之一. 非常有用的两行代码.
Virtual environments
这可能是我最喜欢的关于 Python 的东西.
你很可能在同一时间处理多个 Python 项目. 不幸的是, 有时两个项目将依赖于同一依赖关系的不同版本. 你选择在你的系统上安装什么?
幸运的是, Python 对虚拟环境的支持让你可以兼顾两者. 在命令行中:
现在, 你可以在同一台机器上分别存在 Python 的独立版本和安装环境.
wikipedia
维基百科有一个很好的 API, 允许用户编程访问无与伦比的完全免费的知识和信息.
维基百科模块使得访问这个 API 变得非常方便.
像真实的网站一样, 该模块支持多语言, 页面消除歧义, 随机页面检索, 甚至还有一个 donate 方法.
xkcd
幽默是 Python 语言的一个重要特征 -- 毕竟, 它是以英国喜剧《巨蟒飞行马戏团》命名的.
Python 的许多官方文档都引用了该喜剧出名的独幕.
尽管如此, 幽默感并不局限于官方文档. 试试下面的代码:
永远不要改变, Python. 永不改变.
YAML
YAML 代表 "YAML Ain't Markup Language", 它是一种数据格式化语言, 是 JSON 的超集.
与 JSON 不同, 它可以存储更复杂的对象并引用自己的元素. 你也可以写注释, 使其特别适合于编写配置文件.
PyYAML 模块允许你将 YAML 与 Python 一起使用. 这样安装它:
然后导入到项目中:
PyYaML 允许你存储任何数据类型的 Python 对象, 以及任何用户定义类的实例.
zip
对你来说, 这是最后一招, 真的很酷. 曾经需要将两个列表合成一个字典?
zip 内置函数接受多个可重复对象, 并返回元组列表. 每个元组按位置索引对输入对象的元素进行分组.
您也可以通过对对象调用 * zip 来 "解压缩" 对象.
来源: http://developer.51cto.com/art/201811/587809.htm