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

Python帮助你快速高效编码的最佳实践和技巧

时间:2023-03-20 22:40:21 科技观察

Python,最受初学者欢迎的编程语言之一,是世界各地学校教授最广泛的语言。然而,学习Python并不是一件容易的事。首先,需要找到最佳的在线学习路径,这本身就很困难。有成千上万种不同的Python课程和教程,都声称是最好的。诚然,光靠练习是不完美的,但完美的练习才是完美的。这意味着确保您始终遵循最佳编码实践(注释您的代码、使用正确的语法等),否则您可能会养成一些不良习惯,影响您未来在编码行业的发展。“通用规范提供了所有的可维护性、清晰度、一致性,也为良好的编程实践奠定了基础。它不能做的就是强迫你违背自己的意愿学习它。这就是Python!”—TimPeters发表于comp.lang.python,2001–06–16在本文中,我将分享十个技巧,帮助您使用Python快速高效地编写代码。1.可读性的重要性编写的程序必须让人类能够理解,其次才能让机器执行。HalAbelson(https://www.azquotes.com/author/38260-Hal_Abelson)首先,遵循编程约定,使程序易于阅读。编程约定是有经验的程序员在编写代码时遵循的。没有比无视这些规范更能证明您是“新手”的方法了。其中一些规范是特定于Python的;其他的可以被所有语言的计算机程序员使用。从本质上讲,可读性是决定其他人理解你的部分代码的难易程度的特征(不是你!)。例如,我不习惯用垂直对齐方式编写代码,也不习惯用起始分隔符对齐函数参数。#No,toavoid:func=long_function_name(var_one,var_two,var_three,var_four)#Yes,func=long_function_name(var_one,var_two,var_three,var_four)查看Python代码风格指南(https://www.python.org/dev/peps/pep-0008/)并决定哪个看起来最好。我们经常做的另一件重要的事情是模拟我们以前看过或写过的程序,这就是为什么接触可读的程序对于编程学习非常重要。2.避免无用条件通常,一串if&elif&....&else长的条件是代码需要重构的标志。这些条件使您的代码冗长且难以解释。有时这些代码可以很容易地替换,例如,我以前经常这样做:deff():ifcondition:returnTrueelse:returnFalse这很愚蠢!该函数返回一个布尔值,那么为什么首先要使用if块呢?正确的做法是:deff():returncondition在一次Hackerrank挑战赛中,参赛者需要编写一个函数来判断给定年份是否为闰年。在公历中,考虑三个标准来确定闰年:年份可以被4整除并且是闰年,除非:年份也可以被100整除并且不是闰年,除非:年份也可以被400整除.本次挑战中的闰年,不考虑ifs和elses条件,直接做:defis_leap(year):returnyear%4==0and(year%400==0oryear%100!=0)3.使用空格适当地不要将键盘选项卡选项卡与空格键混淆对于函数之间的一个换行符对于级别之间的两个换行符在库、列表、元组和参数列表中的参数的“,”之后输入一个空格alibrary在“:”后输入一个空格。在赋值和比较前后放置空格(列表中的参数除外)括号前后或参数列表之前没有空格deffunction(key,value=0):"""Returnadictionaryandalist..."""d={key:value}l=[键,值]返回,l4。DocstringsandCommentsDocstrings=HowtoUseSubscriptionsComments=WhytheCodeExecutes(Sensibly)andHowDocstringsExplainHowtoUsetheCode:Explainswhatthefunctiondoes,evenforyou这种用法非常明显。但在未来,它的用途可能不会对其他人同样明显。描述预期的参数、返回值和异常。如果类函数与单个调用者紧密耦合,请提及调用函数。这些评论表明代码维护者需要维护。下面的示例还包括您自己的注释,例如:#!!!漏洞:…#!!!FIX:这是一个hack#???为什么会在这里?编写好的文档字符串和注释是您的责任,因此请始终保持最新状态!当您进行更改时,请确保您的评论和文档字符串与您的代码一致。您会在“文档字符串约定”(https://www.python.org/dev/peps/pep-0257/)中找到专门针对文档字符串的详细PEP5。其他编程语言中的变量和赋值:c=aa=bb=c在Python中,最好把赋值放在一行代码中:b,aa=a,b你可能看过代码,但是你知道吗知道它是怎么做到的吗?逗号构成了元组语法。在右侧创建一个元组(一组元组)。元组是左边的目标(元组拆包)。其他例子:result=''forsincolors:result+=s在结构化数据循环中很有用(上面的变量名都保留了):result=''.join(colors)也可以反过来做,只要确保leftand对有相同的只是结构:>>>jan,(gname,gtitle,gphone)=people>>>gname'German'>>>gtitle'GBT'>>>gphone'unlisted'>>>jan['Jan','戈麦斯','+1-888-222-1546']6.列表拼接&合并首先从字符串列表开始:colors=['red','blue','green','yellow']我们要将这些字符串拼接在一起,创建一个长链。尤其是当子串数量较多时,避免做:result=''forsincolors:result+=s很慢。而且它需要大量的内存和性能。总和被添加、存储,然后继续每个中间步骤。相反,执行以下操作:colors=['red','blue','green','yellow']print('Choose',','.join(colors[:-1]),\'or',colors[-1])>>choosered,blue,greenoryellowjoin()函数可以一次完成整个复制。当只处理几个字符串时,它与其他函数没有区别。但是它可以让你养成使用最好的函数构建长链的习惯,因为面对成百上千的字符串,使用join()函数确实有很大的不同。以下是使用join()函数的一些提示。如果你想使用空格作为分隔符:#Dothis:#Andnotthis:ifx:ifx==True:passpass#Dothis:#Andnotthis:ifitems:iflen(items)!=0:passpass#andespeciallynotthat:ifitems!=[]:passor逗号和空格:result=','.join(colors)为了使句子在语法上正确,在除最后一个值之外的每个值之间使用逗号(人们更喜欢使用“或”)。拆分列表的语法将完成剩下的工作。[:-1]返回除最后一个值以外的所有内容,我们可以用逗号将其连接起来。colors=['red','blue','green','yellow']print('Choose',','.join(colors[:-1]),\'or',colors[-1])>>Choosered,blue,greenoryellow7.测试真实条件就布尔值而言,使用Python简单快速:#Dothis:#Andnotthis:ifx:ifx==True:passpass#Dothis:#Andnotthis:ifitems:iflen(items)!=0:passpass#尤其不是那个:ifitems!=[]:pass8。尽可能使用枚举函数枚举函数接受一个列表并返回一对(index,item):items=['zero','one','two','three']>>>printlist(enumerate(items))[(0,'zero'),(1,'one'),(2,'two'),(3,'three')]使用列表来显示结果是必要的,因为枚举函数是一个惰性函数,在被询问时一次只产生一个项目(一对)。for循环需要这种机制。Print函数不会得到任何结果,但必须有完整的消息才能显示。因此,我们应该在使用Print函数之前自动将生成器转换为列表。因此,最好使用以下循环:>>>[(x,y)forxin(1,2,3,4)ifx%2==0foryin['a','b']ify=='b'][(2,'b'),(4,'b')]使用枚举函数的版本比其他两个版本更短更简单。上面是一个枚举函数返回迭代器的例子(生成器是迭代器的一种)。9.列表理解使用for和if的传统方式:让我们对小于100的数字的平方求和:#Withaloop:total=0fornuminrange(1,101):total+=num*num使用列表理解:new_list=[fn(item)foritemina_listifcondition(item)]列表理解清晰明了。在同一个列表推导中,你可以有多个for循环和if条件,但是如果超过两三个,或者条件很复杂,我建议你使用一个普通的for循环。比如前面的一个0到9的2的幂的列表:>>>??[n**2forninrange(10)][0,1,4,9,16,25,36,49,64,81]list奇数列表:>>>??[n**2forninrange(10)ifn%2][1,9,25,49,81]更多例子:>>>[(x,y)forxin(1,2,3,4)ifx%2==0foryin['a','b']ify=='b'][(2,'b'),(4,'b')]10。生成器表达式让我们对小于100的数字的平方求和:让我们对小于100的数字的平方求和:#Withaloop:total=0fornuminrange(1,101):total+=num*num你也可以使用sum函数,它更快对我们来说,通过构建正确的序列来完成工作。#Withalistcomprehension:total=sum([num*numfornuminrange(1,101)])#Withageneratorexpression:total=sum(num*numfornuminxrange(1,101))generatorexpression类似于listcomprehension,只是计算的时候偷懒了。列表理解一次计算整个结果并将其存储在列表中。生成器表达式在必要时一次计算一个值。当序列很长并且结果列表只是中间步骤而不是最终结果时,生成器表达式特别有用。例如,如果我们必须对数十亿个整数的平方求和,我们将使用列表推导来饱和内存,但使用生成器表达式则没有问题。虽然需要一段时间!total=sum(num*numfornuminrange(1,1000000000))两者的句法区别在于列表推导式有方括号,而生成器表达式没有。生成器表达式有时需要括号,因此您应该始终使用它们。简而言之:当预期结果是列表时使用列表理解。当列表只是中间结果时使用生成器表达式。资料来源:https://www.azquotes.com/quote/669106总结本文介绍了一些学习Python编程的优秀技巧。如果你真的想成为一名程序员或想将编码技能添加到你的个人技能中,那么学习Python是一个很好的起点。在线查找高质量的Python培训课程,开始学习如何使用Python进行编程。我建议您先通过互动课程学习基础知识,然后再学习更难的概念。学习不要操之过急,否则可能会错过重要信息。做笔记,并确保定期复习,并尽可能多地练习编码。与像你一样学习的同学交流,遇到问题时不要害怕提问。帮助他人解决问题可以是一种很好的复习,使用他人的代码是学习新事物的好方法。如果你做了所有这些事情,没有什么能阻止你!你还在等什么?立即开始使用Python编程!