迭代器是可以记住导线测量位置的对象。
迭代器对象是从集合中的第一个元素开始访问的,直到所有元素都被访问完。 迭代器不能向前下降。
一. NEXT
语法: next (迭代器(,default] ) )
说明:
1、函数需要接收可重复的对象参数,每次调用都会返回可重复对象的下一个元素。 如果所有元素都已经返回,则抛出StopIteration异常。
a=ITER(ABCD ) )。
是next(a )
' a '
是next(a )
' b '
是next(a )
' c '
是next(a )
' d '
2、函数可以接收可选的default参数。 传递default参数后,如果可重复的对象中还没有返回元素,则按顺序返回该元素的值;如果返回了所有元素,则返回default指定的默认值,而不抛出StopIteration异常。
a=ITER(ABCD ) )。
next(a,' e ' ) ) ) )。
' a '
next(a,' e ' ) ) ) )。
' b '
next(a,' e ' ) ) ) )。
' c '
next(a,' e ' ) ) ) )。
' d '
next(a,' e ' ) ) ) )。
' e '
next(a,' e ' ) ) ) )。
' e '
二. iter
语法: ITER(object (,sentinel] ) ) ) )。
说明:
1、函数功能返回可重复的对象。
2 .如果未提供第二个参数,则第一个参数是实现了支持可重复协议的集合(即__iter__ ) ()方法的集合(词典、集合、不变集合) )或序列假脱机
a=ITER((a ) :1,b ) :2 ) )词典集合
A
是next(a )
' a '
是next(a )
' b '
a=ITER(ABCD ) #字符串序列
A
是next(a )
' a '
是next(a )
' b '
是next(a )
' c '
是next(a )
' d '
3 .如果提供了第二个参数sentinel,则第一个参数必须是可调用的对象。 创建在调用__next__方法时调用的迭代对象,并在返回值和sentinel值相等时抛出StopIteration异常以终止迭代。
类迭代器测试:
def __init__(self ) :
self.start=0
self.end=10
efget_next_value(self ) :
current=self.start
if current self.end:
self.start =1
else:
raise StopIteration
返回当前
itertest=itertest(#实例化类
a=ITER (# itertest.get_next_value,4 ) ITER test.get _ next _ value是一个可调用的对象,sentinel值为4
A
是next(a )
0
是next(a )
1
是next(a )
2
是next(a )
3
三.范围
语法: range(start,stop[ ),step] )
说明:
1.range函数用于生成range对象。 range类型是表示整数范围的类型。
2 .可以直接传递结束整数来初始化range类型。 默认开始值为0。 结束整数应如下所示
以大于0,也可以小于等于0,但是小于等于0的时候生成的range对象实际是不包含任何元素的。>>> a = range(5)
>>> a
range(0, 5)
>>> len(a)
5
>>> for x in a:print(x)
0
1
2
3
4
>>> b = range(0) # 传入0,空range对象
>>> len(b)
0
>>> c = range(-5) # 传入负数,空range对象
>>> len(c)
0
3、可以传入一个起始整数和一个结束整数来初始化一个range类型,生成的range类型包含起始整数(包含),和结束整数(不包含)之间的所有整数。
>>> a = range(1,5)
>>> a
range(1, 5)
>>> for x in a:print(x)
1
2
3
4
4、传入了起始整数和结束整数,还可以同时传入一个步进值来初始化一个range类型,生成的range类型包含起始整数(包含),和结束整数(不包含)之间的以步进值筛选后的整数。
>>> a = range(1,10,3)
>>> a
range(1, 10, 3)
>>> for x in a:print(x)
1
4
7
5、初始化range类型时起始整数和结束整数,遵循的是左臂右开原则,即包含起始整数,但不包含结束整数。
>>> a = range(1,5)
>>> a
range(1, 5)
>>> for x in a:print(x) # 包含1,不包含5
1
2
3
4
6、range接收的参数都必须是整数,不能是浮点数等其它数据类型。
7、range实际上是一个不可变的序列类型,可以对它进行取元素、切片等序列操作,但是不能对其中元素修改值。
>>> a = range(1,5)
>>> a[0] # 取元素
1
>>> a[:-2] # 切片
range(1, 3)
>>> a[1] = 2 # 修改元素值
Traceback (most recent call last):
File "", line 1, in
a[1] = 2
TypeError: 'range' object does not support item assignment
四、MAP
语法:map(function, iterable, ...)
说明:
1、函数接受一个函数类型参数、一个或者多个可迭代对象参数,返回一个可迭代器,此迭代器中每个元素,均是函数参数实例调用可迭代对象后的结果。
>>> a = map(ord,'abcd')
>>> a
>>> list(a)
[97, 98, 99, 100]
2、当传入多个可迭代对象时,函数的参数必须提供足够多的参数,保证每个可迭代对象同一索引的值均能正确传入函数。
>>> a = map(ord,'abcd','efg') # 传入两个可迭代对象,所以传入的函数必须能接收2个参数,ord不能接收2个参数,所以报错
>>> list(a)
Traceback (most recent call last):
File "", line 1, in
list(a)
TypeError: ord() takes exactly one argument (2 given)
3、当传入多个可迭代对象时,且它们元素长度不一致时,生成的迭代器只到最短长度。
>>> def f(a,b):
return a + b
>>> a = map(f,'abcd','efg') # 选取最短长度为3
>>> list(a)
['ae', 'bf', 'cg']
4、map函数是一个典型的函数式编程例子。
五、ZIP
语法:zip(*iterables)
说明:
1、函数功能是聚合传入的每个迭代器中相同位置的元素,返回一个新的元组类型迭代器。
>>> x = [1,2,3]
>>> y = [4,5,6]
>>> xy = zip(x,y)
>>> xy #xy的类型是zip类型
#导入Iterable
>>> from collections import Iterable
>>> isinstance(xy,Iterable) #判断是否可迭代对象
True
>>> list(xy) #结果
[(1, 4), (2, 5), (3, 6)]
2、如果传入的迭代器长度不一致,最短长度的迭代器迭代结束后停止聚合。
>>> x = [1,2,3] #长度3
>>> y = [4,5,6,7,8] #长度5
>>> list(zip(x,y)) # 取最小长度3
[(1, 4), (2, 5), (3, 6)]
3、如果只传入一个迭代器,则返回的单个元素元组的迭代器。
>>> list(zip([1,2,3]))
[(1,), (2,), (3,)]
4、如果不传入参数,则返回空的迭代器。
>>> list(zip())
[]
5、zip(*[iter(s)]*n)等效于调用zip(iter(s),iter(s),...,iter(s))。
>>> x = [1,2,3]
>>> list(zip(*[x]*3))
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]
>>> list(zip(x,x,x))
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]
六、FILTER
语法:filter(function, iterable)
说明:
1、filter函数用于过滤序列。过滤的方式则是采用传入的函数,去循环序列的元素调用,如果函数计算的结果为True则保留元素,否则将舍弃该元素。
>>> a = list(range(1,10)) #定义序列
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> def if_odd(x): #定义奇数判断函数
return x%2==1
>>> list(filter(if_odd,a)) #筛选序列中的奇数
[1, 3, 5, 7, 9]
2、当function参数传入None时,序列中的元素值如果为False,也会自动舍弃。
>>> c = ['',False,'I',{}] #定义序列
>>> c
['', False, 'I', {}]
>>> list(filter(None,c)) #筛选函数为None,自动舍弃序列中的False值,空字符串、False值、空序列都是False值,所以丢弃
['I']
七、LIST类型迭代
>>> L = [1,2,3,4,5]
>>> for i in range(len(L)):
>>> L[i] += 10
>>> print(L)
[11, 12, 13, 14, 15]
>>> L = [x + 10 for x in L]
>>> print(L)
[21, 22, 23, 24, 25]
八、DICT类型迭代
>>> D = dict(a=1, b=2, ,c=3)
>>> for k in sorted(D): print(k, D[k], end=' ')
1 2 3