一份从A-Z的Python技巧

最近在浏览学(huang)习(tu)文章的时候看到一篇不错的Python技巧文章,将其翻译成中文来记录学习一下。

原文链接地址:An A-Z of useful Python tricks

all or any

在进行可迭代对象逻辑判断的时候,使用all或者any将很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [1]: x = [True, True, False]

In [2]: if any(x):
...: print("At least one True")
...:
At least one True

In [3]: if all(x):
...: print("Not one False")
...:

In [4]: if any(x) and not all(x):
...: print("At least one True and one False")
...:
At least one True and one False

bashplotlib

如果你想在命令行绘制图形,可以使用这个库

1
pip install bashplotlib

使用参考文章: Python的命令行画图

collections

有时候默认的数据类型不能很好的满足我们的需求,我们可以使用collections模块提供的一些接口来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
In [5]: from collections import OrderedDict, Counter

# 创建一个有序字典
In [6]: x = OrderedDict(a=1, b=2, c=3)

In [7]: x
Out[7]: OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# 统计字符串每个字符出现的次数
In [8]: y = Counter("Hello World!")

In [9]: y
Out[9]:
Counter({' ': 1,
'!': 1,
'H': 1,
'W': 1,
'd': 1,
'e': 1,
'l': 3,
'o': 2,
'r': 1})

dir

如果我们想查看一个Python对象有哪些属性,可以使用dir

1
2
3
dir()
dir(“Hello World”)
dir(dir)

emoji

表情符号

1
pip install emoji

我们尝试一下

1
2
3
4
In [1]: from emoji import emojize

In [2]: print(emojize(":thumbs_up:"))
👍

from __future__ import

如果你的版本是比较旧的版本,而想使用新版本的特性,则可以使用__future__模块。

1
2
3
from __future__ import print_function
# 在Python2 的代码中使用带括号的打印
print("Hello World!")

geopy

使用geopy我们可以操作一些地理位置问题

1
pip install geopy

它的工作原理是抽象出一系列不同地理编码服务的API。它使您能够获得一个地方的完整街道地址,纬度,经度,甚至高度。

还有一个有用的距离类。它计算您喜欢的测量单位中两个位置之间的距离。

1
2
3
4
5
6
from geopy import GoogleV3

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

这里我一直报错,待后面实际用到细究。

参考阅读文章:geopy地理查询库使用详解

howdoi

遇到编码问题而忘记了之前看到过的解决方案?需要检查StackOverflow,但不想离开终端?

可以尝试下: howdoi

1
pip install howdoi

有什么问题,它会尽力回答

1
2
3
$ howdoi vertical align css 
$ howdoi for java in java
$ howdoi undo commits in git

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

inspect

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

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

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

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

1
2
3
4
import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe()。f_lineno

然,除了这些微不足道的用途之外,检查模块对于理解代码的作用非常有用。您也可以使用它来编写自我记录代码。

Jedi

Jedi库是一个自动完成和代码分析库。它使编写代码更快,更高效。

\kwargs**

这个想必大家都熟悉,用于参数传递。

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

字典的键是参数名称,值是传递给函数的值。甚至我们都可以不用使用kwargs命名。

1
2
3
4
5
6
7
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

列表生成式是作为掌握列表的必备技能。

1
2
3
4
5
6
7
8
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

这个函数内置函数,结合匿名函数很有方便性。

1
2
3
4
5
6
7
8
9
10
11
12
13
In [5]: x = [1, 2, 3]

In [6]: y = map(lambda x : x + 1 , x)

In [7]: print(type(y))
<class 'map'>

In [8]: print(list(y))
[2, 3, 4]

In [9]: for aa in y:
...: print(aa)
...:

返回的是一个 map 对象 可以将其转换为某个可迭代对象,例如list或tuple。使用一次之后将不再存在。

newspaper3k

没用过。。。

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

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

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

因此,如果你想在下一个项目中使用BeautifulSoup或其他DIY网页抓图库,那就省去时间和精力

$ pip install newspaper3k

Operator overloading

运算符重载就是我们之前说过的一些魔法函数的使用

Python提供了对运算符重载的支持,这是使你听起来像一个合法的计算机科学的术语之一。

这实际上是一个简单的概念。曾经想知道为什么Python允许你使用+运算符来添加数字以及连接字符串?这是运算符在执行中的重载。

您可以按照自己的特定方式定义使用Python标准运算符符号的对象。这使您可以在与您正在使用的对象相关的上下文中使用它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
In [14]: 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
...:

In [15]: something = Thing(100)

In [16]: nothing = Thing(0)

In [17]: something > nothing
Out[17]: True

In [18]: something < nothing
Out[18]: False

In [20]: something + nothing
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-20-6757f2c8ab70> in <module>()
----> 1 something + nothing

