从A到Z,26个实用Python模块/函数速览

2018-11-01    来源:raincent

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

Python是世界上最受欢迎的按需编程语言之一,因为:

♦  它容易学习
♦  它用途广泛
♦  它有一大堆模块和库

作为一名数据科学家,使用Python称得上是我的家常便饭。一路走来,现在我已经搜集了不少有用的小技巧,是时候该把它们分享给大家了!

在这里,我会用从字母A开始,到Z结束,简单介绍一些常用技巧。它们大多是我在日常工作中偶然发现的,部分来自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

一个命令搞定没有GUI情况下的数据可视化。

collections

Python拥有一些内置的数据类型,但有时它们并不符合我们的需求。幸运的是,Python标准库有一个collections模块,它在str, int, list, tuple, set, dict等数据类型的基础上提供了额外的数据类型。

from collections import OrderedDict, Counter
# 记住添加key的顺序!
x = OrderedDict(a=1, b=2, c=3)
# 计算每个字符的频率
y = Counter("Hello World!")

dir

在Python中,我们该怎么查看对象及其属性?答案是使用dir()函数。

>>> dir()
>>> dir("Hello World")
>>> dir(dir)

当你正以交互方式运行Python,并动态探索正在使用的对象的模块时,这会是一个非常有用的函数。

emoji

是的,没有表情包的代码有什么灵魂?

from emoji import emojize
print(emojize(":thumbs_up:"))

from__future__ import

Python的更新迭代比较频繁,它的每个新版本都会增加一些新的功能,或是对旧版本做一些调整,修改某些bug——这意味着有些改动是不兼容旧版本的。

为了让以前能正常运行的代码在新版本中也能用,我们可以调用Python的__future__模块,把新版本的特性导入到当前版本。

from __future__ import
print_functionprint("Hello World!")

geopy

对于程序员来说,地理位置可能是一个颇具挑战的领域,但geopy模块可以让整个过程变得非常简单。

$ pip install geopy

它提供一系列不同地理编码服务的API,能让你轻松获得全球某个地区的国家、城市、完整街道地址、纬度、经度甚至海拔信息。

它还包含一个有用的距离类,能测量两个位置之间的距离。

from geopy import GoogleV3
place = "221b Baker Street, London"
location = GoogleV3().geocode(place)
print(location.address)
print(location.location)

howdoi

有时候,你可能刚看过某个问题的解决办法,但一上手又全忘了。在这种情况下,如果你既不想离开终端,又想上StackOverflow去查,该怎么办?

你只需这个命令行工具:

$ pip install howdoi

无论你有什么问题,它都会尽力回答。

$ howdoi vertical align css
$ howdoi for loop in java
$ howdoi undo commits in git

需要注意的是,虽然它的答案是StackOverflow置顶答案的删减版,但这并不意味着它就百分百有用。

$ howdoi exit vim

inspect

Python的inspect模块可以检查模块的一些基本信息,它主要有4个用处:类型检查、获取源码、获取类或函数的参数的信息、解析堆栈。

下面是用inspect.getsource()打印源码的一个示例,它还能用inspect.getmodule()打印自定义模块。

import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)

除了以上用途,检查模块有助于我们更好地理解代码,编写可维护代码。

Jedi

Jedi是一个自动完成/静态分析库,它能使代码编写速度更快、效率更高。

如果你不是IDE开发人员,你可能只是想把Jedi用作浏览器插件或在shell中使用。这是做得到的,详情可以阅读这篇介绍。

**kwargs

无论你学习的是什么编程语言,你都会遇到那么几个很难理解的知识点。在Python中,**kwargs语法算得上是其中的一个。

字典对象前面的双星号允许你将该字典的内容作为命名参数传递给函数,字典的键是参数名称,值是传递给函数的值。

dictionary = {"a": 1, "b": 2}def someFunction(a, b): print(a + b) return# 这样做效果同上someFunction(**dictionary)someFunction(a=1, b=2)

当你想要编写可以处理未预先定义的命名参数的函数时,这个模块很有用。

List comprehensions

列表解析式相信是很多人喜欢Python的一个理由。这些表达式可以很容易地编写非常干净的代码,几乎就像自然语言。

dictionary = {"a": 1, "b": 2}
def someFunction(a, b):
print(a + b)
return
# 这样做效果同上
someFunction(**dictionary)
someFunction(a=1, b=2)

map

Python通过许多内置功能支持函数式编程。其中最有用的是map()函数——尤其是和lambda函数结合使用。

x = [1, 2, 3]
y = map(lambda x : x + 1 , x)
# 打印出[2,3,4]
print(list(y))

在上面的示例中,map()将简单的lambda函数应用于每个元素x。它返回一个map对象,可以将其转换为某个可迭代对象,例如list或tuple。

