7 Dec 2009

Python标准库手册 - 2. 内置函数 - 3 & 3. 次要内置函数

2. 内置函数 - 3:S-Z



set([iterable])
    返回一个新集合,元素来自可选参数iterable.set类型在集合类型中有描述 - set, frozenset.
   
    其他容器请参看内置dict,list,tuple类和collections模块.
    2.4版本新增

setattr(object, name, value)
    这是getattr()的对应函数.参数分别是对象,字符串和任意值.字符串可能是一个已有属性或者新的属性.如果object允许,此函数会将value指定给对应属性.例如setattr(x, 'foobar', 123)等价于x.foobar = 123.

slice([start], stop[, step])
    返回由range(start, stop, step)指定的索引集合表示的切片对象.start和step参数默认为None.切片对象含有只读数据属性start, stop和step,它们仅仅返回参数值(或者默认值),而无其他明确的功能;然而它们被Numerical Python和其他第三方扩展使用.扩展索引语句也会生成切片对象.例如: a[start:stop:step]或者a[start:stop, i].参考返回迭代器的替代版本itertools.islice().



sorted(iterable[, cmp[, key[, reverse]]])
    根据iterable的元素,返回一个排过序的新列表.
   
    可选参数cmp, key和reverse与list.sort()方法的参数意义相同(在可变序列类型一节有描述).
   
    cmp指定一个个性化的2参数(迭代器元素)的比较函数,该函数根据第一个参数小于,等于或者大于第二个参数返回负数,0或者正数: cmp=lambda x,y: cmp(x.lower(), y.lower()).默认值是None.
   
    key指定一个从每个列表元素提取比较键值的单参数函数: key=str.lower.默认值为None.
   
    reverse是一个布尔值.如果为True,列表元素的排序会把每次比较都颠倒.
   
    总的来说,key和reverse转换过程比指定一个等价的cmp函数快得多.这是因为对每个列表元素cmp会被多次调用,而key和reverse仅访问每个元素一次.转换老式cmp函数为key函数,请参考ASPN食谱-CmpToKey偏方.
    2.4版本新增

staticmethod(function)
    返回function的静态方法.
   
    静态方法不接受隐含第一参数.采用如下方式定义一个静态方法:
    
    class C:
        @staticmethod
        def f(arg1, arg2, ...): ...


    @staticmethod形式是函数修饰符 - 参看函数定义一节详细描述.

    它可被类(C.f())或者实例(C().f())调用.实例会被忽略.
   
    Python的静态方法与Java或者C++类似.高级概念参看本节classmethod().
   
    更多信息请参考标准类型层次的文档.

    2.2版本新增.
    2.4版本改动:增加函数修饰符.


str([object])
    返回表示object可美观打印的描述字符串.对于字符串对象,返回字符串本身.与repr(object)的不同在于,str(object)不会总尝试返回可被eval()接受的字符串;它的目标是返回一个可打印字符串.如果没有参数,返回空字符串''.
   
    关于字符串更多信息参看序列类型功能描述(字符串也是序列) - str, unicode, list, tuple, buffer, xrange,或者字符串方法一节描述的字符特殊方法.使用模板字符串或者%操作符(字符串格式化操作章节)输出格式化字符串.另外也可参考字符串服务章节,或者unicode().
   
sum(iterable[, start])
    从start开始,对iterable的所有元素从左至右求和,并返回.start默认值为0.iterable的元素一般为数字,不能为字符串.快速正确的字符串序列连接方法是调用''.join(sequence).注意sum(range(n), m)等价于reduce(operator.add, range(n), m).浮点值扩展精度加法参考math.fsum().
    2.3版本新增
   
super(type[, object-or-type])
    返回一个调用type父类或者胞类的方法的代理对象.在访问类中被重载的继承方法时很有用.搜索顺序与getattr()相同,但是type本身会被跳过.

    type的__mro__属性列出getattr()和super()使用的方法判定搜索顺序.这个属性是动态的,且继承层次更新时会被改变.
   
    如果第二个参数省略,返回的super对象是非绑定的.如果第二参数是object, isinstance(obj, type)必须为真.如果第二个参数是一个type, issubclass(type2, type)必须为真(类方法很有用).

    注意:
    super()只对新式类有效.
   
    super有2个典型应用.单重继承的类层次,super可以不用明确指明名称指代父类,得以提高代码的可维护性.这种用法跟其他编程语言的super极为相似.
   
    第二种用法在动态执行环境下支持合作多重继承.这种用法仅在python中有,绝对不会在静态编译语言或者只支持单重继承的语言中发现.这样让实现"钻石图"成为可能 - 多个基类做实同一个方法.好的设计让这个方法在各种情况下有相同的调用签名(由于调用顺序在执行时被确定,也由于顺序适应类层次的改变,还由于顺序包含在运行之前不知道的兄弟类).
   
    两种情况下,典型的超类调用如下:
    
    class C(B):
        def method(self, arg):
            super(C, self).method(arg)
    

   
    注意super()做实为显式点属性查找绑定过程的一部分,例如super().__getitem__(name).它做实自己的__getattribute__()方法以可预知的,支持合作多重继承的顺序来搜索类.相应的,对于使用语句或者操作符的形如super()[name]的隐式查找,super()并未定义.
   
    还要注意,super()不仅限于用作内部方法.两个参数的形式指明了参数并且做了恰当的引用.
    2.2版本新增

