python doc2 glossary

术语

原文地址

Points

  • 理解装饰器
  • descriptor(python描述符?新型对象?)Implementing Descriptors
  • str()&repr()的区别
  • list comprehension, 列表推导式
  • metaclass,元类,个性化定制类,提供高级功能
  • method resolution order,方法解析顺序
  • namedtuple,命名元组
  • namespace
  • object
  • reference count,sys.getrefcount()

Glossary

>>>:python交互式shell默认提示符(prompt)。经常在解释器中可执行的代码示例中看到。

...:python解释器中用于缩进的代码块或者匹配分隔符中间部分。

2to3 通过解析源代码,检测(detect)处理不兼容部分,将python2.x代码转换成python3.x代码。在标准库lib2to3,标准库的入口点是Tools/scripts/2to3。

abstract base class:抽象基类,抽象基类提供定义接口的方式补足duck-type的缺陷,像hasattr()存在的笨拙、隐秘的不足。ABCs(抽象基类)采用抽象子类,抽象子类没有从其它类继承但依然是类,能被isinstance()issubclass()识别。阅读abc模块的文档。python给自己的数据结构、数字类型、流对象提供了很多内置ABCs,你也可以使用abc模块创建自己的ABCs。

argument:实参,函数或方法调用时传递给函数的值。有两种类型:

  • keyward argument(关键字参数):函数调用中标识符(identifier)(name=)开头的参数或者通过**dict解析的参数。e.g.:
complex(real=3, imag=5)  
complex(**{'real': 3, 'imag': 5})  
  • positional argument(位置参数):位置参数按照参数list顺序直接传入或者*iterable传入:
complex(3, 5)  
complex(*(3, 5))  

attribute(属性):和对象相关连的值,通过名字.表达式表示。如果对象o含有属性a,可以用o.a表示a。

BDFL:Benevolent Dictator For Life,吉多·范罗苏姆,python缔造者。

bytes-like object(类字节对象):像str,bytearray,memoryview等对象支持buffer protocol。类字节对象可以应用操作二进制数据:比如压缩,保存为二进制文件或者通过socket发送。一些操作需要二进制数据可变,这样并不是所有的类二进制对象都可以操作它们。

bytecode(字节码):python源代码会被编译成字节码,这是python程序在CPython解释器中的内部表示。字节码会被缓存成.pyc.pyo文件加快执行速度。“中间态语言”运行在虚拟机中,虚拟机可以执行和字节码对应的机器码。注意,字节码不能在不同的python解释器中运行,也不保证能在不同python版本中稳定运行。

class:创建用户定义对象的模板。类定义通常包含定义方法来操作类实例。

classic class:不继承任何对象的类。python3中已经移除。

coercion:强制类型转换。涉及两个不同参数操作间将实例类型隐式转换。int(3.12)将浮点型转换成整型。但是对于3+4.23这样的操作,在执行加法运算之前参数必须转化成相同的类型。使用内置的coerce函数,3+4.23等价于operator.add(*coerce(3, 4.5)),最后是operator.add(3.0, 4.5)。如果不使用隐式转换,程序员要把参数转换成相同(互相兼容)的类型。float(3)+4.23

complex number(复数):实数系统的扩展,每个数字由实部和虚部组成。单位虚数的平方是-1,数学领域用i表示、工程领域用j表示。python支持复数,虚部用j表示。在math和cmath模块中。属于高级数学运算,如果你不需要它们,直接忽略就好。

context manager(上下文管理器):用于控制with语句的上下文变量,with定义了__enter__()__exit__()方法。

2016.9.29

CPython:Python语言的官方实现,(虚拟机,解释器),“CPython”用于区别Jython个IronPython。

decorator:装饰器,函数的返回值也是函数,@wrapper语法用于函数转换。常见的例子是classmethod()staticmethod()。装饰器不过是一种语法糖,下面两种函数实现在语义上等价:

def f(...):  
    ...
f = staticmethod(f)

@staticmethod
def f(...):  
    ...

相似的概念同样存在于类中,但是这里很少用。参见function definitionclass definition