newspaper3k

如果你之前从没听说过newspaper3k,那这个模块可能会让你的眼前一亮。

这是一个用于文章提取的库,它允许你从大量国际出版物中检索新闻文章和相关的元数据,如图像、文本和作者姓名。它甚至还有一些内置的NLP函数。

Operator overloading

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)
# True
something > nothing
# False
something < nothing
# Error
something + nothing

pprint

Python的pprint模块提供了可以按照某个格式正确的显示python已知类型数据的一种方法,这种格式可被解析器解析,又很易读,称得上是Python开发人员必备方法。

import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)

Queue

Queue模块是Python中提供队列操作的模块,它为支持多线程操作提供了诸多便利。

这个结构的规则是“先进先出”。其中,“先进先出”(FIFO)意味着队列允许我们按照添加顺序检索对象。“后进先出”(LIFO)则允许我们访问最新添加的对象。而PriorityQueue是看优先级队列级别,谁更低,谁先出来。

__repr__

在Python中定义类或对象时,提供一种将该对象表示为字符串的“正规”方法会很有用。比如:

>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>

这有利于更便捷地debug。如果你要把它放进定义的类:

class someClass:
def __repr__(self):
return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)

 

sh

Python是一种很棒的脚本语言,但是如果无论写什么脚本都要用它的标准os和子进程库,这就太不自由了。

sh是一个成熟的Python子进程接口,允许你像调用函数一样调用任何程序。

from sh import *
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')

Type hints

Python是一种动态类语言:定义变量、函数、类等时,我们不需要指定数据类型。

虽然这种做法大大缩短了开发用时,但是一旦写了那么多代码,我们难免会忘记每个类型具体是什么,这时,如果我们再回头仔细阅读,就太麻烦了。

从Python 3.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)

虽然不是强制性的,但类型注释可以让你的代码更容易理解。此外,它还允许我们在运行类型检查工具是捕获那些杂散的TypeErrors,这对于大型复杂项目开发是个帮助。

UUID

生成通用唯一标识符(UUID)最方便的做法是通过Python标准库的uuid模块。它生成重复ID的概率非常低,不到十亿分之一。

import uuid
user_id = uuid.uuid4()
print(user_id)

上述代码会创建一个随机的128位数字,它几乎肯定是唯一的。事实上,我们可以用它生成超过2122个可能的UUID,感受一下这个数量:5,000,000,000,000,000,000,000,000,000,000,000,000,000。

Virtual environments

通常情况下,我们会用一个版本的Python处理多个项目,但有时不同项目,甚至一个项目都会用到不同版本的python、不同的包,我们该怎么办呢?

Python对虚拟环境的支持可以帮我们解决这个问题:

python -m venv my-project
source my-project/bin/activate
pip install all-the-modules

wikipedia

我们可以通过维基百科的API以编程方式访问大量免费知识,非常方便。

import wikipedia
result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
print(link)

和真实网站一样,该模块提供对多种语言的支持、消歧义页、随机页面检索,甚至还有donate()捐款。

xkcd

Python这么流行,幽默元素自然必不可少,毕竟它的名字来自英国超现实幽默表演团体Monty Python(巨蟒剧团)。它的大部分官方文档都隐藏着这个彩蛋。

输入:

import antigravity

你会看到:

 

 

地面:你上天了!咋做到的?

天上:Python!

天上:我昨晚学会了Python!太简单啦!—— 只要写print "Hello World!"就能输出Hello World!

地面:喵喵喵?动态类型?泛空格符?

天上:加入我们吧!编程又成了乐事!这里是个全新的世界!

地面:那你是咋上去的呀?

天上:我只是写了import antigravity……

地面:就这?

天上:然后为了做对比,我又把药柜里的药全嗑了。但是我觉得还是Python让我“升天”。

YAML

YAML全称YAML Is Not Markup Language,它是一种数据格式化语言,非常简洁和强大。

YAML被很多人认为是可以超越的xml和JSON的文件格式。对比XML,除了拥有XML的众多优点外,它足够简单,易于使用。而对于JSON,YAML可以写成规范化的配置文件。

安装yaml模块:

$ pip install pyyaml

导入到项目中:

import yaml

PyYAML允许你存储任何数据类型的Python对象,以及任何用户定义类的实例。

zip

在Python中,zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。(在Python 3.x中,为了减少内存,zip()返回的是一个对象)

谢谢阅读!

原文地址:medium.freecodecamp.org/an-a-z-of-useful-python-tricks-b467524ee747

标签: Google 代码 脚本

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:大数据预测打车费用的方法论:数据分析和机器学习,一个没落下!

下一篇:城市规划师的新征程:用数据思维唤醒城市的智商与情商