Python生态系统中有很多很棒的软件包,但是有时您所需要的只是一个内置函数。如果没有令人兴奋的新软件包的烙印,它可能不会那么迷人,但是您可以在标准库上走很长一段路。如果没有其他问题,了解以下Python内置功能可以帮助您加快开发速度并提高代码可读性。
全球可用的功能#1-enumerate注意:本教程使用一些Python 3.7+语法
enumerate
当您要遍历可迭代对象时要跟踪索引时,该函数非常方便。如果从其他语言进入Python,这可以删除您可能一直在使用的计数器变量。
abcs = List('ABCDEF')# Without enumeratek = 0for letter in abcs: print(k, letter.lower()) # => 0 a, 1 b ... k += 1# With enumeratefor 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- zipzip
当您要将多个可迭代对象组合在一起时,此功能很有用。一个常见的用例是在没有直接索引的情况下同时循环两个列表。
ABCs = List('ABCDEF')abcs = List('abcdef')# Without zipfor upper in ABCs: IDx = ABCs.index(upper) print(upper, abcs[IDx]) # => A a, B b ...# With zipfor 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 mapresults = [func(x) for x in xs]print(results) # => [0, 3, 4, 3, ...]# With mapresults = List(map(func, xs))print(results) # => [0, 3, 4, 3, ...]
有了map
,很明显,我们正在尝试将其应用于func
所有应用,xs
但没有确切说明如何做。例如,如果xs
向量很大,我们可以map
在multiprocessing.Pool
对象上使用类似方法来加快计算速度。
from multiprocessing import Pool, cpu_countdef 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 osprint(dir(os)) # => ['CLD_CONTINUED', 'CLD_DUMPED', ...]
我们还可以dir
用来观察Python数据模型基础上的特殊方法。
print(dir(List('ABCDEF'))) # => ['__add__', '__class__', ...]
我们不仅可以看到类似的方法append
和sort
我们的名单上,但是我们也可以看到该__iter__
方法,involked时返回迭代。
该string
模块包含有用的常量,可以节省一些键入时间。例如,如果您需要英文字母的所有字母,则可以使用string.ascii_lowercase
或string.ascii_uppercase
。
import stringprint(string.ascii_lowercase)print(string.ascii_uppercase)
就个人而言,我使用的string.ascii_uppercase
是384孔板,其孔名称从“ A1”到“ P24”
顾名思义,该itertools
模块包含用于处理可迭代对象的实用程序。这些迭代器构建块不仅可以通过延迟执行来提高内存效率,而且还可以为几种常见的转换提供清晰的语法。
该itertools.cycle
函数采用一个迭代器,并返回一个迭代器,该迭代器将无限循环遍历原始输入值。
import numpy as npimport matplotlib.pyplot as pltfrom itertools import cyclen_lines = 10n_pts = 10styles = [ '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
。
该itertools.product
函数返回输入可迭代项的笛卡尔积,这只是说它构成网格的一种好方法。
import stringfrom itertools import productrow_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
模块包含可作用于其他功能的功能。您可以在这里找到许多很棒的功能编程实用程序。
该functools.partial
函数允许我们使用Curry函数,这意味着需要提前将某些参数指定为固定值。咖喱函数将返回一个新函数,该函数需要较少的参数。
from functools import partial# f takes 2 argumentsdef f(x, y): return abs(x ** 2 - 4 * y)# g takes 1 argumentg = partial(f, y=0)print(g(4)) # => 16
这将打印,16
因为g(x) = f(x, y=0) = abs(x ** 2)
。当使用假定输入函数具有特定签名的高阶函数(即pool.map
用于多处理)时,这特别有用。
包括这些内置模块可能会作弊,因为它们本身不是功能。但是,它们提供了用于读取和写入不同类型数据的简单接口,因此将这些功能一起考虑似乎更加合乎逻辑。
#9- JsON该Json
模块提供了用于读取和写入JsON数据的内置接口。
import Jsondata = { 'name': 'Bia', 'color': 'Black', 'breed': 'Labrador mix'}with open('data.Json', 'w') as fd: Json.dump(data, fd) # => data.Json JsON file createdwith open('data.Json', 'r') as fd: data_Json = Json.load(fd)print(data_Json) # => {'name': 'Bia', ...}
在处理来自网络的数据,自己进行抓取或使用与JsON配合使用的其他语言时,这特别有用。
#10-pickle该pickle
模块提供了用于读取和写入腌制对象的内置接口。酸洗是将Python对象序列化为可以写入磁盘的平面二进制结构的过程。pickle
因此,该模块对于将对象保存为当前状态以供以后使用很有用。
import picklemodel = { '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 createdwith 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感兴趣的小伙伴加入!
总结
以上是内存溢出为你收集整理的Python标准库中的10个强大的内置函数全部内容,希望文章能够帮你解决Python标准库中的10个强大的内置函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)