descriptor:描述符?定义了__get__()/__set__()/__delete__()方法的新型对象。当类的属性是描述符时,当属性被调用时,属性绑定的描述副会被触发。通常,通过a.b查找类a字典中的对象b,然后get/set/delete b。但如果b是描述符,会调用b各自的描述器。理解描述器是理解python的关键,因为python的许多基础特性:函数、方法、属性、类方法、静态方法以及超类的引用等的关键。

dictionary:关联数组,任意key都有对应的value。key可以是任何包含_hash()eq_()的对象。Perl中被成为hash。

dictionary view:dict.viewkeys()/dict.viewvalues()/dict.viewitems()返回的对象被字典视图。它们提供了字典实体的动态视图,当字典改变时,视图会反映变化,使用list(dictview)强制将视图对象转化为list。详情见Dictionary view objects

docstring:出现在class,methods或module的第一个字符表达式,当它们被执行时docstring会被自动忽略。docstring会被编译器识别放入__doc__属性中,可以通过內省机制获得。

duck-typing:鸭子类型。是一种编程风格,即不以对象的类型判断是否含有某接口;相反,属性或者方法只有被调用或者使用才能判断是否有这个属性(就像只有听鸭子叫才知道这个是鸭子)。通过强调接口而不是类型细节,良好设计的代码从而提高灵活性允许多态替换。鸭子类型避免使用type()isinstance()测试,(鸭子类型可以用来补充抽象基类)但是它使用hasattr()测试或者EAFP编程。

EAFP:Easier to ask for forgiveness than permission缩写,是一种处理风格,根据自己的语气去执行任务,在此过程中检测并处理由于不匹配产生的所有错误和异常。假设存在合理的keys或属性或者假设错误是能够捕获异常,即常见的try,expect语句。这项编码风格可以和其它语言的LBYL风格对比。

expression:表达式,有返回值的代码集合。statements不能用作表达式,想print和if。Assignments也是statements不是expression。

extension module:使用C/C++编写,通过python C API交互。

file object:暴露面向file的底层资源API(read()/write()),可以获取真实的硬盘文件或者其它存储类型的文件或者通信设备(标准输入输出/内存缓存/sockets/pipes ...)。File对象又被称为类文件类型/流。有三种文件类型:行二进制文件/缓冲文件/文本文件。接口定义在iomodule中。

file-like object:同File Object

finder:用来查找模块loader的对象,他必须实现find_module()方法。

floor division:向后取整除法。//,11//4=2。从坐标轴理解(坐标轴的负方向)。

function:返回一些值给调用者的句子组合。可以传入0到多个参数。、

_future_:伪模块方便开发者做向后兼容(语言更新后不适用当前解释器的情况):

>>> 11/4
2  
>>> 11//4
2  
>>> from __future__ import division
>>> 11 //4
2  
>>> 11/4
2.75  

garbage collection:对象不再使用时用来释放内存。

generator:函数,返回一个迭代器。包含yield语句,处理for-loop或者含有next()的函数。没一个yield会推迟处理并记住执行语句的位置(包括本地变量或者try语句),调用生成器时,会返回这个位置。

generator expression:返回迭代器的表达式。

sum(i*i for i in range(10))  

GIL:全局解释器锁。CPython解释器使用的机制,用来确定一次只有一个线程执行python字节码。锁定解释器使得我们更容易实现解释器多线程,但是这是以牺牲多核机器并行机制为代价。

但是,一些扩展模块或者第三方包,面对计算密集型任务:压缩和哈希或释放GIL,或者在IO时也释放GIL。(这样就可以利用多核的并行机制优势了)

过去人们努力实现“自由线程”的解释器(更细粒度数据共享下会锁定解释器),但一直没能成功,因为单核情况下性能损耗非常大。要克服性能问题非常复杂,需要更昂贵的代价去维护。

hashable:对象在自己的生命周期内有不变的哈希值(hash()方法),可以和其它对象比较(eq() or cmp()方法)这时我们说这个对象是hashable,可哈希对象相等必须含有相同的hash value。

dict和set内部使用hash,所以可哈希的对象在dict和set中很有用。

所有python内置不可变对象都是可哈希的。用户定义的类的对象默认可哈希,可以通过id()获取哈希值。

