Python标准库中的10个强大的内置函数

Python生态系统中有很多很棒的软件包,但是有时您所需要的只是一个内置函数。如果没有令人兴奋的新软件包的烙印,它可能不会那么迷人,但是您可以在标准库上走很长一段路。如果没有其他问题,了解以下Python内置功能可以帮助您加快开发速度并提高代码可读性。

注意:本教程使用一些Python 3.7+语法

全球可用的功能

#1-enumerate

enumerate当您要遍历可迭代对象时要跟踪索引时,该函数非常方便。如果从其他语言进入Python,这可以删除您可能一直在使用的计数器变量。

abcs = list('ABCDEF')

# Without enumerate
k = 0
for letter in abcs:
    print(k, letter.lower())  # => 0 a, 1 b ...
    k += 1

# With enumerate
for k, letter in enumerate(abcs): 
    print(k, letter.lower())  # => 0 a, 1 b ...

enumerate工作方式是通过返回一个枚举对象和一个__next__返回一个元组的方法(count, value)。您甚至可以使用解构来枚举更复杂的值。

abcs = [('a', 'A'), ('b', 'B'), ('c', 'C')]

for k, (lower, upper) in enumerate(abcs):
    print(k, lower, upper)  # => 0 a A, 1 b B ...

#2- zip

zip当您要将多个可迭代对象组合在一起时,此功能很有用。一个常见的用例是在没有直接索引的情况下同时循环两个列表。

ABCs = list('ABCDEF')
abcs = list('abcdef')

# Without zip
for upper in ABCs:
    idx = ABCs.index(upper)
    print(upper, abcs[idx])  # => A a, B b ...

# With zip
for upper, lower in zip(ABCs, abcs):
    print(upper, lower)  # => A a, B b ...

删除手动索引使代码更易于理解,因为它消除了思考索引对应的步骤。如果您喜欢花哨的东西,可以将其enumerate与之结合,zip因为enumerate它不在乎它会收到什么样的可迭代项。

for k, (upper, lower) in enumerate(zip(ABCs, abcs)):
    print(k, upper, lower)  # => 0 A a, 1 B b ...

#3-map

map函数具有强大的通用性,并且了解它可以帮助您加快计算速度multiprocessing。从概念上讲,map将给定函数应用于可迭代的每个元素,然后按顺序返回结果。我们可以lambda用来快速创建函数f(x) = abs(x ** 2 - 4 * x)并将其映射到的某些值x

func = lambda x: abs(x ** 2 - 4 * x)
xs = range(10)

# Without map
results = [func(x) for x in xs]
print(results)  # => [0, 3, 4, 3, ...]

# With map
results = list(map(func, xs))
print(results)  # => [0, 3, 4, 3, ...]

有了map,很明显,我们正在尝试将其应用于func所有应用,xs但没有确切说明如何做。例如,如果xs向量很大,我们可以mapmultiprocessing.Pool对象上使用类似方法来加快计算速度。

from multiprocessing import Pool, cpu_count

def func(x): 
    return abs(x ** 2 - 4 * x)

xs = range(1_000_000)
with Pool(cpu_count()) as pool:
    results = pool.map(func, xs)
print(len(results))  # => 1000000

请注意,我们使用with关键字来创建用于管理处理池资源的上下文。该cpu_count函数将返回机器上可用的内核数,并将并行pool.map应用于多个func项目xs。这证明这map也为表达单个程序,多个数据(SPMD)样式的计算提供了有用的语法。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:721195303

 

#4-dir

dir函数有助于对Python对象进行自省(以查看它们具有哪些属性)。例如,我们可以dir用来查看os模块中定义的内容。

import os
print(dir(os))  # => ['CLD_CONTINUED', 'CLD_DUMPED', ...]

我们还可以dir用来观察Python数据模型基础上的特殊方法

print(dir(list('ABCDEF')))  # => ['__add__', '__class__', ...]

我们不仅可以看到类似的方法appendsort我们的名单上,但是我们也可以看到该__iter__方法,involked时返回迭代。

字符串模块

#5- string.ascii_uppercase

