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

编写漂亮的Python代码的20条指南

时间:2023-03-19 23:15:58 科技观察

通常,我们在学校被教导时,编程美学并不是一个重点问题。在用Python编写代码时,个人会遵循自己的风格。然而,当我们不得不花费大量时间试图理解一个人的隐含代码时,这项工作当然不受欢迎,当其他人阅读我们的代码时也会发生同样的情况。因此,让我们专注于Python的禅宗和一些改进它的技巧来解决问题。1Python之禅?对于那些以前没有听说过的人,输入Python解释器并导入它,TimPeters的19条指导原则就会出现:美丽胜于丑陋;清晰胜于晦涩;简单胜于复杂;复杂胜于晦涩;平整嵌套;间距过于紧凑;可读性很重要;特殊情况不足以违反这些原则;实用胜于纯粹;永远不要默默地忽略错误;除非明确要求这样做;面对暧昧,拒绝猜测;应该有一种,最好只有一种,最直接的方法来解决问题;当然,这不可能一蹴而就,除非你是荷兰人;做总比不做好;但不想做,不如不做;如果解决方案难以描述,那一定是一个糟糕的解决方案;如果实现很容易描述,它可能是一个很好的解决方案;命名空间是个绝妙的主意,多使用它!在这篇文章中,我将分享我对这些格言的理解以及我学到的一些有用的Python技巧。2美丽胜于丑陋Python简单的语法、可读的代码和类似英语的命令使得编写Python代码比使用其他编程语言更容易、更高效。例如,使用orand和||&&构造具有相同语义的表达式:#&&,||ifa==0&&b==1||c==True:#and,orifa==0andb==1orc==True:#这两个逻辑表达式是相同的在Python#从语义的角度来看,可以使用选择运算符构造完全相同的表达式。此外,代码的布局和组成非常重要,并且有大量资源涵盖该主题。这是最受欢迎和我最喜欢的之一:PEP8-Python代码风格指南。https://www.python.org/dev/peps/pep-0008/浏览完PEP8,看看下面的文章,其中展示了一些亮点和应用:如何根据PEP8编写漂亮的Python代码https://realpython.com/python-pep8/使用PEP8的时尚Pythonhttps://medium.com/@mariasurmenok/stylish-python-with-pep8-c3ca93531418PEP-8的陷阱https://medium.com/@ian.reinert/the-pitfalls-of-pep-8-b6108b006ed9永远不要弄乱你的代码。优雅而美丽。3清晰胜于晦涩在Python中,良好的命名约定不仅可以提高你的课堂成绩,还可以让你的代码更加清晰。幸运的是,您可以在PEP8中找到一些指导原则,我想在下面强调其中的一些。https://www.python.org/dev/peps/pep-0008/通常,避免使用以下名称:过于宽泛,如my_list;太冗长,比如list_of_machine_learning_data_set;太模糊,比如“1”、“I”、“o”、“O”。包/模块名称应全部小写:首选单字名称;当需要多个单词时,用下划线分隔它们。类名应遵循UpperCaseCamelCase规范变量方法和函数应小写(必要时用下划线分隔)常量名必须全部大写(必要时用下划线分隔)一切都必须清晰易读。4简单胜于复杂简单胜于复杂:你必须努力使事情变得简单。但最终这一切都是值得的,因为一旦你做到了,你就可以创造奇迹。——Jobs很多时候,在处理迭代器的时候,我们也需要保存迭代次数。Python通过提供称为enumerate()的内置函数简化了此任务。下面是一个不成熟的方法,然后是推荐的方法:words=[Hannibal,Hanny,Steeve]#不成熟的方法index=0forwordinwords:print(index,word)index+=1#recommendedmethodforindex,wordinenumerate(words):print(index,word)另一个例子是使用内置的zip()函数,它创建一个迭代器,将来自两个或多个迭代器的元素配对。您可以使用它快速有效地解决常见的编程问题,例如创建字典。subjects=[math,chemistry,biology,pyhsics]grades=[100,83,90,92]grades_dict=dict(zip(subjects,grades))print(grades_dict)化简的能力就是剔除不必要的东西,Keepwhatis必要的。5Complexisbetterthanobscurecomplex(复杂)和obscure(复杂)的区别在于complex是指组件的系统级别,obscure是指高难度。有时,尽管我们试图使任务变得简单和愚蠢,但结果仍然很糟糕。在这种情况下,编程优化就变得很有必要,而我最喜欢的学习方式是在编码挑战网站上工作。您可以查看其他人的解决方案,甚至可以从更好的算法中获得灵感。https://www.freecodecamp.org/news/the-10-most-popular-coding-challenge-websites-of-2016-fb8a5672d22f/对于初学者,HackerRank提供了适合新手程序员的各种级别的任务,这很棒Great.之后,尝试更专业的网站,如Coderbyte和Topcoder。6平面优于嵌套嵌套模块在Python中并不常见——至少我以前没有见过像module.class.subclass.function这样的东西——这是不可读的。虽然在另一个子模块中构建一个子模块可能会减少代码行,但我们不希望用户因不直观的语法而陷入困境。7间距比压缩好不要在一行中插入太多的代码,这会给读者带来压力。建议最大行长度为79个字符。这样,编辑器窗口宽度限制在使用代码审查工具时效果很好。使用Python8从Unsplash下载图像可读性很重要阅读的代码多于编写的代码。考虑缩进,它使代码更易于阅读,比较以下代码:money=10000000print("Iearn",money,"dollarsbywritingonmedium.")money=10_000_000print(f"Iearn{money}dollarsbywritingonmedium.")在这个例子中,代码的结果相同,但后者的代码通过使用下划线占位符和f字符串提供了更好的可读性。在Python3.6发布后,f-strings在处理带有更多变量的较长句子时开始使格式化变得更容易和更强大。作家的风格不应该在他的思想和读者的思想之间设置障碍。9特殊情况并没有特殊到违反这些原则关键是要为一般情况提供一致的支持,试图将一个繁琐的项目重组为一个简单的形式。例如,将类的代码结构化或根据其功能将其分类到不同的文件中,即使Python并不强制您这样做。由于Python是一种多范式编程语言,解决问题的一种强大方法是创建对象,这称为面向对象编程。面向对象编程是一种编程范式,它组织程序结构,以便可以将属性和行为视为单独的对象。它的优点是直观易操作,许多教程很好地解释了概念。10实用胜于纯粹这句格言与前一句相矛盾,提醒我们要保持平衡11永远不要默默地忽略bug让bug最终会留下隐含的bug,而这些bug更难发现。Python提供了健壮的错误处理,与其他语言相比,这对程序员来说并不难使用。try:x=int(input("PleaseenteranInteger:"))exceptValueError:print("Oops!ThisisnotanInteger.")exceptExceptionaserr:print(err)else:print(Youdidit!Greatjob!)finally:print(ヽ(??▽?)ノ)#1。此代码可能会中断。#2。如果存在值错误,则触发。#3。处理值错误以外的错误。#4。如果没有触发错误则执行。#5。无论是否触发错误都执行。根据Python文档:“即使语句或表达式在语法上是正确的,尝试执行它也可能导致错误。”特别是对于大型项目,我们不希望代码在经过耗时计算后崩溃。这就是异常管理的美妙之处。12除非明确需要这样做在某些情况下,小错误不会困扰您。但是,也许您想捕获特定的错误。要获得有关特定错误消息的更多详细信息,我建议阅读官方内置异常文档并找到您需要的内容。https://docs.python.org/3/library/exceptions.html13面对歧义,拒绝猜测重要的是不断学习,享受挑战,容忍歧义。我们谁都不知道它会如何结束。—MartinaHorner这句话优雅而抒情,但不是编程中的好比喻。歧义可以指不明确的语法、复杂的程序结构或触发错误消息的错误。例如,第一次使用numpy模块时的一个简单错误:importnumpyasnpa=np.arange(5)print(a<3)ifa<3:print(smallerthan3)ValueError:ambiguoustruthvalueforarraywithmorethanone元素,请使用a.any()或a.all()如果执行上面的代码,你会发现在输出中有一个5个布尔值的数组,说明该值在3以下。因此,不可能有一个if语句判断状态。使用消息中显示的内置函数.all()和.any()代替And/Or。importnumpyasnpa=np.array([True,True,True])b=np.array([False,True,True])c=np.array([False,False,False])print(a.all())print(a.any())print(b.all())print(b.any())print(c.all())print(c.any())输出显示.all()仅有效onallItems都为True,并且.any()在其中一项为True时返回True。14应该有一个,最好只有一个,最直接的方法来解决一个问题想想为什么Python被描述为一种易于学习的编程语言。Python拥有非凡的内置函数/库和高度的可扩展性,鼓励程序员优雅地编写代码。虽然有更多的解决方案提供了灵活性,但它们可能需要更多的时间来解决同样的问题。输入importantigravity并执行15当然这不可能一蹴而就,除非你是荷兰人GuidovanRossum,Python之父,是一位让这句格言无可争辩的荷兰程序员。你不会声称比他更了解Python……至少我不会。照片来自GitHub16做总比不做好你可以拖延,但时间不会,失去的时间一去不复返了。——本杰明·富兰克林对于像我一样有拖延症并且正在寻求改变的人来说,看看这个,这是与PanicMonster的合作。https://embed.ted.com/talks/tim_urban_inside_the_mind_of_a_master_procrastinator另一方面,这条格言的另一方面是阻止你过度计划,这并不比看Netflix更有成效。拖延和过度计划的共同点是“无事可做”。17做总比不做好“做总比不做好”并不意味着计划没有用。写下你的想法并设定一个要征服的目标比不假思索地去做要好。例如,我通常每个星期天都会花一个小时来制定我的每周计划,并在睡前更新我明天的计划,看看有什么需要推迟的。18如果解决方案难以解释,那一定是不好的。回想一下“复杂胜于晦涩”的观点。通常,晦涩难懂的代码意味着设计薄弱,尤其是在像Python这样的高级编程语言中。然而,在某些情况下,其领域知识的复杂性可能使实现难以解释,如何对其进行优化使其清晰易懂至关重要。这是一份可以为您提供帮助的规划项目指南。https://docs.python-guide.org/writing/structure/19如果实现很容易描述,那可能是使设计(甚至人们的生活)更容易的好解决方案,即使背景知识可能很深,这是编程知识的特长,我认为也是编程中最难的部分。利用Python的简单性和可读性来实现一些疯狂的想法。20个命名空间是个好主意,多使用它们!最后但同样重要的是,命名空间是一组用于组织各种对象的符号,以便可以通过唯一名称引用它们。在Python中,命名空间是由以下元素组成的系统:内置命名空间:无需创建自定义函数或导入模块(例如print()函数)即可调用。全局命名空间:当用户创建类或函数时,会创建一个全局命名空间。本地命名空间:本地范围内的命名空间。命名空间图命名空间系统防止Python模块名称之间的冲突。