新手请进:每个Python程序员都应该知道的10个缩写词

开发 后端
Python是许多编程初学者的首选语言,它的语法非常直观,并且具有支持动态类型的灵活性;此外,它还是一种解释性语言,可以使用交互式控制台进行学习。

 [[340605]]

Python是许多编程初学者的首选语言,它的语法非常直观,并且具有支持动态类型的灵活性;此外,它还是一种解释性语言,可以使用交互式控制台进行学习。基本上,只使用命令行工具(例如Mac中的Terminal)就能够开始学习Python,如今macOS系统已经附带了Python。

学习过程中,我们会逐渐熟悉它的数据结构、控制流、类、函数和其他基本知识。此外,还有一件有趣的事人们不常提起:时不时就会遇到Python中的各种首字母缩写词。

本文将回顾十个这样的缩写词,包括通用的编程原理以及特定的Python编码,每个词都有自己有用有趣的方面。

1. OOP(面向对象编程)

要介绍的第一个缩写是OOP——面向对象编程,这就是Python所基于的设计。

大家都知道编程本身是关于编码的,但是程序本身应该是关于数据的。程序需要获取输入数据、处理数据和输出数据。请注意,此处讨论的数据是最一般意义上的数据,可以包括表格数、字符串、用户操作(例如单击按钮)、图像以及任何形式的具有信息的数据。代码的工作就是处理各种形式的数据,并以所需的方式呈现它们。

为了完成工作,人们需要能够处理这些数据的代码,而现代编程语言(包括Python)中的一种常见设计模式就是采用OOP范例。这个想法非常直观——我们用特定的对象包装数据。

更具体来讲,对象可以保存数据(例如属性)并且可以操作数据(例如方法)。例如,如果开发一个赛车游戏,那么我们可以构建汽车对象,并且每个对象都可以具有特定的属性,如颜色、最大速度和重量。此外,这些对象还可以进行制动和加速等操作。这些数据的逻辑组织以对象(汽车)为中心。

下面来看一下Python中的特定示例。可以使用内置的str类包装字符串数据,人们不仅可以使用字符串对象传递字符串数据,还可以改变字符串的表示方式。请看一个非常琐碎的示例。

  1. >>># Create avariable of str type 
  2.         ... hello ="HelloPython!" 
  3.         ... 
  4.         ... # Send the data toa function call 
  5.         ... print(hello) 
  6.         ... 
  7.         ... # Manipulate thestring data with string methods 
  8.         ... hello_lower = hello.lower() 
  9.         ... hello_upper = hello.upper() 
  10.         ... print( lowercased: , hello_lower) 
  11.         ... print( uppercased: , hello_upper) 
  12.         ... 
  13.         HelloPython! 
  14.         lowercased: hello python! 
  15.         uppercased: HELLOPYTHON! 

字符串数据处理

2.DRY(不要重复自己)

DRY(不要重复自己)的原理是每个程序员都应该实践的最基本的规则之一。其含义很简单:如果发现代码中有任何重复,那么就表明需要进行一些重构,以实现最大程度地减少重复代码,或在可能的情况下完全删除任何重复信号。

以下示例通过应用DRY原理展示了一些代码的重构:

  1. defdo_something(item): 
  2.                         pass 
  3.              # Repetativework 
  4.                     do_something(item0) 
  5.                     do_something(item1) 
  6.                     do_something(item2) 
  7.              # Apply DRY 
  8.                     for item in (item0, item1,item3): 
  9.                         do_something(item) 

不要重复自己

代码重构的另一种可能情况是:发现自己要处理一堆具有相同结构的数据。应该考虑使用自己的类来处理这些数据,而不是使用一系列的字典、列表或元组来存储每个人的数据。这不仅可以使程序员本人的代码不易出现错误,而且对代码长期可维护性也很有帮助。

3. PIP(Python包安装和管理工具)

Python受欢迎的最重要因素是其开放源代码的特性,这种特性带来了大量免费的Python软件包。根据维基百科介绍,在Python软件包索引(PyPI)中索引了235000多个软件包。

我们可以使用pip工具从PyPI安装任何软件包。该安装过程非常轻松,只需在命令或终端中使用一行代码即可。以下代码段总结了一些常用用法。想要了解有关pip工具用法的更多信息,可以访问其官方网站:https://pip.pypa.io/en/stable/user_guide/。

  1. # install latest version 
  2.        pip install package_name 
  3.              # install aparticular version 
  4.        pip install package_name==version_number 
  5.              # to uninstall apackage 
  6.        pip uninstall package_name 
  7.              # to show installedpackages 
  8.        pip list 
  9.              # to show theinformation about a particular package 
  10.        pip show package_name 
  11.              # to install alist of dependencies, such as to clone a virtual environment 
  12.        pip install -rrequirements.txt 