TypeError: unsupported operand type(s) for +: 'Thing' and 'Thing'

我们未重载加法,因此最后一个会报错。

pprint

相比使用print使用pprint打印输出的结果将更加美观

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
In [21]: import requests

In [22]: import pprint

In [23]: url = 'https://randomuser.me/api/?results=1'

In [24]: users = requests.get(url).json()

In [25]: pprint.pprint(users)
{'info': {'page': 1,
'results': 1,
'seed': 'e2b36600d80b6b84',
'version': '1.2'},
'results': [{'cell': '28353979',
'dob': {'age': 27, 'date': '1991-06-29T02:36:19Z'},
'email': 'jacob.jørgensen@example.com',
'gender': 'male',
'id': {'name': 'CPR', 'value': '571148-8001'},
'location': {'city': 'sønder stenderup',
'coordinates': {'latitude': '-34.4775',
'longitude': '-155.8512'},
'postcode': 21257,
'state': 'midtjylland',
'street': '365 sønderskovvej',
'timezone': {'description': 'Abu Dhabi, Muscat, '
'Baku, Tbilisi',
'offset': '+4:00'}},
'login': {'md5': '30c52b0719694ccf2b9b5b6bc90f7969',
'password': 'abcdefgh',
'salt': 'xu5t0vIS',
'sha1': '5dfbe42e63d3831eea10d7041cd8ae3041b80c8d',
'sha256': '66a9b5e0a6f88d25b5200b473d344e42455a32bf758e6a9989a27357d01b1d5c',
'username': 'blackelephant270',
'uuid': '6590dd62-55e5-4f59-b123-3e4ded35ad1c'},
'name': {'first': 'jacob', 'last': 'jørgensen', 'title': 'mr'},
'nat': 'DK',
'phone': '88236817',
'picture': {'large': 'https://randomuser.me/api/portraits/men/86.jpg',
'medium': 'https://randomuser.me/api/portraits/med/men/86.jpg',
'thumbnail': 'https://randomuser.me/api/portraits/thumb/men/86.jpg'},
'registered': {'age': 11, 'date': '2007-01-10T04:22:42Z'}}]}

Queue

Python的队列讲真还是很少使用,以后要多考虑了

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

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

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

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

推荐阅读文章: 简析Python中的四种队列

__repr__

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

1
2
3
4
5
6
7
8
9
In [26]: class someClass:
...: def __repr__(self):
...: return "<some description here>"
...:

In [27]: someInstance = someClass()

In [28]: print(someInstance)
<some description here>

sh

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

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

它允许您将任何程序称为普通函数 - 对于自动化工作流和任务非常有用,所有这些都来自Python。

1
2
3
4
5
6
7
8
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开始,您可以选择在定义函数时提供类型提示。

1
2
def addTwo(x : Int) -> Int:
return x + 2

您还可以定义类型别名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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模块

1
2
3
4
5
6
In [34]: import uuid

In [35]: user_id = uuid.uuid4()

In [36]: print(user_id)
98373939-251c-4787-887d-79d1b2afff74

Virtual environments

使用虚拟环境可以在同一台计算机上运行独立版本的Python安装

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

wikipedia

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

维基百科模块 查询信息十分方便。

1
2
3
4
5
6
7
8
9
10
11
12
In [37]: import wikipedia
...:

In [38]: result = wikipedia.page('freeCodeCamp')

In [39]: print(result.summary)
freeCodeCamp (also referred to as “Free Code Camp”) is a non-profit organization that consists of an interactive learning web platform, an online community forum, chat rooms, Medium publications and local organizations that intend to make learning web development accessible to anyone. Beginning with tutorials that introduce students to HTML, CSS and JavaScript, students progress to project assignments that they must complete either alone or in pairs. Upon completion of all project tasks, students are partnered with other nonprofits to build web applications, giving the students practical development experience.

In [40]: for link in result.links:
...: print(link)
...:
ALISON (company)

xkcd

人生苦短,我用Python。

1
import antigravity

YAML

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

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

使用 PyYAML module 可以在Python中使用YAML。

1
pip install pyyaml

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

zip

从两个列表中形成字典

1
2
3
4
5
6
7
8
In [46]: keys = ['a','b','c']

In [47]: vals = [1,2,3]

In [48]: zipped = dict(zip(keys, vals))

In [49]: zipped
Out[49]: {'a': 1, 'b': 2, 'c': 3}

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

我们还可以进行解压

1
2
3
4
5
6
7
In [63]: zipped = zip(keys, vals)

In [64]: type(zipped)
Out[64]: zip

In [65]: list(zip(*zipped))
Out[65]: [('a', 'b', 'c'), (1, 2, 3)]
知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!