一份超级实用的 Python ”技巧“清单结!

Python是世界上最受欢迎,最流行的编程语言之一。这有很多原因:

  • 它很容易学习
  • 它是超级多用途的
  • 它有大量的模块和库

作为数据科学家的我,每天使用Python是我内在工作的一部分。在这个过程中,我学会了一些有用的技巧和心得。

在这里,我尝试以A~Z顺序共享其中一些。

学习Python中的小伙伴,需要学习资料的话,可以到我的微信公众号:Python学习知识圈,后台回复:“01”,即可拿Python学习资料

大多数这些“技巧”是我在日常工作中使用或偶然发现的事情。一些是我在浏览Python标准库文档时发现的。另外一些是通过PyPi搜索到的。

但是,应该归功于它 - 我在http://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

您可以在控制台中显示图表。

collections

Python有一些很棒的默认数据类型,但有时候它们的行为并不像你想要的那样。

幸运的是,Python标准库提供了集合模块。这个方便的附加组件为您提供了更多的数据类型。

from collections import OrderedDict, Counter
# Remembers the order the keys are added!
x = OrderedDict(a=1, b=2, c=3)
# Counts the frequency of each character
y = Counter("Hello World!")

DIR

曾经想知道如何查看Python对象并查看它具有哪些属性?你当然有。

从命令行:

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

当以交互方式运行Python以及动态浏览您正在使用的对象和模块时,这可能是一个非常有用的功能。

$ pip install emoji
from emoji import emojize
print(emojize(":thumbs_up:"))

from future import

Python受欢迎的一个后果是一直有新的版本在开发中。新版本意味着新功能 - 除非您的版本已过时。

但是,不要害怕。该f="https://link.juejin.im/?target=https%3A%2F%2Flink.zhihu.com%2F%3Ftarget%3Dhttps%253A%2F%2Fdocs.python.org%2F2%2Flibrary%2F__future__.html">future模块,让您可以用Python导入未来版本的功能。它实际上就像时间旅行,魔术或其他东西。

from __future__ import print_function
print("Hello World!")

为什么不去导入花括号

geopy

对于程序员来说,地理位置可能是一个具有挑战性的领域(ha,a pun!)。但是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 java in java 
$ howdoi undo commits in git

请注意 - 它从StackOverflow的顶级答案中删除代码。它可能并不总能提供最有用的信息......

$ howdoi退出vim

inspect 检查

Python的检查模块非常适合理解幕后发生的事情。你甚至可以自己调用它的方法!

下面的代码示例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用作编辑器插件。幸运的是,已经可用了!

但是,您可能已经在使用Jedi了。IPython项目利用Jedi实现其代码自动完成功能。

** kwargs

学习任何语言时,沿途都有许多里程碑。使用Python,理解神秘的**kwargs语法可能算作一个。

字典对象前面的双星号允许您将该字典的内容作为命名参数传递给函数

字典的键是参数名称,值是传递给函数的值。你甚至不需要叫它kwargs!

dictionary = {"a": 1, "b": 2}
def someFunction(a, b):
    print(a + b)
    return
# these do the same thing:
someFunction(**dictionary)
someFunction(a=1, b=2)

当您想要编写可以处理未事先定义的命名参数的函数时,这非常有用。

List comprehensions

我最喜欢用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)
# prints out [2,3,4]
print(list(y))

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

newspaper3k

如果你还没有看过它,那么请准备好让你的思绪被Python的报纸模块所震撼

它允许您从一系列领先的国际出版物中检索新闻文章和相关的元数据。您可以检索图像,文本和作者姓名。

它甚至还有一些内置的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)
# True
something > nothing
# False
something < nothing
# Error
something + nothing

pprint

Python的默认print函数可以完成它的工作。但是尝试打印出任何大的嵌套对象,结果相当丑陋。

这是标准库的漂亮打印模块(Standard Library’s pretty-print module)的用武之地。它以易于阅读的格式打印出复杂的结构化对象。

任何使用非常规数据结构的Python开发人员必备的。

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

Queue 队列

Python支持多线程,标准库的队列模块为此提供了便利。

此模块允许您实现队列数据结构。这些是允许您根据特定规则添加和检索条目的数据结构。

'先进先出'(或FIFO)队列允许您按照添加的顺序检索对象。“后进先出”(LIFO)队列允许您首先访问最近添加的对象。

最后,优先级队列允许您根据对象的排序顺序检索对象。

这是一个如何在Python中使用队列进行多线程编程的示例

repr

在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()
# prints <some description here>
print(someInstance)

SH

Python是一种很棒的脚本语言。有时使用标准的操作系统和子进程库可能会让人头疼。

SH库提供了一个整洁的替代品。

它允许您调用任何程序,就像它是一个普通函数一样 - 对于自动化工作流和任务非常有用,所有这些都来自Python。

import sh
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

生成通用唯一ID(或“UUID”)的快捷方法是通过Python标准库的uuid模块

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

这会创建一个随机的128位数字,几乎肯定是唯一的。

实际上,可以生成超过2 12 2个可能的UUID。这超过五亿十亿(或5,000,000,000,000,000,000,000,000,000,000,000,000,000)。

在给定集合中找到重复的概率非常低。即使有万亿UUID,重复存在的可能性也远远低于十亿分之一。

两行代码相当不错。

Virtual environments

这可能是我最喜欢的Python的地方。

您有可能在任何时候都在处理多个Python项目。不幸的是,有时两个项目将依赖于同一依赖项的不同版本。你在系统上安装了哪些?

幸运的是,Python 对虚拟环境支持让您拥有两全其美的优势。从命令行:

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

现在,您可以在同一台计算机上运行独立版本和Python安装。

wikipedia 维基百科

维基百科有一个很棒的API,允许用户以编程方式访问无与伦比的完全免费的知识和信息。

维基百科模块,使访问该API几乎令人意想不到的方便。

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

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

XKCD

幽默是Python语言的一个关键特征 - 毕竟,它是以英国喜剧素描Monty Python的飞行马戏团命名。Python的大部分官方文档都引用了该剧最着名的草图。

但幽默感并不局限于文档。请按以下方式运行:

import antigravity

永远不要改变,Python。从不改变。

YAML

YAML代表' YAML Is Not Markup Language '。它是一种数据格式化语言,是JSON的超集。

与JSON不同,它可以存储更复杂的对象并引用它自己的元素。您还可以编写注释,使其特别适合编写配置文件。

PyYAML模块可让您使用YAML使用Python。安装:

$ pip install pyyaml

然后导入到您的项目中:

import yaml

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

zip 压缩

技巧的最后一招,真的很酷。曾经需要从两个列表中形成字典吗?

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

zip()内置函数需要一系列可迭代的对象,并返回一个元组列表。每个元组按位置索引对输入对象的元素进行分组。

您也可以通过调用*zip()它们来“解压缩”对象。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容