PIP 使用示例

4. LEGB(函数内部作用域,函数内部与内嵌函数之间,全局作用域和内置作用域)

LEGB规则指的是Python中的变量查找顺序,如下图所示。具体来说,当解释器尝试解析变量时,Python具有四层作用域——了解将哪些值绑定到变量。

首先从内部范围开始,该范围可以是函数或类。如果解释器为该变量找到了相应的绑定值,那么它将停止查找并使用具有该特定值的变量。

可变分辨率规则

否则,它将在更高层次上查找——函数内部与内嵌函数之间。这一范围仅存在于函数的嵌套结构中。当在另一个函数中声明一个函数时,我们将内部函数称为内部函数,将外部函数称为外部函数。当解释器尝试解析内部函数范围内使用的变量时,如果无法在局部范围内解析,它将进入封闭范围,即外部函数的局部范围。

如果仍然无法解析封闭范围内的变量,它将转到全局范围。全局作用域通常是模块级别,通常是独立的Python文件。值得注意的是,将包导入当前文件时,导入中的函数和类也将成为全局范围的一部分。内置作用域是启动解释器时要加载的函数、类和其他模块,以使这些最基本的对象始终可用(例如print和其他内置函数)。

5. MRO(方法解析顺序)

方法解析顺序表示Python或编程语言通常如何解析方法或属性。上面讨论的LEGB规则关注的是解决变量,而MRO不同,它关注的是对象以及对象的方法调用或特定属性的获取如何解决。