tuple([iterable])
    返回一个元组,其元素与iterable元素相同且有相同的顺序.iterable可能是序列,支持迭代的容器,或者一个迭代对象.如果iterable已经是tuple,不做任何修改返回它.例如,tuple('abc')返回('a','b','c'),tuple([1,2,3])返回(1,2,3).如果未指定参数,返回新的空元组, ().
   
    元组是不可变序列类型,在序列类型中有文档 - str, unicode, list, tuple, buffer, xrange.其他容器参看内置类dict, list,set和collections模块.

type(object)
    返回对象的类型.返回值是类型对象.推荐使用内置函数isinstance()来测试对象的类型.
   
    下面会介绍含有3个参数的type()函数作为构建器使用.

type(name, bases, dict)
    返回一个新的类型对象.这是类语句本质上的动态形式.name字符串是类名,会变成__name__属性;bases元组逐条列出基类,会变成__bases__属性;dict字典是包含类体定义的命名空间,会变成__dict__属性.例如,如下的2条语句创建了相同的类型对象:
    
    >>> class X(object):
    ...     a = 1
    ...
    >>> X = type('X', (object,), dict(a=1))
    

    2.2版本新增

unichr(i)
    返回unicode码是整数i的字符的unicode字符串.例如,unichr(97)返回字符串u'a'.对于unicode字符串,这是ord()函数的逆函数.参数的有效范围基于python如何配置 - 可能是UCS2 [0..0xFFFF]或者UCS4 [0..0x10FFFF].否则抛出ValueError异常.对于ASCII和8位字符串参看chr().
   
    2.0版本新增

unicode([object[, encoding[, errors]]])
    根据下面的模式,返回object的unicode字符串版本:
    如果encoding和/或者error该出,unicode()将使用encoding的解码器对克表示为8位字符串或者字符缓冲区的object解码.encoding参数是一个字符串,它指定了编码的名称;如果是未知的encoding会抛出LookupError异常.异常处理机制会根据errors处理异常;它指定了输入编码字符无效时的处理方式:如果errors是'strict'(默认)会抛出ValueError异常;如果是'ignore'则忽略;'replace'会使用官方unicode替换字符U+FFFD替换不能被编码的输入字符.参考codecs模块.

    如果没有给出可选参数,unicode()的行为类似str(),区别是返回的是Unicode字符串而非8位字符串.明确点说就是,如果对象是Unicode字符串或其子类,将会返回Unicode字符串,而不会附加任何编解码.

    对于提供了__unicode__()方法的对象,会直接无参数呼叫这个函数创建一个unicode字符串.对于其他对象,则请求一个8位字符串版本或者描述,然后使用默认编码器并以'strict'模式转换为unicode字符串.

    关于unicode字符串的更多信息,请参看描述序列功能的序列类型-str(字符串),unicode,list(列表),tuple(元组),buffer,xrange(unicode字符串也是序列),也可以参考字符串方法一节具体关于字符串的方法.为了输出格式化字符串,可以使用字符串格式化操作符一节提供的模板字符串或者%操作符方法,也可参考字符串服务一节.参考str().

    2.0版本新增
    2.2版本改动: 支持__unicode__().


vars([object])
    没有参数时,类似locals().

    如果指定参数为模块,类或者类实例对象(或其他拥有__dict__属性的对象),返回其属性.

    注意:
    返回的字典不可编辑: 对相应的符号表的影响未定义.(目前的实现中,局部变量绑定一般不会被如此影响,但从其他作用域(例如模块)获得的变量会受此影响.可能将来版本会有改变.)

