分享一些提升编程效率的轮子

Python七号

共 16966字,需浏览 34分钟

 · 2021-04-09

Python 是世界上最受欢迎的编程语言之一,只要你有需求,Python 就有对应的解决方案,仅 PyPI 就有 4.7 万个库,这些库或模块足够简单,开箱即用,是节省时间的利器。今天就来盘点一下 Python 非常实用的模块或库,可以直接提升编程效率。

这里从字母 A 到 Z 的顺序进行,有些属于标准库,可以直接导入使用,有些属于第三方库,需要 pip install 后使用。

1、all or any

为什么 Python 如此流行,一个重要的原因就是 Python 的代码是人类可读的,生动形象的,比如 all or any 这个用法:

x = [TrueTrueFalse]
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")

上面的代码,我相信完全不用注释,你都能看懂,后续编程时不要忘了用。

2、bashplotlib[1]

正如的它的名字一样,可以在 bash 控制台下面画图,举个🌰:现在我们有一个文本文件,里面一列数字,如何快速进行统计呢,直接使用 plot_hist

In [17]: !head -n 5 data/exp.txt
1.12578195876
0.16026238021
0.0392117875843
0.968428864579
0.334430039433

In [18]: from bashplotlib.histogram import plot_hist
    ...:

In [19]: plot_hist(f="data/exp.txt",showSummary=True)

 451|  o
 427|  o
 403|  o
 380|  o
 356|  o
 332|  o
 309|  o
 285|  o
 261|  oo
 238|  oo
 214|  oo
 190|  oo
 166|  oo
 143|  oo
 119|  ooo
  95|  ooo
  72|  oooo
  48|  oooo
  24|  ooooo
   1| ooooooooooo
     -----------

-----------------------------------
|             Summary             |
-----------------------------------
|        observations: 1000       |
|       min value: 0.001718       |
|         mean : 0.988786         |
|       max value: 6.552654       |
-----------------------------------

In [20]:

也可以直接使用命令行:

(py38env) ➜  examples hist --file data/exp.txt

 451|  o
 427|  o
 403|  o
 380|  o
 356|  o
 332|  o
 309|  o
 285|  o
 261|  oo
 238|  oo
 214|  oo
 190|  oo
 166|  oo
 143|  oo
 119|  ooo
  95|  ooo
  72|  oooo
  48|  oooo
  24|  ooooo
   1| ooooooooooo
     -----------

-----------------------------------
|             Summary             |
-----------------------------------
|        observations: 1000       |
|       min value: 0.001718       |
|         mean : 0.988786         |
|       max value: 6.552654       |
-----------------------------------
(py38env) ➜  examples

还可以使用 scatter 绘制 x、y 坐标,详情请访问 bashplotlib 文档[2]

3、collections

Python 的基本数据类型很好用,但有时无法按照我们希望的那样快速初始化。比如说我希望有一个字典,它的值是一个列表,定义好之后想直接插入数据,怎么办?

通常会这样:

my_dict = {}

if 'key' in  my_dict:
    my_dict['key'].append('something')
else:
    my_dict['key'] = ['something']

有了 collections 可以简化成这样:

from collections import defaultdict
my_dict = defaultdict(list)
my_dict['key'].append('something')

还有很多实用的类,比如:

详细教程访问 Python 官方文档[3]

4、dir

这是非常好用的内省函数。如果你想看一个 Python 类的内部属性,可别忘了 dir 函数,比如说我想知道字符串都有哪些内置的函数,可以这样:

>>> dir("hello")
['__add__''__class__''__contains__''__delattr__''__dir__''__doc__''__eq__''__format__''__ge__''__getattribute__''__getitem__''__getnewargs__''__gt__''__hash__''__init__''__init_subclass__''__iter__''__le__''__len__''__lt__''__mod__''__mul__''__ne__''__new__''__reduce__''__reduce_ex__''__repr__''__rmod__''__rmul__''__setattr__''__sizeof__''__str__''__subclasshook__''capitalize''casefold''center''count''encode''endswith''expandtabs''find''format''format_map''index''isalnum''isalpha''isascii''isdecimal''isdigit''isidentifier''islower''isnumeric''isprintable''isspace''istitle''isupper''join''ljust''lower''lstrip''maketrans''partition''replace''rfind''rindex''rjust''rpartition''rsplit''rstrip''split''splitlines''startswith''strip''swapcase''title''translate''upper''zfill']

