Python基础学:内置类型(2)

5.迭代器类型

       Python支持对容器进行迭代的概念。他有两种不同的实现方法,但都可以归于使用用户自定义的类实现迭代。接下来,将详细解释说明:

       第一种方法需要定义容器对象以提供迭代基础:

container. __iter__()

该方法返回一个迭代器对象,且该对象满足一系列迭代器控制协议。如果该容器支持不同类型的迭代对象,那么就可以提供额外的方法为这些迭代对象请求专用迭代器。此方法对应于Python / C API中Python对象的类型结构的tp_iter槽。

       迭代器对象需要支持下述两个来自于迭代器控制协议的方法:

iterator. __iter__()

返回迭代器对象本身。这个请求允许迭代器和容器使用for和in语句。

iterator. __next__()

返回迭代器内的下一个元素。如果迭代器已经见底,则抛出StopIteration例外。

       Python定义一系列迭代器对象用于支持包裹通用或专用序列类型、字典和其它更加特殊的结构。但不要担心那些特殊结构,他们都必须遵守迭代器控制协议。一旦一个迭代器的__next__()方法抛出了StopIteration,而且它依旧继续被调用的话,操作会因为不遵守规则而炸掉。

5.1 生成器类

       Python的生成器提供了一个便捷的方法完成迭代器控制。如果一个容器对象的__iter__()方法被当做生成器运行,它会自动返回一个提供__iter__()和__next__()方法的迭代器对象。

6. 序列类型——list,tuple,range

       下表内的操作都支持绝大多数的序列类数据,不管该序列是否是不可变序列。collections.abc.Sequence ABC使得在自定义序列类型上正确实现这些操作而变得简单。此表列出按升序优先级排序的序列操作。在表中,s和t是相同类型的序列,n,i,j和k是整数,x是满足由s施加的任何类型和值限制的任意对象。此外,in和not in操作具有和比较操作相同的优先级,+(级联)和*(重复)操作与和它长得特别像的数字操作拥有相同优先级。

操作

结果

x in s

如果x与s内的某个元素相等,就返回True,否则返回False。

x not in s

如果x与s内的所有元素都不相等,就返回True,否则返回False。

s + t

将s与t连接起来

s * n 或 n * s

等价于将s本身相加n次

s[i]

s的第i个元素,从0开始算起

s[i:j]

s的第I个到第j个元素组合

s[i:j:k]

s的第i个到第j个元素中符合步长k要求的元素组合

len(s)

s的长度

min(s)

s中最小的元素

max(s)

s中的最大元素

s. index(x[, i[, j]])

返回s中与x相等的第一个元素的序列值,或者第i到第j个元素中第一个与x相同的元素

s. count(x)

s中x出现的总次数

       相同类型的序列也支持比较操作。具体来说,元组和列表通过比较顺序对应的元素确定是否相等。这意味着为了比较相等,每个元素必须相等并且两个序列必须是相同类型并具有相同长度。

6.2 不可变序列类型

       通常通过对该类型内置的has()方法操作以达到操作该类型的目的,而不是操作该类型本身。

6.3 可变序列类型

       下表列出了用于可变序列类型的操作。collections.abc.MutableSequence ABC使得这些自定义序列类型的处理变得更加容易。在表中s是可变序列类型的一个实例,t是可迭代对象,x是属性对象并且严格遵守c设定的类型与值的限制。

操作

结果

s[i] = x

s中的第i个元素被替换为x

s[i:j] = t

s中的第i个到第j个元素被可迭代量t替换

del s[i: j]

相当于s[I; j]=[]

s[i: j: k] = t

s中从第i个元素到第j个元素,以k为步长,选中的元素被t中的元素值替代

del s[i: j: k]

删除s中符合[i: j: k]规律的元素

s. append(x)

在序列s的末尾增添一个元素,其值为x,与s[len(s):len(s)] = [x]

s. clear()

将s中的所有元素清除掉

s.copy()

为s创建一个与其相同的副本

s. extend(t) 或 s += t

用t的内容扩展s

s *= n

将s中的内容重复n次,并赋给新的s

s. insert(I, x)

将x插入到s中序列数为i的地方

s. pop([i])

将s的第i个元素弹出

s. remove(x)

把s中第一个与x值相同的元素删除

s. reverse()

释放s占用的空间

6.4 列表

       列表是一个可变序列,通常用于存储同类项目的集合(精确的相似程度会因应用应用而异)。

       classlist([iterable])

列表的构成方式有以下几种:

(1)使用一对方括号表示空列表,如:[]

(2)使用方括号,其中的项目用逗号分隔,如:[a],[a, b, c]

(3)使用列表理解:[x for xin iterable]

(4)使用类构造器:list()或list(iterable)

构造函数构建一个列表,其项目与iterable的元素值与元素顺序相同。iterable可以是序列,也可以是支持迭代的容器或迭代器对象。如果iterbale已经是一个列表,则复制被创建并返回副本,类似于iterable [:]。 例如,list('abc')返回['a','b','c']和列表((1,2,3))返回[1,2,3]。 如果没有给出参数,构造函数会创建一个新的空列表[]。

       sort(*,key=None, reverse=False)

此方法就地对列表进行排序,对元素的升序排列。

6.5 元组

       元组是不可变序列,通常用于存储异构数据的集合。

class tuple([iterable])

       元组可以由以下方法构建:

(1)使用一对圆括号表示空元组,如:()

(2)单元素元组使用尾随逗号定义,如:a,或(a,)

(3)用逗号分隔元组元素,如:a,b, c或(a, b, c)

(4)使用内置的tuple()函数,如:tuple()或tuple(iterable)

6.6 范围

       范围类型表示一个不可变的数字序列,通常用于在for循环中循环特定次数。其由以下类定义:

class range(stop)

class range(start, stop[, step])

该定义已在内置函数中说明,不再赘述。

猜你喜欢

转载自blog.csdn.net/zhtysw/article/details/79689011
今日推荐