string模块包含有用的常量,可以节省一些键入时间。例如,如果您需要英文字母的所有字母,则可以使用string.ascii_lowercasestring.ascii_uppercase

import string
print(string.ascii_lowercase)
print(string.ascii_uppercase)

就个人而言,我使用的string.ascii_uppercase是384孔板,其孔名称从“ A1”到“ P24”

itertools模块

顾名思义,该itertools模块包含用于处理可迭代对象的实用程序。这些迭代器构建块不仅可以通过延迟执行来提高内存效率,而且还可以为几种常见的转换提供清晰的语法。

#6- itertools.cycle

itertools.cycle函数采用一个迭代器,并返回一个迭代器,该迭代器将无限循环遍历原始输入值。

import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle

n_lines = 10
n_pts = 10
styles = [ 'k-', 'b--', 'r-', 'g--' ]

plt.figure()
for k, style in zip(range(n_lines), cycle(styles)):
    x = np.arange(n_pts)
    y = np.sqrt(x) + np.random.rand(n_pts)
    plt.plot(x, y, style, label=f'Line {k}: {style}')
plt.legend()
plt.show()

如您所见,这对于循环绘制样式很有用,因为要指定大量样式并且可以重复一些样式很麻烦。请注意,它cycle是在内部使用的zip,因此循环样式的迭代器不会耗尽len(styles) < n_lines

#7- itertools.product

itertools.product函数返回输入可迭代项的笛卡尔积,这只是说它构成网格的一种好方法。

import string
from itertools import product

row_names = string.ascii_uppercase[:16]
col_names = range(1, 25)

wells = list(product(row_names, col_names))
print(wells)  # => [('A', 1), ('A', 2), ...]

在这里,我们获得了384个元组(16行* 24列)的列表,它们像里程表一样在输入可迭代项中循环。

functools模块

functools模块包含可作用于其他功能的功能。您可以在这里找到许多很棒的功能编程实用程序。

#8- functools.partial

functools.partial函数允许我们使用Curry函数,这意味着需要提前将某些参数指定为固定值。咖喱函数将返回一个新函数,该函数需要较少的参数。

from functools import partial

# f takes 2 arguments
def f(x, y):
    return abs(x ** 2 - 4 * y)

# g takes 1 argument
g = partial(f, y=0)

print(g(4))  # => 16

这将打印,16因为g(x) = f(x, y=0) = abs(x ** 2)。当使用假定输入函数具有特定签名的高阶函数(即pool.map用于多处理)时,这特别有用。

有用的IO模块

包括这些内置模块可能会作弊,因为它们本身不是功能。但是,它们提供了用于读取和写入不同类型数据的简单接口,因此将这些功能一起考虑似乎更加合乎逻辑。

#9- JSON

json模块提供了用于读取和写入JSON数据的内置接口。

import json

data = {
    'name': 'Bia',
    'color': 'Black',
    'breed': 'Labrador mix'
}

with open('data.json', 'w') as fd:
    json.dump(data, fd)  # => data.json JSON file created

with open('data.json', 'r') as fd:
    data_json = json.load(fd)

print(data_json)  # => {'name': 'Bia', ...}

在处理来自网络的数据,自己进行抓取或使用与JSON配合使用的其他语言时,这特别有用。

#10-pickle

pickle模块提供了用于读取和写入腌制对象的内置接口。酸洗是将Python对象序列化为可以写入磁盘的平面二进制结构的过程。pickle因此,该模块对于将对象保存为当前状态以供以后使用很有用。

import pickle

model = {
    'method': 'logistic',
    'weights': [-0.34, 0.45, 0.72, -1.21]
}

with open('model.pkl', 'wb') as fd:
    pickle.dump(model, fd, pickle.HIGHEST_PROTOCOL)  # => model.pkl created

with open('model.pkl', 'rb') as fd:
    model_pkl = pickle.load(fd)

print(model_pkl)  # => {'method': 'logistic', ...}

这种用例在机器学习应用程序中很常见,其中模型是Python对象,权重是必须保存的内部状态。


在这里还是要推荐下我自己建的Python学习群:721195303,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

猜你喜欢

转载自blog.csdn.net/aaahtml/article/details/114276406