5、emoji

如果想用 Python 在字符界面下打印出一个表情包,别忘了这个:

pip install emoji

6、from __future__ import

想使用未来的功能,可以的,举个例子,你现在用的是 Python2,但是想用 Python3 的 print 函数,可以!

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

7、geopy

假如要处理地理位置信息,可以使用这个,这是 google 的 api 接口,需要先申请 app key。

pip install geopy
from geopy import GoogleV3
place = "suzhou"
location = GoogleV3().geocode(place)
print(location.address)
print(location.location)

8、howdoi

你在终端编程,此时想查看下如何使用 git 的 undo commits,不想离开终端,可以直接在终端里面查询 StackOverflow:

$ pip install howdoi
$ howdoi undo commits in git

howdoi 会爬取 StackOverflow 置顶的答案,偶尔也许不是最好的,但这已经足以让你保持专注了,记得用英语关键字去检索。

9、inspect

Python 的 inspect 模块非常适合了解代码背后发生的事情。你甚至可以 inspect 自己检查自己!

下面的代码示例使用 inspect.getsource()打印自己的源代码。它还使用 inspect.getmodule()打印在其中定义了该模块的模块。代码的最后一行打印出自己的行号。

10、map

简单来说,map 函数的任务就是分发任务。

x = [123]
y = map(lambda x : x + 1 , x)
# prints out [2,3,4]
print(list(y))

11、newspaper3k

如果你需要获取新闻、文章、文本的元数据(metadata)做自然语言训练,用这个就对了,可以大大提升你爬取网页的效率。

$ pip install newspaper3k
>>> from newspaper import Article
>>> url = 'http://www.bbc.co.uk/zhongwen/simp/chinese_news/2012/12/121210_hongkong_politics.shtml'