2016.9.30

IDLE:Python集成开发环境。

immutable:有固定值的对象,不可变对象包括 numbers/strings/tuple。这些对象不能修改,如果要存储新的值必须创建新的对象。不可变对象在需要常亮哈希值发挥重要作用,比如dict。

integer division:数学出发抛弃了结果的余数。11/4结果是2而不是2.75,这被称为floor division向后取整除法。

importing:导入python module的代码到当前代码。

interactive:Python提供了一个交互式的解释器,你可以根据提示符输入表达式或语句,解释器会立刻执行并返回结果。可以使用help()函数获取结果。

interpreted

iterable:可迭代,一个对象一次返回一个成员,包括所有的序列类型(list,str,tuple)和一些非序列类型(dict,file)以及任何实现__iter__()或者__getitem__()方法的对象。它应用在for-loop和需要序列类型的地方(zip(),map())。当可迭代对象作为参数传递给内置的iter()方法时,会返回对象的迭代器。使用迭代对象时,我们不需要手动调用iter()或者处理对象,for-loop会帮我们自动处理,在循环期间会创建临时无名称变量存储迭代器

iterator:一个对象实际上是a stream of data流动的数据,重复调用iterator的next()方法会一次返回流数据的item,当不再有数据时会抛出StopIteration异常,这时迭代器的数据已经被循环结束,调用next()会报错。迭代器内部需要实现__iter__()方法,用来返回迭代器对象本身。所以每个迭代器本身也是可迭代的。

将容器对象(list等)传给iter()或者for-loop时,会产生一个新的迭代对象。

key function:关键字函数(key function)或排序函数(collation function)是只能够调用返回值用来排序的函数。locale.strxfrm()返回的关键字用来获取区域特定的约束信息。

Python中的许多函数接受关键字函数以便控制元素的控制或分组:min(),max(),sorted(),list.sort(),heapq.nsmallest(),heapq.nlargest()和itertools.groupby()。

有很多方法创建关键字函数,str.lower()可以作为大小写敏感的关键字函数。或者通过lambda表达式创建特定的关键字函数。另外,operator模块3个关键字函数构造器:attrgetter(),itemgetter(),methodcoller9)。参考Sorting HOW TO获取更多例子或构造关键字函数的方法。

keyword argumentargument

lambda:匿名内联函数,有一个表达式构成,在函数调用时计算表达式。语法是:

lambda [argument] : expression  

LBYL:Look before you leap。这种编码风格明确在调用函数之前要测试检查先决条件。与EAFP风格形成对比。LBYL的特征是有许多if语句。

在多线程环境中,LBYL风格可能引发“The lool”与“you leap”之间的竞争。

if key in mapping: return mapping[key]  

上述代码可能会失败如果另一个线程在测试后删除了key,这个问题可以通过锁机制或者EAFP方法解决。

list:内置列表类型,和其它语言中的数组类似,访问元素的时间复杂度是O(1)。

list comprehension:列表推导式,通过简洁的方法处理序列中的全部或部分元素,并返回list作为结果。

result = ["0x%02x" % x for x in range(256) if x % 2 == 0]  

loader:用于加载模块的对象。必须定义名为load_module()的函数,loader通常由finder返回,详情参考PEP 302

mapping:是容器对象,支持任意键查找和实现了Mapping或MutableMapping抽象基类中的指定方法。想dict,collection.defaultdict,collection.OrderedDict和collection.Counter。

metaclass:a class of class,类的定义创建了类的名字、类字典和基类列表。元类负责接受这3个参数创建类。大多数面向对象的编程语言提供了创建类默认的实现。对于Python特别的地方在于它提供了创建可定制元类的能力。大多数用户不需要这个工具,但是一旦需要,元类能够提供强大优雅的解决方案。它已经用在日志属性获取、线程安全添加、对象创建跟踪等任务。

更多内容参考Customizing class creation

method:定义在类的主体中。如果作为类实例的属性被调用,方法会默认把对象实例作为第一个参数(即self).参考function,nested scope

method resolution order:方法解析顺序(MRO),是基类搜索检测成员时的顺序。阅读The Python 2.3 Method Resolution Order了解自Python2.3后使用的搜索算法。

