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

如果你连这10个Python缩写都不知道,那你一定是Python新手

时间:2023-03-15 00:47:23 科技观察

简介对于很多刚开始学习编程的人来说,Python已经成为了他们的首选。Python具有非常直观的语法并支持动态类型的灵活性。此外,它是一种解释性语言,可以通过交互式控制台进行学习。基本上,我们只是使用命令行工具(如Mac中的终端)开始学习Python,因为Python默认安装在macOS中。当我们学习Python时,我们会逐渐熟悉它的数据结构、控制流、类、函数等基本内容。我发现有趣的一件事是我们在Python中经常遇到的各种首字母缩略词。在这篇文章中,我将介绍十个这样的缩写词。其中一些是通用编程原则,一些是特定于Python编码的。然而,每种方法都有其有趣的方面。1、OOP(Object-OrientedProgramming)我们必须知道的第一个缩写是OOP--Object-OrientedProgramming,它也是Python编程设计的基础。我们知道编程本身是关于编码的,但是程序本身应该是关于数据的。我们的程序需要获取输入数据、处理数据和输出数据。请注意,这里讨论的数据是一般意义上的数据,包括表格数据、字符串、用户操作(例如,按钮点击)、图像和任何形式的具有信息的数据。我们代码的工作是处理各种形式的数据并以所需的方式呈现它们。为了完成我们的工作,我们需要能够处理这些数据的代码,而现代编程语言(包括Python)中常见的设计模式就是采用OOP范式。这个想法非常直观——我们用特定的对象包装数据。更具体地说,对象可以保存数据(例如,属性)并且可以操纵数据(例如,方法)。比如我们开发一款赛车游戏。我们可以构建汽车对象,每个对象都可以具有特定的属性,例如颜色、最大速度和重量。此外,这些对象可以执行制动和加速等动作。这些数据的逻辑组织以对象(汽车)为中心。让我们看一个Python中的具体示例。我们可以使用内置的str类来包装字符串数据,这不仅允许我们使用string对象传递字符串数据,还可以改变字符串的表示方式。下面让我们看一个非常简单的例子。>>>#创建一个str类型的变量...hello="HelloPython!"...#向函数调用发送数据...print(hello)...#使用string方法操作字符串数据...hello_lower=hello.lower()...hello_upper=hello.upper()...print('lowercased:',hello_lower)...print('uppercased:',hello_upper)...HelloPython!小写:你好蟒蛇!大写:你好蟒蛇!2.DRY(Don'tRepeat)DRY原则(Don'tRepeat)是每个程序员都应该实践的最基本的规则之一。规则很简单:如果您注意到代码中有任何重复,则表明需要重构代码以最大程度地减少重复,或者尽可能完全删除它。以下伪代码向您展示了通过应用DRY原则重构一些代码。defdo_something(item):pass#重复工作do_something(item0)do_something(item1)do_something(item2)#ApplicationDRYforitemin(item0,item1,item3):do_something(item)代码重构还有一个应用场景:你发现自己是什么正在处理的是一堆具有相同结构的数据。与其使用一系列字典、列表或元组来存储每个人的数据,不如考虑使用您自己的类来处理数据。这不仅是为了减少代码出错的机会,也是为了便于长期维护。3、PIP(PythonPackageInstaller)Python流行的最重要的原因可能是它的开源性,这导致大量免费的Python包被源源不断地打开。根据维基百科,Python包索引(PyPI)中索引了超过235,000个包。我们可以使用pip工具从PyPI安装任何包。安装过程就像在命令或终端中输入一行代码一样简单。以下代码片段总结了一些常见用法。#安装最新版本pipinstallpackage_name#安装特定版本pipinstallpackage_name==version_number#卸载包pipuninstallpackage_name#显示已安装的包piplist#显示特定包的信息pipshowpackage_name#安装依赖列表,例如克隆虚拟环境pipinstall-rrequirements.txt4.LEGB(Local,Enclosing,Global,andBuiltin)LEGB规则是指Python中的变量查找顺序,如下图所示。具体来说,当解释器试图解析变量时,Python有四个级别的范围——知道将哪些值绑定到变量。从局部作用域开始,它可以是函数或类。如果解释器找到变量的相应绑定值,它就会停止查找并使用具有该特定值的变量。变量解析规则否则,它会在更高级别(封闭范围)中查找它。封闭作用域仅存在于函数的嵌套结构中。具体来说,当一个函数声明在另一个函数内部时,我们称内部函数为内部函数,外部函数为外部函数。当解释器试图解析在内部函数范围内使用的变量时,如果无法在局部范围内解析它,它将转到封闭范围,即外部函数的局部范围。如果它仍然无法解析封闭范围内的变量,它将转到全局范围。全局范围通常在模块级别,通常是一个单独的Python文件。值得注意的是,当我们将一个包导入到当前文件中时,导入的函数和类也会成为全局作用域的一部分。内置作用域是指解释器启动时加载的函数、类和其他模块,使这些最基本的对象始终可用(例如打印和其他内置)。5.MRO(MethodResolutionOrder)方法解析顺序表示Python或编程语言通常如何解析方法或属性。与上面讨论的专注于解析变量的LEGB规则不同,MRO专注于对象以及如何访问方法调用或对象的特定属性。MRO主要在多重继承的上下文中讨论——从多个类(即超类)和/或多级继承(即子类)继承的类。因为子类和超类都共享一些实现方法可能不同的公共方法,Python解释器需要一种机制来确定在特定调用中应该使用哪个方法或属性,这是MRO的责任。下面的代码片段显示了一个说明性示例。>>>classX:...defbin(self):...print(f"bincalledinX")...classY(X):...defgo(self):...print(f"gocalledY")...classZ(X):...defgo(self):...print(f"gocalledZ")...classW(Y,Z):...defbin(self):...super()。bin()...print(f"bincalledW")...defbingo(self):...self.bin()...self.go()。.....w=W()...w.bingo()...bincalledinXbincalledWgocalledY对于W类的实例(第22行),当我们调用bingo()方法时,此方法将在其自己的类中,因为它在类中定义(第18-20行)。但是,此方法将进一步调用bin()和go()方法。以类似的方式,bin()方法在它自己的类上解析,然而,它调用超类的bin()方法,如第15行所示。但是在它的直接超类(即Y和Z)中,两者都没有实现bin()方法,所以Python会比超类的超类(即X)高一级,实现并调用超类中的bin()方法。值得注意的是,对于W的go()方法,它的两个超类都实现了这个方法,但是正如你所看到的,只调用了Y类中使用的实现。这是因为我们在定义类W时,继承顺序是Y和Z,这会让MRO遵循同样的顺序。与此相关,我们可以使用特殊方法__mro__找出特定类的MRO,如下所示。此外,为了向您展示类继承顺序的重要性,我们创建了另一个类,其中类Z在类Y之前,这将更改类W_的MRO。>>>print('WClassMRO:',W.__mro__)...classW_(Z,Y):...pass...print('W_ClassMRO:',W_.__mro__)..WClassMRO:(<类'__main__.W'>,,,,)W_ClassMRO:(,,,,)6.&7.EAFP(请求比请求许可更容易原谅)和LBYL(三思而后行)EAFP(请求原谅比许可更容易)编码风格是Python蓬勃发展的地方。由于Python是一种动态编程语言,因此可以在运行时对现有实例对象、类甚至模块进行实现和修改。因此,建议您在假设某些属性或功能可用的情况下编写代码。换句话说,如果某些代码可能存在特定问题,让问题浮出水面并相应地解决它们。通过应用EAFP规则,如果我们想更进一步,我们可以简单地使用try...except语句编写特定代码来处理代码可能抛出的潜在异常。基本上,我们的想法是发生了意想不到的事情,然后我们进行处理。与EAFP原则相反,还有另一种编码风格称为LBYL,代表“leapfrogged”。使用这种编码风格,程序员应该在某些代码运行之前排除所有可能的意外情况。因此,在项目中可以看到更多遵循LBYL原则的if语句。这种编码方式基本上可以防止以临时方式出现任何问题。下面的代码片段显示了使用EAFP和LBYL的可能场景。对于EAFP编码风格,我们只需要在try...except语句中包装代码并期待可能的异常,而对于LBYL编码风格,我们必须在划分之前使用内省方法和值检查来验证适用条件。如您所见,EAFP代码看起来更简洁并且不会创建嵌套结构。当然,如果需要,您可以将LBYL应用于您的项目,它不会改变您的项目最终运行的方式。defwith_EAFP_divide_ten_by(number):try:print(f'10dividedby{number}is{10/number}.')exceptZeroDivisionError:print("Youcan'tdividezero.")exceptTypeError:print("Youcanonlydivideanumber.")defwith_LBYL_divide_ten_by(number):ifisinstance(number,int)orisinstance(number,float):ifnumber==0:print("Youcan'tdividedzero.")else:print(f'10dividedby{number}is{10/number}.')else:print("Youcanonlydivideanumber.")8.PEP(PythonEnhancementProposal)在上一节中,我们讨论了编码风格。然而,最有影响力的Python编码风格指南之一是PEP8-PythonEnhancementProposal#8,由BDFL(下面讨论)和其他几个Python核心维护者共同撰写。PEP涵盖了与Python相关的所有内容。您可以在官方网站上找到完整列表。以下是一些知名文章:PEP8:Python代码风格指南(https://www.python.org/dev/peps/pep-0008/)PEP257:文档字符串约定(https://www.python.org/dev/peps/pep-0257/)PEP20:Python之禅(https://www.python.org/dev/peps/pep-0257/)PEP498:文字字符串插值(https://www.python.org/dev/peps/pep-0498/)PEP202:列表理解(https://www.python.org/dev/peps/pep-0202/)PEP405:Python虚拟环境(https://www.python.org/dev/peps/pep-0405/)9.BDFL(BenevolentDictatorofLife)什么是BDFL?当然,标题告诉你它代表什么,但它到底是什么意思?在维基百科上,它的定义是:BenevolentDictatorofLife(BDFL)是对少数开源软件开发领导者的称号,他们通常是项目创始人,在社区内的争议或辩论中保留最终决定权。尽管这个定义通常适用于开源软件开发,但它首先在Python社区中被用作对Python编程语言的创建者GuidovanRossum(GvR)的引用。在BDFL工作20多年后,于2018年退休。10.REPL(read-evaluate-printloop)在我看来,REPL(read-evaluate-printloop)是一个方便的工具,让我们可以如此轻松地学习Python。众所周知,我们甚至可以像使用命令或终端窗口一样轻松地开始学习Python编程。您可以使用之前所示的pip工具来安装任何包。更重要的是,我们可以立即编写第一行Python代码,而无需使用其他编程语言配置任何IDE工具。>>>print("HelloWorld!")HelloWorld!>>>3*26>>>type(5)REPL工作流程非常简单——在控制台中读取代码,对其进行评估并打印出任何适用的结果,然后反复重复这三个步骤来探索Python的各种特性。REPL在标准Python或其他常见的Python开发工具中作为默认模式实现,例如ipython,著名的Python学习和编码工具JupiterNotebook的基础。结论Python是由BDFLGvR创建的一种灵活而强大的OOP语言。通过pip命令,我们可以很方便的管理Python包,通过REPL在控制台学习语言和各种包。当我们用Python编程时,我们必须遵循PEP8中概述的风格。其他重要的编码原则包括DRY和EAFP。如果你愿意,你也可以在编码中做一些LBYL。LEGB规则和MRO可以帮助您了解如何解析变量、属性和函数,以便您的代码按预期运行。