>>> a = Article(url, language='zh'# Chinese

>>> a.download()
>>> a.parse()

>>> print(a.text[:150])
香港行政长官梁振英在各方压力下就其大宅的违章建
筑(僭建)问题到立法会接受质询,并向香港民众道歉。
梁振英在星期二(1210日)的答问大会开始之际
在其演说中道歉,但强调他在违章建筑问题上没有隐瞒的
意图和动机。 一些亲北京阵营议员欢迎梁振英道歉,
且认为应能获得香港民众接受,但这些议员也质问梁振英有

>>> print(a.title)
港特首梁振英就住宅违建事件道歉

更多用法参考newspaper3k 文档[4]

12、pprint

全名叫 pretty print,意思就是漂亮的打印。比如说,对于一个复杂的字典,print 的效果是这样的一坨:

In [16]: print(users)
{'results': [{'gender''male''name': {'title''Mr''first''Fred''last''Cooper'}, 'location': {'street': {'number'681'name''Victoria Street'}, 'city''Salisbury''state''Greater Manchester''country''United Kingdom''postcode''P1I 3XR''coordinates': {'latitude''5.9123''longitude''-22.2206'}, 'timezone': {'offset''-2:00''description''Mid-Atlantic'}}, 'email''fred.cooper@example.com''login': {'uuid''5261fb69-bc91-46ed-9e66-a4f6f51ff2ff''username''greenkoala692''password''teaser''salt''SVMfx7Z1''md5''e1d344cd5998cce8affbbdbeec358052''sha1''083f8b9fb7e3271293af8d058fdf919fe690fb1a''sha256''112e2d6838871ae2ca8aefb90c33f4850a537ee4d0d36c6f66bbcb5ed17b5da7'}, 'dob': {'date''1959-12-04T14:20:29.781Z''age'62}, 'registered': {'date''2019-09-06T13:18:11.009Z''age'2}, 'phone''016977 6452''cell''0794-684-745''id': {'name''NINO''value''NC 88 63 68 Q'}, 'picture': {'large''https://randomuser.me/api/portraits/men/40.jpg''medium''https://randomuser.me/api/portraits/med/men/40.jpg''thumbnail''https://randomuser.me/api/portraits/thumb/men/40.jpg'}, 'nat''GB'}], 'info': {'seed''48254d6ef48036b0''results'1'page'1'version''1.3'}}

而 pprint 的效果是有层次感的:

In [19]: from pprint import pprint

In [20]: pprint(users)
{'info': {'page'1,
          'results'1,
          'seed''48254d6ef48036b0',
          'version''1.3'},
 'results': [{'cell''0794-684-745',
              'dob': {'age'62'date''1959-12-04T14:20:29.781Z'},
              'email''fred.cooper@example.com',
              'gender''male',
              'id': {'name''NINO''value''NC 88 63 68 Q'},
              'location': {'city''Salisbury',
                           'coordinates': {'latitude''5.9123',
                                           'longitude''-22.2206'},
                           'country''United Kingdom',
                           'postcode''P1I 3XR',
                           'state''Greater Manchester',
                           'street': {'name''Victoria Street''number'681},
                           'timezone': {'description''Mid-Atlantic',
                                        'offset''-2:00'}},
              'login': {'md5''e1d344cd5998cce8affbbdbeec358052',
                        'password''teaser',
                        'salt''SVMfx7Z1',
                        'sha1''083f8b9fb7e3271293af8d058fdf919fe690fb1a',
                        'sha256''112e2d6838871ae2ca8aefb90c33f4850a537ee4d0d36c6f66bbcb5ed17b5da7',
                        'username''greenkoala692',
                        'uuid''5261fb69-bc91-46ed-9e66-a4f6f51ff2ff'},
              'name': {'first''Fred''last''Cooper''title''Mr'},
              'nat''GB',
              'phone''016977 6452',
              'picture': {'large''https://randomuser.me/api/portraits/men/40.jpg',
                          'medium''https://randomuser.me/api/portraits/med/men/40.jpg',
                          'thumbnail''https://randomuser.me/api/portraits/thumb/men/40.jpg'},
              'registered': {'age'2'date''2019-09-06T13:18:11.009Z'}}]}

In [21]:

是不是清爽了许多?

13、queue

queue 模块是标准库实现的一个同步的队列类,实现了多生产者、多消费者队列。这特别适用于多线程间安全的交互消息。内部有三个非常常用的队列:Queue、LifoQueue、PriorityQueue。这些类在编程中有多重要就不多说了,做一做 leetCode 你就知道了。这里[5]有一些如何使用的例子。

14、sh

Python 是一种很棒的脚本语言,有时使用 os 和 subprocess 可能会让人有些头疼。sh 库提供了一种巧妙的选择,可以像调用普通程序一样调用任何程序,这对从 Python 内部进行自动化任务很有用。

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

15、uuid

UUID 的全称:Universally Unique Identifier,即通用唯一识别码,通常作为数据库的一个主键。

In [26]: import uuid
    ...: user_id = uuid.uuid4()
    ...: print(user_id)
12d0957b-18e5-4a4a-b5ee-d38e5f2789ce

上述代码会随机产生 128 位的二进制位,基本上不可能出现重复,完全可以放心使用,即使重复,再生成一个就是了。

16、venv

Python 3 自带的创建虚拟环境的模块,不需要再单独安装 virtualenv。

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

17、YAML

YAML 的全称是"YAML Ain't Markup Language",意思就是 YAML 不是标记语言。它是一种数据格式语言,并且是JSON的超集。

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

PyYAML 模块使您可以将 YAML 与 Python 一起使用。

安装方式:

pip install pyyaml

比如说,我们有一段 yaml 格式的文本,可以快速转换为 Python 对象:

In [23]: import yaml

In [24]: document = """
    ...:   a: 1
    ...:   b:
    ...:     c: 3
    ...:     d: 4
    ...: """


In [25]: yaml.load(document,Loader=yaml.FullLoader)
Out[25]: {'a'1'b': {'c'3'd'4}}

In [26]:

最后的话

以上就是 17 个 Python 非常实用的模块或库,可以大大提升你后续编程的效率。当然 Python 的类库众多,你也会有一些自己压箱底的工具库,请在下面留言,分享你自己喜欢的 Python 库或者你需要的工具库,一起讨论,一起学习。

留言讨论

推荐阅读:

分享 6 个实用的轮子

Python 处理中文的 4 个轮子

分享几个实用的问题

这几个Python内置的高阶函数,真香

参考资料

[1]

bashplotlib: https://github.com/glamp/bashplotlib.git

[2]

bashplotlib 文档: https://github.com/glamp/bashplotlib.git

[3]

Python 官方文档: https://docs.python.org/zh-cn/3/library/collections.html

[4]

newspaper3k 文档: https://newspaper.readthedocs.io/en/latest/

[5]

这里: https://www.tutorialspoint.com/python3/python_multithreading.htm


浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报