本文为 AI 研习社编译的技术博客, 原标题 :
An A-Z of useful Python tricks
翻译 | 余杭, 李灏 校对 | 志豪 整理 | 志豪
https://medium.freecodecamp.org/an-a-z-of-useful-python-tricks-b467524ee747
Python 是这个世界上最受欢迎的按需编程语言之一. 其中包含很多原因:
易学习
应用范围广
具备非常多的模型和库
Python 是我作为数据科学家日常生活中不可或缺的一部分. 在学习 Python 的过程中, 我领悟到了很多的方法和技巧.
在这里, 我尝试用 A-Z 的格式来做一些分享.
大部分的技巧是我在日常工作中使用的或是偶然发现的. 其中一些是在浏览 Python Standard Library docs 找到的. 其他的一些是我在 PyPi 中搜索找到的.
但事实上, 还是应该归功于 awesome-python.com , 因为我在上面找到了四个或五个实用的技巧. 这是数百个有趣的 Python 工具和模块. 非常值得浏览以获取灵感.
all or any
Python 受欢迎的众多原因之一是它的可读性和易表达性.
人们经常笑称 Python 是可执行的伪代码. 但当你写出下述代码, 很难去反驳这种言论.
- x = [True, True, False] if any(x): print("At least one True") if all(x): print("Not one False") if any(x) and not all(x): print("At least one True and one False")
- bashplotlib
想在控制台中绘图吗?
$ pip install bashplotlib
使用上述命令行, 即可在控制台中绘图.
集合
Python 内置默认的数据类型, 但有时它们的使用效果会不尽如人意.
幸运的是, Python 的标准库提供了 collections 模块, 这个方便的附加库提供了更多的数据类型.
- from collections import OrderedDict, Counter x = OrderedDict(a=1, b=2, c=3) y = Counter("Hello World!")
- dir
你是否曾经有过深入 Python 对象内部并且观察它具备哪些属性的想法呢?
输入下述命令行:
>>> dir()>>> dir("Hello World")>>> dir(dir)
以交互式运行 Python 时, 这是一个非常实用的特征, 并且可以动态地搜索正在使用的对象和模块.
emoji
Python 包含 emoji 模块, 在这里!
$ pip install emoji
别以为我不知道你会偷偷下载...
- from emoji import emojize print(emojize(":thumbs_up:"))
- from _future_import
Python 流行的一个结果是新版本总是在开发中. 新版本意味着新功能 -- 除非版本已经过时
不过别担心._future_module 允许用户通过函数导入新版本 Python 的功能. 这就像是时间旅行, 或是奇异魔法之类......
from __future__ import print_function print("Hello World!")
为什么不导入花括号呢?
geopy
地理知识对于程序猿来说是非常大的挑战是, 但是 geopy 模块让它变得更简单.
$ pip install geopy
它通过提取不同的地理编码服务 API 进行工作, 以此能获取一个地方的完整街道地址, 经度, 纬度, 甚至是海拔高度.
geopy 还提供一个非常有用的距离类. 它支持用户喜欢的度量方式来计算两个地点之间的距离.
- from geopy import GoogleV3 place = "221b Baker Street, London" location = GoogleV3().geocode(place) print(location.address) print(location.location)
- howdoi
受困于编程问题并且不记得之前看到过的解决方法? 用户需要使用 Stack Overflow , 但是不想离开终端?
那么需要使用这个非常使用的命令行工具 howdoi
$ pip install howdoi
无论你有什么问题, 它都会帮你解答.
$ howdoi vertical align CSS $ howdoi for loop in java $ howdoi undo commits in Git
但是请注意, 它会从 Stack Overflow 的最高票答案中抓取代码, 这意味着它的回答并不总是最有用的.
- $ howdoi exit VIM
- inspect
Python 的 inspects 模块对于理解背后的原理是非常有帮助的. 用户甚至可以在 inspect 模块上调用其方法!
下述代码示例使用
inspect.getsource()
来打印它的源代码. 同时它也使用
inspect.getmodule()
来打印定义它的模块.
最后一行代码打印出自身的行号.
import inspect print(inspect.getsource(inspect.getsource)) print(inspect.getmodule(inspect.getmodule)) print(inspect.currentframe().f_lineno)
当然, 除了这些琐碎的用途之外 , inspect 模块还支持理解用户代码正在做什么. 用户还可以利用 Inspect 模块编写自文档化代码.
Jedi
Jedi 是一个自动完成以及代码分析库. 它使得编写代码更加快速以及更高产.
除非用户正在自主开发 IDE, 否则肯定会对使用 Jedi 作为编辑器插件非常感兴趣. 幸运的是, 已经开放下载.
用户可能已经在使用 Jedi. IPython 项目基于 Jedi 实现了代码自动完成功能.
**kwargs
在学习任何编程语言时, 一路上会遇到很多里程碑. 在学习 Python 时, 理解神秘的 **kwargs 是其中一块里程碑.
字典前面的双星号支持把字典的内容作为命名参数传递给函数.
字典的秘钥是参数名, 值是传递给函数的值, 用户甚至都不需要称它为 kwargs
dictionary = {"a": 1, "b": 2} def someFunction(a, b): print(a + b) return someFunction(**dictionary) someFunction(a=1, b=2)
当用户编写处理事先未定义的命名参数的函数时, 这个很有用.
列表解析
在 python 编程中其中一个我喜欢的东西是它的列表解析
这些表达式可以很容易的写出非常简洁的代码, 使其读起来就像自然语言一样
你可以了解更多关于如何使用它
- numbers = [1,2,3,4,5,6,7] evens = [x for x in numbers if x % 2 is 0] odds = [y for y in numbers if y not in evens] cities = ['London', 'Dublin', 'Oslo'] def visit(city): print("Welcome to"+city) for city in cities: visit(city)
- map
Python 通过许多内置功能支持函数式编程, 其中最有用的是 map()
特别是结合 lambda 函数使用时.
x = [1, 2, 3] y = map(lambda x : x + 1 , x) print(list(y))
在上面的例子中 map() 对 X 中的每个元素应用了简单的 lambda 函数
它返回一个 map object 类型, 可以被转换成一些可迭代对象, 例如列表或元组
n ewspaper3k
如果你之前没有见过 newspaper3k 的话, 那么请准备好被这个 Python 的 newspaper 模块所震撼吧
newspaper 模块允许你从一系列国际领先的出版物中检索新闻文章和相关的元数据. 你可以检索图像, 文本和作者姓名.
newspaper 模块甚至有一些内置的 NLP 功能.
因此, 如果你想在下一个项目中使用 BeautifulSoup 或其他 DIY 网页查询库, 节省自己的时间和精力, 并改为
- $ pip install newspaper3k
- Operator overloading
Python 支持操作符重载, 这术语让你听上去像是计算机科学家.
事实上这是个非常普通的概念. 是否曾经想过为什么 Python 支持使用 + 运算符来对数值进行相加以及连接字符串? 这就是实际的操作符重载.
用户可以按照自己特定的方式来定义使用 Python 标准运算符符号对象, 这使得用户可以在对象相关的上下文中使用它们.
- class Thing: def __init__(self, value): self.__value = value def __gt__(self, other): return self.__value> other.__value def __lt__(self, other): return self.__value <other.__value something = Thing(100) nothing = Thing(0) something> nothing something <nothing something + nothing
- pprint
Python 的默认函数 print 可以实现打印功能, 但是如果打印的嵌套对象体量比较大, 就会发现打印结果不太美观.
这时就需要用到标准库 pretty-print 模块. 它能用可读性强的方式打印出复杂结构的对象.
Python 开发者的必备技能之一是处理复杂的数据结构.
- import requests import pprint url = 'https://randomuser.me/api/?results=1' users = requests.get(url).JSON() pprint.pprint(users)
- Queue
Python 支持多线程, 这可以通过标准库的 Queue 模块来实现. Queue 模块让用户可以实现队列数据结构, 该数据结构允许用户通过特定的方法添加和检索数据.
"First in ,first out"(或 FIFO) 队列数据结构允许用户依据对象添加的顺序检索对象,"Last in,first out"(LIFO)数据结构允许用户先连接到最近添加的对象.
最后, 优先队列允许用户依据存储顺序检索对象.
这是 Python 中针对多线程编程使用 queues 的一个实例.
_rep r_
在 Python 中定义类或对象时, 提供一种字符串表示对象的 "官方" 方法很实用. 举个例子:
>>> file = open('file.txt', 'r')>>> print(file) <open file 'file.txt', mode 'r' at 0x10d30aaf0>
这让代码调试变得更加简单. 如下图所示添加类的定义:
- class someClass: def __repr__(self): return "<some description here>" someInstance = someClass() print(someInstance)
- Sh
Python 是一种很棒的脚本语言. 有时使用标准操作系统以及子进程库是很令人头疼的一个问题.
Sh 库提供了一种简介的替代方案.
它允许用户在调用程序时如同调用函数一般, 这对自动化工作流和任务非常有用. 所有的都来自 Python 内部.
from sh import * sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This is great!')
类型提示
Python 是动态语言, 在定义变量, 函数, 类别...... 时无需指定数据类型.
这个设定允许快速开发, 但是由于简单的类型错误比运行错误更烦人.
从 Python3.5 开始, 定义函数时用户可以选择开启类型提示.
def addTwo(x : Int) -> Int: return x + 2
用户也可以定义类型别名:
from typing import List Vector = List[float] Matrix = List[Vector] def addMatrix(a : Matrix, b : Matrix) -> Matrix: result = [] for i,row in enumerate(a): result_row =[] for j, col in enumerate(row): result_row += [a[i][j] + b[i][j]] result += [result_row] return result x = [[1.0, 0.0], [0.0, 1.0]] y = [[2.0, 1.0], [0.0, -2.0]] z = addMatrix(x, y)
尽管类型注释是非强制性的, 但是这能让代码更具可读性.
Python3.5+ 还允许用户使用类型提示工具在运行前知晓类型错误, 这在大型的复杂项目中是非常值得的.
uuid
生成通用唯一标识符的快速简便方法是 Python 标准库中的 uuid 模块.
import uuid user_id = uuid.uuid4() print(user_id)
它随机生成 128 位唯一数字.
事实上一共有 个可能生成的 UUID. 这个数值超过了
5,000,000,000,000,000,000,000,000,000,000,000,000,000.
在给定集合中找到重复数字的概率非常低. 即使有一万亿个 UUID, 重复存在的可能性也远远低于十亿分之一.
仅用两行代码即可生成通用唯一标志符, 非常棒!
虚拟环境
这是我最喜欢的 Python 部分.
用户可能需要同时处理多个 Python 项目. 不幸的是, 有时候两个项目依赖于相同依赖项的不同版本. 那么用户应该下载哪个版本的依赖库呢?
幸运的是, Python 支持虚拟环境, 让用户能够同时利用两种环境. 命令行如下:
python -m venv my-project source my-project/bin/activate pip install all-the-modules
现在一台机器上可以支持两个版本的 Python 了. 问题解决!
Wikipedia
Wikipedia 具备非常棒的 API , 允许用户以编程方式访问庞大的知识和信息.
Wikipedia 模块使得访问 Wikipedia API 非常地方便.
import wikipedia result = wikipedia.page('freeCodeCamp') print(result.summary) for link in result.links: print(link)
和真实的 Wikipedia 类似, 模块支持多种语言, 页面消歧, 随机页面检索, 甚至还有 donate()方法
Xkcd
Humour 是 Python 的关键特征 -- 毕竟它的名字来源于英国喜剧片《Monty Python 的飞行马戏团》,Python 的很多官方文档引用了该片的情节.
Python 的幽默感并不局限于官方文档 . 运行下述命令行:
import antigravity
希望 Python 不要改变它的幽默风格
YAML
YAML 't Markup Language. 它是一种数据格式语言, 是 JSON 的超集
与 JSON 不同的是, 它可以存储更复杂的对象并引用自己的元素. 用户可以编写注释, 使其适用于编写配置文件.
PyYAML 模块让用户在 Python 中使用 YAML . 安装命令行如下:
$ pip install pyyaml
然后导入到用户的项目中:
import YAML
PyYAML 允许您存储任何数据类型的 Python 对象, 以及任何用户定义类的实例.
Zip
最后的一个 Python 技巧, 它真的很棒. 还在用两个列表来组成字典这样的方法吗?
keys = ['a', 'b', 'c'] vals = [1, 2, 3] zipped = dict(zip(keys, vals))
Zip() 内置函数使用多个可迭代对象作为输入并返回元组列表. 每个元组列表依据位置索引对输入对象的元素进行分组.
用户也可以使用 *zip() 来解压对象
来源: http://www.tuicool.com/articles/3iQNjmb