Python 基础函数 06(S ~ Z)

Python解释器内置了许多始终可用的功能和类型。它们按字母顺序在此处列出。

Built-in Functions Built-in Functions
set() setattr()
slice() sorted()
staticmethod() str()
sum() super()
tuple() type()
vars() zip()

class set([iterable])

返回一个新的set对象,可选地使用iterable中的元素。set是一个内置类。有关此类的文档,请参见set和set类型—set和frozenset。
对于其他容器,可以查看内置的frozenset、list、tuple和dict类,以及collections模块。

setattr(object, name, value)

这是getattr()的副本。参数是一个对象、一个字符串和一个任意值。字符串可以命名现有属性或新属性。如果对象允许,函数将该值赋给属性。例如,setattr(x, ‘foobar’, 123)等于x。foobar = 123。

class slice(stop)

class slice(start, stop[, step])

返回一个切片对象,它表示由范围(开始、停止、步骤)指定的一组索引。start和step参数默认为None。Slice对象具有只读的数据属性start、stop和step,它们仅返回参数值(或其默认值)。它们没有其他明确的功能;但是它们被Numerical Python和其他第三方扩展使用。当使用扩展索引语法时,也会生成Slice对象。例如:a[start:stop:step]或a[start:stop, i]。有关返回迭代器的替代版本,请参见itertools.islice()。

sorted(iterable, *, key=None, reverse=False)

从iterable中的项返回一个新的排序列表。

有两个可选参数,必须指定为关键字参数。

key指定一个参数的函数,用于从iterable中的每个元素中提取一个比较键(例如,key=str.lower)。默认值是None(直接比较元素)。

reverse是一个布尔值。如果设置为True,那么列表元素将按照每次比较的顺序进行排序。

使用functools.cmp_to_key()将旧式的cmp函数转换成键函数。

内置的sort()函数保证是稳定的。排序是稳定的,如果它保证不改变比较相等的元素的相对顺序——这有助于在多个传递中排序(例如,按部门排序,然后按工资等级排序)。

有关排序示例和简短的排序教程,请参见如何排序。

@staticmethod

将方法转换为静态方法。

静态方法不接收隐式的第一个参数。要声明一个静态方法,请使用以下习语:

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

@staticmethod表单是一个函数装饰器——详细信息请参阅函数定义。

静态方法可以在类(如C.f())上调用,也可以在实例(如C().f())上调用。

Python中的静态方法类似于Java或c++中的方法。另请参阅classmethod(),了解用于创建替代类构造函数的变量。

与所有装饰器一样,也可以将staticmethod作为常规函数调用,并对它的结果进行处理。在某些情况下,需要从类主体引用一个函数,并且希望避免自动转换为实例方法时,需要这样做。对于这些情况,可以使用这个习语:

class C:
    builtin_open = staticmethod(open)
For more information on static methods, see The standard type hierarchy.

class str(object=’ ')

class str(object=b’’, encoding=‘utf-8’, errors=‘strict’)

返回一个str版本的对象。有关详细信息,请参见str()。

str是内置的字符串类。有关字符串的一般信息,请参见文本序列类型- str。

sum(iterable, /, start=0)

和开始,从左到右迭代的项目,并返回总数。iterable的项通常是数字,起始值不允许是字符串。

对于某些用例,sum()有很好的替代方法。连接字符串序列的首选快速方法是调用“.join(sequence)”。若要添加具有扩展精度的浮点值,请参见math.fsum()。要连接一系列的迭代器,可以考虑使用itertools.chain()。

在版本3.8中进行了更改:可以将start参数指定为关键字参数。

super([type[, object-or-type]])

返回一个代理对象,该对象将方法调用委托给类型的父类或兄弟类。这对于访问在类中被覆盖的继承方法非常有用。

对象或类型决定要搜索的方法解析顺序。搜索从类型后面的类开始。

例如,如果object-or-type的_mro__是D ->B→C→一个→对象,类型的值为B,则超级()搜索C ->一个→对象。

object-or-type的_mro__属性列出了getattr()和super()使用的方法解析搜索顺序。属性是动态的,可以在继承层次结构更新时更改。

如果省略第二个参数,则返回的超对象将被解除绑定。如果第二个参数是一个对象,则isinstance(obj, type)必须为真。如果第二个参数是类型,则issubclass(type2, type)必须为真(这对类方法很有用)。
super有两个典型的用例。在单继承的类层次结构中,可以使用super引用父类,而不必显式地命名它们,从而使代码更易于维护。这种用法与其他编程语言中super的用法非常相似。

第二个用例是支持动态执行环境中的协作多继承。这个用例是Python特有的,在静态编译语言或只支持单继承的语言中是找不到的。这使得实现“菱形图”成为可能,其中多个基类实现了相同的方法。良好的设计要求此方法在每种情况下都具有相同的调用签名(因为调用的顺序在运行时确定,因为该顺序适应类层次结构中的更改,而且该顺序可以包含运行时之前未知的兄弟类)。

对于这两个用例,一个典型的超类调用是这样的:

class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)