module:是对象,用来组织代码单元。模块有一个名称空间可以包含任意python对象。通过importing加载模块。

mutable:值可变的对象,id()方法。

named tuple:命名元组,类元组类,可加索引元素可以通过名字属性获取(time.localtime()类元组对象,返回值的year可通过t[0]或者t.tm_year获取):

>>> t = time.localtime()
>>> t
time.struct_time(tm_year=2016, tm_mon=10, tm_mday=1, tm_hour=19, tm_min=27, tm_sec=3, tm_wday=5, tm_yday=275, tm_isdst=0)  
>>> t[0]
2016  
>>> t.tm_year
2016  

命名元组可以是内置类型,比如:time.struct_time,也可以是普通类定义。全特性命名元组还可以通过工厂函数collection.namedtuple()创建。工厂函数创建的元组对象提供额外的特性比如自文档表达 Employee(name='jones', title='programmer')

namespace:名称空间,存储变量的范围/地方,通过字典实现。在对象(方法)中有local/global/built-in以及nested(嵌套)名称空间。通过避免命名冲突提供modularity(模块性)。例如,builtin.open()和os.open()通过名称空间区分。明确那个模块实现了函数,提高了可读性和可维护性。random.seed()和itertools.izip()表明什么模块实现了方法。

nested scope:嵌套范围,在封闭的范围内引用变量。在f1中定义的函数f2可以引用f1中的变量。需要注意的是嵌套范围仅供参考,不用与分配,分配只应用与最里面的范围。相反,local variable(本地变量?)在最里的范围可读可写。同样,global variable(全局变量)可在全局范围内读写。

new-style class:任何对象都继承子object,包括所有的内置类型像list和dict。只有新风格的类可以使用python最新的、通用的特性,像solts,描述符,属性和getattribute()。详情参考New-style and classic classes

object:类的实例。带有状态(属性或值)和行为定义(方法)。new-style class的终极基类。

package:python模块可以包含子模块或递归子包。技术上讲,package是含有__path__属性的python模块。

parameter:形参。函数中的命名实体,指明函数能够接受的参数。有四种类型的形参。

  • positional-or-keyword(位置/关键字参数):def func(foo, bar=None): ...
  • positional-only:abs(),参数个数1个。
  • var-positional,序列参数,def func(*args, **kwargs)中的*args
  • var-keyword,def func(*args, **kwargs)中的**kwargs

Python 3000:python 3.x昵称,简称Py3k

Pythonic:python化的语言。

reference count:引用计数,对象被引用次数。当对象的引用计数为0时,释放对象。引用计数通常对python代码不可见,但是它是CPython实现的关键元素。sys模块定义了getrefcount()函数,可以返回指定对象的引用计数。

_slots_:new-style class中的概念,通过预先声明实例空间和消除字典节省内存。尽管流行,这项技术需要掌握才能正确使用。它可以保留应用在存在大量实例且内存关键型的应用中。

sequence:序列。可迭代,支持整型索引获取元素(get()方法)、len()的序列。一些内置序列类型有list,str,tuple,unicode。注意,dict被认为是映射(mapping),因为检索dict使用任意key的类型是不可变类型而不是整型。

slice:包含序列部分内容的对象。getslice(),setslice()。

special method:python隐式调用的操作类型,比如加法。这种方法的开头和结尾都是两个下划线(getattr(),sys.getrefcount_())。但它们没有命名元组方法:make()或asdict()。结构化序列的例子有sys.floatinfo()和os.stat()的返回值。

triple-quoted string:三引号字符。有三个引号"'包裹的字符串。它们不提供任何函数功能也不能使用单引号,但是它们有很多作用。

type:类型,决定python中对象的类型。每个对象都有一个类型。可以通过__class__属性或者type(obj)获得。

universal newlines:通用换行,解释文本流的方式,以下都被认为是一行的结束:\n,\r\n,\r

virtual environment:虚拟环境。提供隔离的python运行环境,不会影响系统本身的python环境。

virtual machine:软件定义的计算机。

Zen of Python:Python之禅,python设计原则和思想,帮助我们更好地理解语言。可以通过import this早python解释器中导入。