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

你在滥用Python吗?初学者常遇到的5个场景

时间:2023-03-13 16:10:29 科技观察

学习者众多,Python是当今很多编程初学者的首选语言。简单易学的语法、丰富的库、庞大的社区是Python快速发展的主要原因。6年前,当我在掌握了一系列Java之后接触到Python时,我发现自己在编写Python代码时常常脑子里想着Java。作为新手,我并没有充分利用Python的优势,甚至在某些情况下还滥用了它。现在,我仍然看到一些初学者在没有先花时间阅读最佳实践和建议的情况下开始使用Python编码。为了解决这个问题,我列举了以下5种Python的滥用场景,并给出了相关的改进建议。1.当使用列表时列表允许存储各种数据类型的元素,没有大小限制,虽然这种灵活性使得列表成为收集数据的首选,但实际上有一些使用和不使用它的最佳实践场景。存储相同性质(数据类型和含义)的元素时应使用列表。Python不会通过编程来限制这一点,并且将单个自然项存储在列表中可以使开发人员的工作更加轻松。开发人员很容易预测列表将来会有哪些项目并充满信心地编写脚本。考虑下面的项目列表。此列表不包含单一性质的项目,开发人员无法确定列表是否包含房屋部件、尺寸或其他内容,因此他应该分别对待不同的项目:list_of_things=['Door',2,'Window',True,[2.3,1.4])]考虑下面的水果和分数列表。从前两项中,您可以轻松推断出第一个列表将始终包含水果名称,而第二个列表将始终包含分数值:list_of_fruits=['apple','orange','pear','cherry','banana']list_of_scores=[80,98,50,55,100]当存储具有不同含义或数据类型的项目时,元组更合适。元组不提供在不创建新对象的情况下存储无限项的灵活性(因为元组是不可变的)。2.遍历串联字符串时,Python中的一切都是对象,包括可变对象和不可变对象。每当更新分配给对象的值时,不可变对象都会创建新对象,而可变对象则不会。假设您想在字符串中生成整个字母表。因为字符串是不可变对象,所以无论何时使用“+”运算符连接字符串值,都会得到一个新对象。one_line_alphabet=''forletter_indexinrange(ord('a'),ord('z')):one_line_alphabet+=chr(letter_index)Join函数是连接字符串的首选方法。使用join函数将计算时间减少了大约3倍。在我做的一个测试中,迭代连接100万个字符串值用了0.135秒,但使用join()函数只用了0.044秒。small_letters=[chr(i)foriinrange(ord('a'),ord('z')+1)]single_line_alphabet=''.join(small_letters)因此,当您需要连接字符串列表时,请使用连接函数.如果你使用join函数连接几个字符串,你不会直观地感受到性能上的差异。要连接多个字符串值,请使用.format而不是“+”运算符。例如:name='John'surname='Doe'full_name='{name}{surname}'.format(namename=name,surnamesurname=surname)3.读取时如果想使用Python读写文件而写文件,首先需要使用内置的open函数打开一个文件。打开文件、读取或写入内容以及关闭文件。在操作过程中,可能会出现忘记关闭文件、异常处理失败等问题。操作完成后,忘记关闭文件会导致后续问题。例如,如果您在写入文件后忘记关闭文件,则写入操作将不会保存到文件中,您将在文件仍处于打开状态时保留计算机中分配的资源。如果在处理文件时没有手动处理异常和错误,文件将保持打开状态。f=open(file='file.txt',mode='r')lines=f.readlines()...f.close()打开文件时建议使用with关键字。with是一个上下文管理器,它封装代码并确保自动处理异常。例如,当你读写一个文件时,with-body中可能发生的任何失败都可以自动处理异常并始终保持文件关闭。withopen('file.txt')asf:read_data=f.read()...如果跳过with,一切都需要自己处理,关闭文件和异常处理都得自己处理。with将使您的生活更轻松,并使情况得到控制。4.跳过生成器的时候在很多场景下,需要生成一个值列表,稍后在脚本中会用到。例如,您需要为前100个数字生成3个数字的所有组合。combinations=[]value=100foriinrange(value):forjinrange(value):forkinrange(value):combinations.append((i,j,k))当执行命令完成后,列表组合将包含1M元组,每个元组有3个整数值。这些值会一直保存在内存中,直到被删除。使用sys模块中的getobjectsize函数检查对象大小产生8.29MB。您可以创建一个生成器,每次使用它时都会生成1个组合,而不是使用列表来存储值并将它们全部保存在内存中。这减少了内存消耗并提高了执行速度。defgenerate_combinations_of_three(值):foriinrange(值):forjinrange(值):forkinrange(值):yield(i,j,k)gen=generate_combinations_of_three(100)next(gen)#yields(0,0,0)next(gen)#yileds(0,0,1)...因此,尽可能多地使用生成器。始终牢记内存容量是有限的,并尽可能优化内存使用。使用生成器,尤其是在开发可扩展的解决方案时。5.在使用推导时,有些程序员在用Python编写任何代码时都遵循Python之禅(TheZenofPython)的原则。如果您是Python新手,您可能会想要夸大Python之禅的某些要点而低估其他要点。在了解推导式时最容易注意到这一点——您倾向于翻译推导式中的“每个”循环。假设您有一个三维数字矩阵,您很可能想要展平它。矩阵=[[[1,2,3],[4,5,6],[7,8,9]],[[10,20,30],[40,50,60],[70,80,90]]]使用列表理解,展平过程如下:flatten_list=[xforsub_matrixinmatrixforrowinsub_matrixforxinrow]使用循环,展平过程如下:flatten_list=[]forsub_matrixinmatrix:forrowinsub_matrix:forxinrow:flatten_list.append(x)listis很酷,但可读代码更酷。不要试图强迫自己一直使用列表,即使这样做可能需要您编写更少的代码,并且不会损失代码的可读性。来源:unsplash无论您是否有编程经验,每当您尝试使用一种新的编程语言时,一定要花时间阅读最佳实践。每种编程语言都是独一无二的,因此请确保在正确的上下文中明智地使用它们。Python致力于帮助程序员更高效、更方便地完成工作,我们不能忽视可能对代码生命周期产生负面影响的小决定。请尽可能找到更好最好的解决方案,这是程序员的工作使命。