有用的Python技巧A-Z

有用的Python技巧A-Z

照片:Almos Bechtold on Unsplash Python是世界上最流行、最需要的编程语言之一。这有很多原因。

它很容易学习 它具有超强的通用性 它有大量的模块和库 我每天都在使用Python,这是我作为一个数据科学家工作的一个组成部分。在这一过程中,我掌握了一些有用的技巧和提示。

在这里,我试图以A-Z格式分享其中一些。

这些 "技巧 "中的大多数是我在日常工作中使用或偶然发现的东西。有些是我在浏览 Python 标准库文档时发现的。还有一些是我通过PyPi搜索发现的。

然而,功不可没--我在awesome-python.com上发现了其中的四、五个。这是一个由数百个有趣的Python工具和模块组成的策划列表。它值得浏览以获得灵感

所有或任何 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")

你想在控制台中绘制图形?

$ pip install bashplotlib

你可以在控制台中拥有图形。

收藏 Python 有一些很好的默认数据类型,但有时它们的行为并不完全符合你的意愿。

幸运的是,Python标准库提供了集合模块。这个方便的附加模块为你提供了进一步的数据类型。

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 时,这可能是一个非常有用的功能,而且可以动态地探索你正在工作的对象和模块。

在这里阅读更多信息。

表情符号 是的,真的。


$ pip install emoji
不要假装你不打算尝试它......

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

👍

from future import Python 流行的一个结果是,总是有新的版本在开发。新的版本意味着新的功能--除非你的版本已经过期。

不过,不用担心。__future__ 模块让你从 Python 的未来版本中导入功能。这简直就像时间旅行,或者魔法,或者别的什么。


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

为什么不尝试一下导入大括号呢?

地理学 对于程序员来说,地理可能是一个具有挑战性的地形(哈,一个双关语!)。但geopy模块让它变得简单得令人不安。


$ pip install geopy

它通过抽象一系列不同的地理编码服务的API而工作。它使你能够获得一个地方的完整街道地址、纬度、经度,甚至海拔高度。

还有一个有用的距离类。它以你喜欢的测量单位计算两个地点之间的距离。

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

如何做 被一个编码问题困住了,又想不起之前看到的那个解决方案?需要查看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 模块对于了解幕后发生的事情非常有用。你甚至可以在自己身上调用它的方法!

下面的代码示例使用 inspect.getource() 打印自己的源代码。它还使用 inspect.getmodule() 来打印它所定义的模块。

最后一行代码会打印出它自己的行号。

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

当然,除了这些琐碎的用途外,事实证明 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
# these do the same thing:
someFunction(**dictionary)
someFunction(a=1, b=2)

这些做的是同样的事情。

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

在上面的例子中,map()对x中的每个元素都应用了一个简单的lambda函数,它返回一个map对象,这个对象可以被转换为一些可迭代的对象,例如list或者tuple。

newspaper3k 如果你还没有看到它,那么请准备好让你的头脑被 Python 的报纸模块所震撼。

它让你从一系列领先的国际出版物中检索新闻文章和相关的元数据。你可以检索图片、文本和作者姓名。

它甚至有一些内置的NLP功能。

因此,如果你想在你的下一个项目中使用BeautifulSoup或其他一些DIY网络抓取库,请为自己节省时间和精力,用$ pip安装newspaper3k代替。

操作符重载 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 的默认打印函数完成了它的工作。但是试着打印出任何大的、嵌套的对象,其结果是相当难看的。

这就是标准库的 pretty-print 模块介入的地方。它以一种易于阅读的格式打印出复杂的结构化对象。

对于任何使用非琐碎数据结构的 Python 开发者来说,这是一个必备的工具。

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

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

这个模块让你实现队列数据结构。这些数据结构可以让你根据特定的规则来添加和检索条目。

先入先出"(或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)
someInstance = someClass()

打印<这里的一些描述>。 print(someInstance)

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 产生通用唯一标识(或称 "UUIDs")的一个快速而简单的方法是通过 Python 标准库的 uuid 模块。

输入uuid

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

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

事实上,有超过2¹²个可能的UUID可以被生成。这是超过5个十亿(或5,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版本和安装。已排序!

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

wikipedia模块使访问这个API变得几乎令人尴尬地方便。

输入维基百科

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

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

xkcd 幽默是Python语言的一个主要特征--毕竟,它是以英国喜剧小品节目Monty Python's Flying Circus命名的。Python的许多官方文档都引用了该节目最著名的小品。

不过,这种幽默感并不局限于文档中。试着运行一下下面这一行。

import antigravity

import antigravity 永不改变,Python永不改变。

YAML YAML 是 "YAML Ain't Markup Language "的缩写。它是一种数据格式化语言,是JSON的一个超集。

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

PyYAML模块让你在Python中使用YAML。用以下方式安装。


$ pip install pyyaml

然后导入到你的项目中。

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

压缩 最后一个技巧,它真的是一个很酷的技巧。是否需要从两个列表中形成一个字典?

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

你也可以通过调用*zip()来 "解压 "对象。

谢谢你的阅读! 所以你已经有了,一个Python技巧的A-Z--希望你已经为你的下一个项目找到了有用的东西。

Python 是一种非常多样化和完善的语言,所以肯定会有很多我没有包括的功能。

请在下面留言,分享你自己喜欢的Python技巧。

本文由 mdnice 多平台发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值