除了方法查找之外,super()还可以用于属性查找。一个可能的用例是在父类或兄弟类中调用描述符。

注意,super()是作为显式虚线属性查找(如super()._ getitem__(name))的绑定过程的一部分实现的。它通过实现自己的_getattribute__()方法来实现这一点,该方法用于以支持协作多继承的可预测顺序搜索类。因此,对于使用语句或super()[name]等操作符的隐式查找,super()是未定义的。

还要注意,除了zero参数形式之外,super()并不局限于在方法内部使用。这两种参数形式精确地指定了参数并提供了适当的引用。zero参数表单只在类定义中起作用,因为编译器会填充必要的细节以正确地检索正在定义的类,以及访问普通方法的当前实例。

有关如何使用super()设计协作类的实用建议,请参阅使用super()指南。

class tuple([iterable])

tuple并不是一个函数,它实际上是一个不可变的序列类型,正如在tuple和序列类型(list、tuple、range)中记录的那样。

class type(object)

class type(name, bases, dict)

使用一个参数,返回对象的类型。返回值是一个类型对象,通常与object._class__返回的对象相同。

建议使用isinstance()内置函数来测试对象的类型,因为它考虑到了子类。

使用三个参数,返回一个新类型对象。这本质上是类语句的一种动态形式。名称字符串是类名,并成为_name__属性;基元组逐项列出基类并成为_bases__属性;dict字典是包含类主体定义的名称空间,它被复制到一个标准字典中,成为_dict__属性。例如,以下两个语句创建相同类型的对象:

```handlebars
class X:
    a = 1

X = type('X', (object,), dict(a=1))
See also Type Objects.

Changed in version 3.6: Subclasses of type which don’t override type.new may no longer use the one-argument form to get the type of an object.

vars([object])

返回__dict__模块,类,实例或具有该__dict__属性的任何其他对象的属性。

对象(例如模块和实例)具有可更新的__dict__ 属性。但是,其他对象可能对其__dict__属性具有写限制 (例如,类使用 types.MappingProxyType来防止直接字典更新)。

不加争论,vars()就像locals()。请注意,本地字典仅对读取有用,因为对本地字典的更新将被忽略。

zip(*iterables)

制作一个迭代器,聚合每个可迭代对象中的元素。

返回一个元组的迭代器,其中第i个元组包含每个参数序列或可迭代对象中的第i个元素。当最短的可迭代输入耗尽时,迭代器停止。使用单个可迭代参数,它将返回1元组的迭代器。没有参数,它将返回一个空的迭代器。相当于:

def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By
    sentinel = object()
    iterators = [iter(it) for it in iterables]
    while iterators:
        result = []
        for it in iterators:
            elem = next(it, sentinel)
            if elem is sentinel:
                return
            result.append(elem)
        yield tuple(result)

保证了可迭代对象的从左到右的评估顺序。这使得使用可以将数据系列聚类为n个长度的组成为一个习惯用法zip(*[iter(s)]*n)。这将重复相同的迭代器n时间,以便每个输出元组都具有n调用迭代器的结果。这具有将输入分成n个长度的块的效果。

zip()仅当您不关心较长的可迭代对象的尾随,不匹配的值时,才应将其与不等长的输入一起使用。如果这些值很重要,请itertools.zip_longest()改用。

zip()与*运算符一起可用于解压缩列表:

>>>
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True
发布了36 篇原创文章 · 获赞 0 · 访问量 619

猜你喜欢

转载自blog.csdn.net/Corollary/article/details/105424912