xrange([start], stop[, step])
    本函数非常类似range(),但是返回一个"xrange"对象而非列表.这是一个不明序列类型,与相应的列表有相同的值,但是并非同时储存这些值.与range()相比,一般情况下xrange()的优势很小(由于xrange()仍然需要在请求值时创建这些值),除非请求的range范围极大而机器内存有限;或者并非所有range的元素会被使用(例如一个循环可能被中途break跳出).

    CPython实现细节: xrange()是简单而快速的.实现可能添加了一些约束来达到此目的.Python的C实现约定所有参数都是原生C的long类型(python的short整型),并要求元素的个数也满足原生C的long类型.如果需要更大的范围,可以使用itertools模块来提供一个代替版本: islice(cout(start,step),(stop-start+step-1)//step).

zip([iterable, ...])
    本函数返回一个列表或元组,其中第i个元组包含每个序列或迭代器参数的第i个元素.返回的列表长度会被截断与最短的序列参数等长.当多个等长参数,zip()与初值参数为None的map()非常类似.如果只有一个序列参数,返回仅含一个元组的列表.如果没有参数,返回一个空列表.

    迭代器按照从左至右顺序赋值,因此可以使用此函数将一系列数据聚类为长度为n的群: zip(*[iter(s)]*n).

    zip()与*操作符连用可被用来解压一个列表.

    
    >>> x = [1, 2, 3]
    >>> y = [4, 5, 6]
    >>> zipped = zip(x, y)
    >>> zipped
    [(1, 4), (2, 5), (3, 6)]
    >>> x2, y2 = zip(*zipped)
    >>> x == list(x2) and y == list(y2)
    True
    


    2.0版本新增
    2.4版本改动:此版本前,zip()要求至少一个参数,如果没有指定参数,会抛出TypeError异常而非返回空列表.


__import__(name[, globals[, locals[, fromlist[, level]]]])
    注意:
    这是一个高级函数,日常Python编程不会用到.
   
    本函数会被import声明调用.它可被替代以改变import声明的语义(导入内置模块并指定builtins.__import__),但如今使用import钩子很容易(参考PEP302).直接使用__import__()很少见,除非你想导入一个模块,而此模块的名称仅在运行时可知).
   
    本函数导入模块name,后台使用给定的globals和locals来决定如何解释包里面名称.fromlist指定了需要从name模块中导入的对象或者子模块的名称.标准的实现根本不会使用locals参数,仅使用globals来决定import声明的包内容.

    level指定了使用绝对或者相对导入.默认值为-1,表示绝对和相对导入都会被尝试.0表示仅使用绝对导入.正值表示相对呼叫__import__()的模块的路径需要搜索的父路径数目.

    当name变量形式为package.module,一般的,顶层package(点之前的名称)被返回,而非name指定的模块.但是,如果给出非空参数fromlist,name指定的模块被返回.

    例如,语句import spam返回的字节码类似于下面的代码:
    
    spam = __import__('spam', globals(), locals(), [], -1)
    


    而语句import spam.ham的结果
    
    spam = __import__('spam.ham', globals(), locals(), [], -1)
    


    注意:为何这儿__import()返回顶层模块,由于此模块被import语句绑定了一个名称.

    另一方面,语句from spam.ham import eggs, sausage as saus的结果如下:
    
    _temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1)
    eggs = _temp.eggs
    saus = _temp.sausage
    


    这儿,spam.ham模块被__import__()返回,待导入的名称从此对象获取并指定为相应的名称.
   
    如果你仅仅想简单使用name导入一个模块(在一个包中),可以呼叫__import__()然后查看sys.modules:
    
    >>> import sys
    >>> name = 'foo.bar.baz'
    >>> __import__(name)
    <module 'foo' from ...>
    >>> baz = sys.modules[name]
    >>> baz
    <module 'foo.bar.baz' from ...>
    


    2.5版本新增: 添加level参数; 参数支持关键字.

3. 非必要内置函数



现代的Python编程时有一些内置函数不再需要学习,使用甚至知道.保留于此仅为了保持向后兼容那些使用老版本python写的程序.

Python程序员,培训人员,学生和书籍作者可以直接跳过这些函数而不用考虑是否错过了某些重要的东西.

apply(function, args[, keywords])
    function参数必须是一个可被调用的对象(用户指定或内置函数或者方法,或者一个类对象),args参数必须是一个序列.以args作为参数列表呼叫function函数,参数对象是元组的长度.如果可选参数keywords指定,必须是一个字典并且字典的键值都是字符串.它指定了要被附加到参数列表末尾的关键字参数.呼叫apply()与直接呼叫function(args)是不同的,由于直接呼叫永远都有且仅有一个参数,而apply()相当于呼叫function(*args,**keywrods).

    2.3版本改动: 使用扩展呼叫语法 *args和**keywords.

buffer(object[, offset[, size]])
    object参数必须是支持buffer呼叫接口的对象(例如字符串,数组和buffer).根据对象的参数会创建一个新的buffer对象,该对象是从object对象的开始(或者offset指定的偏移)的切片.切片会扩展到object对象的结尾(或者size参数指定的长度).

coerce(x, y)
    返回一个元组,包含2个数值元素并使用与数学操作符相同的规则转换为一个普通类型.如果无法执行coerce操作,抛出TypeError异常.

intern(string)
    将string输入被interned的字符串的表中兵返回该字符串-返回字符串本身或者其拷贝.此方法在字典查找时略有小小的性能提高-如果字典的键值被interned,同时待查找的键值也被interned,键值比较(哈希之后)会使用指针比较而非字符串比较.一般的,Python中使用的名称都被自动interned,字典被用来保持模块,类或者实例属性拥有interned键值.
   
    2.3版本改动:interned字符串不再被长期保存(像2.2版本及之前的版本中那样);你必须保存intern()返回值的参考以从此方法中得到便利.



<<2. 内置函数-2:I-R    >>目录    >>4. 内置常量
    


No comments :

Post a Comment