当前位置: 首页 > 科技观察

十大Python开发技巧

时间:2023-03-14 20:24:22 科技观察

时不时地,当我了解Python中的一个新特性,或者我发现其他人不知道该特性时,我会记下它。在过去的几周里,我最近了解或实现了一些有趣的东西-堆栈。这里有十个巧妙的Python开发技巧,我相信您以前从未见过。快速浏览其中的一些功能,以及每个功能的概要。注意:代码在这个故事中显示为图像。此外,您将在最后获得GitHub自述文件链接以进一步试验。1、如何查看运行状态下的源码?查看功能的源代码,我们通常使用IDE来完成。例如,在PyCharm中,您可以使用Ctrl+鼠标输入函数的源代码。如果我们没有IDE怎么办?当我们要使用一个函数的时候,我们怎么知道这个函数需要接收哪些参数呢?当我们在使用一个函数的时候遇到问题,我们是如何通过阅读源码来解决问题的呢?目前,我们可以使用inspect而不是IDE来帮助您完成这些事情inspect.getsource:返回对象源代码的文本。InspectModules提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块、类、方法、函数、回溯、框架对象和代码对象。该模块主要提供四种服务:类型检查、获取源代码、检查类和检查解释器堆栈的函数。2.查看包路径的最快方式在使用import导入包或模块时,Python会在某些目录中查找,而这些目录是有优先顺序的,通常我们会使用sys.path来查看。有没有更快的方法?这里我想介绍一种比上面更方便的方法,可以解决一行命令:从输出中可以发现这一列的路径会多出sys.path(包含用户环境的目录)所有的。3.将嵌套循环写成一行我们经常使用下面的嵌套循环代码:这里只有三个for循环,在实际编码中,可能会有更多的层数。这样的代码可读性差,人家不想写,还有更好的写法。这里介绍一种常用的写法,使用itertools库来实现更优雅可读的代码。4.如何使用打印输出记录很多人喜欢使用打印来调试代码,记录程序的运行过程。但是,打印仅将内容输出到终端,而不是日志文件,这不利于故障排除。如果您热衷于使用打印来调试您的代码(虽然这不是最佳实践),记录运行程序的过程,那么下面描述的打印用法可能适合您。在Python3中将其打印为函数,函数本身变得更强大,因为它可以接收更多参数。代码如下:五、如何快速计算一个函数的运行时间要计算一个函数的运行时间,可以看到自己写了几行代码来计算函数的运行时间。有没有更方便的计算运行时间的方法?是的,使用一个名为timeit的内置模块。只需一行代码即可使用结果如下:2222210.0200598246。使用内置的缓存机制提高效率缓存是一种存储量化数据以供后续采集需要的方法,旨在加快数据采集速度。数据生成过程可能需要计算、正则化和远程抓取等操作。如果同一份数据需要多次使用,每次重新生成都会浪费时间。因此,如果将通过计算或远程请求等操作得到的数据缓存起来,会加速后续的取数据需求。为了满足这个需求,Python3.2+为我们提供了一种易于实现的机制,不需要你编写这样的逻辑代码。该机制在functool模块的lru_cache装饰器中实现。参数说明:maxsize:本次函数调用最多可以缓存多少个结果。如果为None,则没有限制。当设置为2的幂时,性能最佳。Type:如果为True,不同参数类型的调用会被单独缓存。例如:输出如下,可以看到第二次调用并没有执行函数体,而是直接将结果返回到缓存中:calculating:1+233calculating:2+35下面是经典的斐波那契数列,当你指定n很大的时候,就会有很多重复的计算。现在可以用第6点介绍的timeit来测试效率能提高多少。没有lru_cache,运行时间为31秒:有lru_cache,运行速度太快,所以我将n的值从30调整为500,但即便如此,运行时间也只有0.0004秒。速度提升非常显着。7.程序退出前提示执行代码使用内置模块atexit,您可以轻松注册和退出函数。无论你在哪里导致程序崩溃,它都会执行你注册的功能。示例如下:结果如下:如果clean()函数有参数,则可以调用atexit.register(clean_1,parameter1,parameter2,parameter3="xxx")不带修饰符。也许您有其他方法来处理这种需求,但它比不使用atexit更优雅、更方便且易于扩展。但是使用atexit还是有一定的局限性,例如:如果程序被未处理的系统信号杀死,注册的函数将无法正常执行。如果出现严重的Python内部错误,您注册的函数将无法正常执行。如果手动调用os._exit(),注册的函数无法正常执行。8.如何关闭异常关联上下文?当你处理一个异常时,由于处理不当或其他问题,当抛出另一个异常时,抛出的异常也会携带原来的异常信息。再读一遍,你肯定就明白了。像这样。您可以从输出中看到两条异常消息:如果异常在异常处理程序或finally块中抛出,默认情况下异常机制将隐式工作以将先前的异常附加为新异常的__context__属性。这是Python默认启用的自动关联异常上下文。如果你想自己控制这个上下文,你可以添加一个from关键字(from的限制是第二个表达式必须是另一个异常类或实例。)来指示哪个异常导致你的新异常。输出结果如下当然也可以使用with_traceback()方法设置异常的__context__属性,这样也可以更好的在traceback中显示异常信息。最后,我们是否要完全关闭这种自动关联异常上下文的机制?我们还能做什么?我们可以使用raise...fromnothing,从下面的例子开始,没有原始的异常机制。关键字是defer,如下图myfunc的调用会在函数返回之前完成,即使你把myfunc的调用写在函数的第一行也是延迟调用。输出如下,AB那么Python中有这样的机制吗?当然有,但不是Golang那么简单。我们可以使用Python上下文管理器来实现这个效果。输出如下AB10。如何流式读取大文件使用with...open...从文件中读取数据,这是所有Python开发者都非常熟悉的操作。但是,如果使用不当,也会造成很多麻烦。例如,当您使用read函数时,Python会一次性将文件内容加载到内存中。如果文件有10GB或更大,计算机将消耗大量内存。对于这个问题,你可能会考虑使用readline作为生成器来逐行返回。但是,如果此文件的内容在一行中,每行10GB,您仍然会一次读取所有内容。最优雅的解决方案是使用read方法指定一次只读取固定大小。例如,在下面的代码中,一次只返回8kb。上面的代码在功能上没问题,但是代码看起来还是有点臃肿。使用部分函数和迭代函数,你可以像这样优化你的代码总结一下,我们可以在运行时使用检查来查看源代码如果你嵌套循环,你可以使用itertools。使用functool.lru_cache来加速你的代码。旨在加速数据采集在atexit模块中注册您的函数,以便在任何地方崩溃您的程序,它将执行您为读取大文件而注册的函数,方法是将它们分成固定大小的块