MRO主要是在多继承的上下文中讨论的——从多个类(即超类)和/或继承的多层继承的类(即子类)。因为子类和超类都共享一些具有可能不同实现的通用方法,所以Python解释器需要一种机制来确定在特定调用中应使用哪种方法或属性,而这正是MRO负责的。

  1. >>>classX: 
  2.      ...    defbin(self): 
  3.      ...        print(f"bin called in X"
  4.      ... 
  5.      ... classY(X): 
  6.      ...    defgo(self): 
  7.      ...        print(f"go called Y"
  8.      ... 
  9.      ... classZ(X): 
  10.      ...    defgo(self): 
  11.      ...        print(f"go called Z"
  12.      ... 
  13.      ... classW(Y, Z): 
  14.      ...    defbin(self): 
  15.      ...        super().bin() 
  16.      ...        print(f"bin called W"
  17.      ... 
  18.      ...    defbingo(self): 
  19.      ...        self.bin() 
  20.      ...        self.go() 
  21.      ... 
  22.      ... w =W() 
  23.      ... w.bingo() 
  24.      ... 
  25.      bin called inX 
  26.      bin called W 
  27.      go called Y 

方法解析顺序

对于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。

  1. >>>print( W Class MRO: , W.__mro__) 
  2.           ... 
  3.           ... classW_(Z, Y): 
  4.           ...    pass 
  5.           ... 
  6.           ... print( W_ Class MRO: , W_.__mro__) 
  7.           ... 
  8.           WClassMRO: (<class  __main__.W >, <class  __main__.Y >, <class  __main__.Z >, <class  __main__.X >, <class  object >) 
  9.           W_ClassMRO: (<class  __main__.W_ >, <class  __main__.Z >, <class  __main__.Y >, <class  __main__.X >, <class  object >) 

特殊方法 __mro__

6.&7. EAFP(请求宽恕比许可更容易)和LBYL(事先检查)

EAFP(请求宽恕比许可更容易)编码风格是Python赖以生存的基础。由于Python是一种动态编程语言,因此在运行时可以实现对现有实例对象,类甚至模块的实现以及修改。因此,建议在假定特定属性或功能可用的情况下编写代码。

换句话说,如果某些代码可能存在特定问题,那么就让问题浮出水面并相应地解决它们。通过应用EAFP规则,如果我们想更进一步,就可以简单地使用try ... except语句编写特定代码,以处理代码可能引发的潜在异常。总之,宗旨就是如果发生意外情况,事后处理。

与EAFP原理相反,还有另一种称为LBYL的编码样式,它代表“事先检查”。使用这种编码方式,程序员可以在运行某些代码之前排除所有可能的不良情况。因此,就可以在更多遵循LBYL原则的项目中看到更多if语句。这种编码样式就是尽力以特定的方式防止一切问题。

以下代码段显示了使用EAFP与LBYL的可能方案。使用EAFP编码样式,只需将代码和预期的可能异常包装在try…except语句中,同时使用LBYL编码样式,必须使用内省法和值检查来验证除法之前的适用条件。

正如大家看到的,EAFP代码看起来更干净,并且没有创建嵌套结构。当然,如果愿意的话,也可以在项目中应用LBYL,最终项目仍然将以类似的方式工作。

  1. defwith_EAFP_divide_ten_by(number): 
  2.                                      try: 
  3.                                          print(f 10 divided by {number} is {10/ number}. ) 
  4.                                      exceptZeroDivisionError: 
  5.                                          print("You can tdivide zero."
  6.                                      exceptTypeError: 
  7.                                          print("You canonly divide a number."
  8.              defwith_LBYL_divide_ten_by(number): 
  9.                                      ifisinstance(number, int) orisinstance(number, float): 
  10.                                          if number ==0: 
  11.                                              print("You can tdivide zero."
  12.                                          else
  13.                                              print(f 10 divided by {number} is {10/ number}. ) 
  14.                                      else
  15.                                          print("You canonly divide a number."

EAFP vs. LBYL

8. PEP(Python增强建议书)

上一节大体讨论了编码样式,但是最有影响力的Python编码风格指南之一就是PEP 8——Python增强建议书#8,由BDFL(将在下文讨论)和其他几个Python核心维护者编写。

PEP涵盖了很多内容——所有与Python相关的内容,可以在官方网站上找到整个列表(https://www.python.org/dev/peps/。这里列出了一些著名的文章:

  • PEP 8: Style Guide for Python Code
  • PEP 257: Docstring Conventions
  • PEP 20: The Zen of Python
  • PEP 498: Literal String Interpolation
  • PEP 202: List Comprehensions
  • PEP 405: Python Virtual Environment

9. BDFL(仁慈的独裁者)

什么是BDFL?以下是维基百科的定义:仁慈的独裁者(BDFL)是少数开源软件开发领导者的头衔,他们通常是在社区中的争端或争论中保留最终决定权的项目创始人。

尽管这个定义通常适用于开源软件开发,但它最初是在Python社区中使用的,是指代Python编程语言的创建者Guido van Rossum(GvR)的一种方式。他在担任BDFL角色20多年之后,于2018年卸任,你可以在维基百科上找到更多关于BDFL的故事。

10. REPL(“读取-求值-输出”循环)

在笔者看来,REPL(“读取-求值-输出”循环)正是使学习Python如此轻松的便捷工具。我们可以像使用命令或终端窗口一样开始简单地学习Python编码,可以使用pip工具如前所示安装软件包。更重要的是,无需编写任何其他编程语言可能需要的IDE工具即可立即编写Python代码的第一行(例如可能应该是这行代码:print(“Hello World!”))。

来快速看一下它的样子吧:

  1. >>>print("HelloWorld!"
  2.             HelloWorld! 
  3.             >>>3*2 
  4.             6 
  5.             >>>type(5) 
  6.             <class int > 

REPL示例

REPL工作流程非常简单——阅读代码,对其进行评估,并在控制台中打印评估中的所有适用结果,然后循环重复这三个步骤以探索Python的各种功能。REPL在标准Python或其他常见的Python开发工具(例如ipython)中作为默认模式实现,这也是著名的Python学习和编码工具——Jupiter Notebook的基础。

Python是一种由BDFL GvR创建的灵活而强大的OOP语言。利用PIP,我们可以轻松地管理Python软件包,并通过REPL在控制台中学习语言和各种软件包。使用Python进行编码时,我们希望遵循PEP 8中概述的样式。其他重要的编码原理包括DRY和EAFP。如果愿意的话,也可以在编码中做一些LBYL。LEGB规则和MRO将帮助大家了解如何解析变量、属性和函数以使你的代码按预期运行。

这些Python“黑话”,你学会了吗?

本文转载自微信公众号「 读芯术」,可以通过以下二维码关注。转载本文请联系 读芯术公众号。

 

责任编辑:武晓燕 来源: 读芯术
相关推荐

2018-03-07 12:57:53

2012-02-28 10:52:13

2018-05-03 08:45:58

Linux命令

2023-12-27 09:00:00

Python魔术方法开发

2022-09-11 15:20:05

程序员命令开发

2012-10-11 10:32:48

Linux命令程序员

2024-04-24 14:52:26

JavaScriptWeb 开发

2021-10-18 10:21:28

程序员技能优化

2023-01-31 15:43:47

2024-04-10 12:36:41

硬件代码

2023-06-27 00:04:10

程序员JavaScript

2015-04-16 10:26:51

程序员 Python Ruby

2011-07-25 10:09:57

Python

2023-11-02 14:21:06

2016-06-22 09:30:58

Linux命令新手

2021-08-19 15:14:29

程序员电子表格Airtable

2013-03-20 17:58:41

虚拟内存程序员

2021-10-20 06:05:01

编程语言开发

2011-11-08 15:42:18

Linux操作系统

2014-07-16 09:34:44

点赞
收藏

51CTO技术栈公众号