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
向量很大,我们可以map
在multiprocessing.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__', ...]
我们不仅可以看到类似的方法append
和sort
我们的名单上,但是我们也可以看到该__iter__
方法,involked时返回迭代。
字符串模块
#5- string.ascii_uppercase
该string
模块包含有用的常量,可以节省一些键入时间。例如,如果您需要英文字母的所有字母,则可以使用string.ascii_lowercase
或string.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感兴趣的小伙伴加入!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。