ITPub博客

首页 > 应用开发 > IT综合 > 迭代器

迭代器

原创 IT综合 作者:brj880719 时间:2017-12-15 10:44:53 0 删除 编辑
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

一、NEXT

语法:next(iterator[, default])

说明:

1、函数必须接收一个可迭代对象参数,每次调用的时候,返回可迭代对象的下一个元素。如果所有元素均已经返回过,则抛出StopIteration 异常。

  1. >>> a = iter('abcd')
  2. >>> next(a)
  3. 'a'
  4. >>> next(a)
  5. 'b'
  6. >>> next(a)
  7. 'c'
  8. >>> next(a)
  9. 'd'

2、函数可以接收一个可选的default参数,传入default参数后,如果可迭代对象还有元素没有返回,则依次返回其元素值,如果所有元素已经返回,则返回default指定的默认值而不抛出StopIteration 异常。

  1. a = iter('abcd')
  2. >>> next(a,'e')
  3. 'a'
  4. >>> next(a,'e')
  5. 'b'
  6. >>> next(a,'e')
  7. 'c'
  8. >>> next(a,'e')
  9. 'd'
  10. >>> next(a,'e')
  11. 'e'
  12. >>> next(a,'e')
  13. 'e'

二、iter

语法:iter(object[, sentinel])

说明:

1、函数功能返回一个可迭代对象。

2、当第二个参数不提供时,第一个参数必须是一个支持可迭代协议(即实现了__iter__()方法)的集合(字典、集合、不可变集合),或者支持序列协议(即实现了__getitem__()方法,方法接收一个从0开始的整数参数)的序列(元组、列表、字符串),否则将报错。

  1. >>> a = iter({'A':1,'B':2}) #字典集合
  2. >>> a
  3. <dict_keyiterator object at 0x03FB8A50>
  4. >>> next(a)
  5. 'A'
  6. >>> next(a)
  7. 'B'

  8. >>> a = iter('abcd') #字符串序列
  9. >>> a
  10. <str_iterator object at 0x03FB4FB0>
  11. >>> next(a)
  12. 'a'
  13. >>> next(a)
  14. 'b'
  15. >>> next(a)
  16. 'c'
  17. >>> next(a)
  18. 'd'

3、当第二个参数sentinel提供时,第一个参数必须是一个可被调用对象。创建的迭代对象,在调用__next__方法的时候会调用这个可被调用对象,当返回值和sentinel值相等时,将抛出StopIteration异常, 终止迭代。

  1. >>> class IterTest:
  2.     def __init__(self):
  3.         self.start = 0
  4.         self.end = 10
  5.     def get_next_value(self):
  6.         current = self.start
  7.         if current < self.end:
  8.             self.start += 1
  9.         else:
  10.             raise StopIteration
  11.         return current

  12. >>> iterTest = IterTest() #实例化类
  13. >>> a = iter(iterTest.get_next_value,4) # iterTest.get_next_value为可调用对象,sentinel值为4
  14. >>> a
  15. <callable_iterator object at 0x03078D30>
  16. >>> next(a)
  17. 0
  18. >>> next(a)
  19. 1
  20. >>> next(a)
  21. 2
  22. >>> next(a)
  23. 3

三、RANGE

语法:range(start, stop[, step])

说明:

1、range函数用于生成一个range对象,range类型是一个表示整数范围的类型。

2、可以直接传入一个结束整数来初始化一个range类型,默认起始值为0(包含0).结束整数可以大于0,也可以小于等于0,但是小于等于0的时候生成的range对象实际是不包含任何元素的。

  1. >>> a = range(5)
  2. >>> a
  3. range(0, 5)
  4. >>> len(a)
  5. 5
  6. >>> for x in a:print(x)

  7. 0
  8. 1
  9. 2
  10. 3
  11. 4
  12.  >>> b = range(0) # 传入0,空range对象
  13. >>> len(b)
  14. 0

  15. >>> c = range(-5) # 传入负数,空range对象
  16. >>> len(c)
  17. 0


3、可以传入一个起始整数和一个结束整数来初始化一个range类型,生成的range类型包含起始整数(包含),和结束整数(不包含)之间的所有整数。

  1. >>> a = range(1,5)
  2. >>> a
  3. range(1, 5)
  4. >>> for x in a:print(x)
  5. 1
  6. 2
  7. 3
  8. 4


4、传入了起始整数和结束整数,还可以同时传入一个步进值来初始化一个range类型,生成的range类型包含起始整数(包含),和结束整数(不包含)之间的以步进值筛选后的整数。

  1. >>> a = range(1,10,3)
  2. >>> a
  3. range(1, 10, 3)
  4. >>> for x in a:print(x)
  5. 1
  6. 4
  7. 7


5、初始化range类型时起始整数和结束整数,遵循的是左臂右开原则,即包含起始整数,但不包含结束整数。

  1. >>> a = range(1,5)
  2. >>> a
  3. range(1, 5)
  4. >>> for x in a:print(x) # 包含1,不包含5

  5. 1
  6. 2
  7. 3
  8. 4


6、range接收的参数都必须是整数,不能是浮点数等其它数据类型。

7、range实际上是一个不可变的序列类型,可以对它进行取元素、切片等序列操作,但是不能对其中元素修改值。

  1. >>> a = range(1,5)

  2. >>> a[0] # 取元素
  3. 1
  4. >>> a[:-2] # 切片
  5. range(1, 3)
  6. >>> a[1] = 2 # 修改元素值
  7. Traceback (most recent call last):
  8.   File "", line 1, in <module>
  9.     a[1] = 2
  10. TypeError: 'range' object does not support item assignment


四、MAP

语法:map(function, iterable, ...)

说明:

1、函数接受一个函数类型参数、一个或者多个可迭代对象参数,返回一个可迭代器,此迭代器中每个元素,均是函数参数实例调用可迭代对象后的结果。

  1. >>> a = map(ord,'abcd')
  2. >>> a
  3. <map object at 0x03994E50>
  4. >>> list(a)
  5. [97, 98, 99, 100]


2、当传入多个可迭代对象时,函数的参数必须提供足够多的参数,保证每个可迭代对象同一索引的值均能正确传入函数。

  1. >>> a = map(ord,'abcd','efg') # 传入两个可迭代对象,所以传入的函数必须能接收2个参数,ord不能接收2个参数,所以报错
  2. >>> list(a)
  3. Traceback (most recent call last):
  4.   File "", line 1, in <module>
  5.     list(a)
  6. TypeError: ord() takes exactly one argument (2 given)


3、当传入多个可迭代对象时,且它们元素长度不一致时,生成的迭代器只到最短长度。

  1. >>> def f(a,b):
  2.     return a + b

  3. >>> a = map(f,'abcd','efg') # 选取最短长度为3
  4. >>> list(a)
  5. ['ae', 'bf', 'cg']


4、map函数是一个典型的函数式编程例子。

五、ZIP

语法:zip(*iterables)

说明:

1、函数功能是聚合传入的每个迭代器中相同位置的元素,返回一个新的元组类型迭代器。

  1. >>> x = [1,2,3]
  2. >>> y = [4,5,6]
  3. >>> xy = zip(x,y)
  4. >>> xy #xy的类型是zip类型
  5. <zip object at 0x0429C828>
  6. #导入Iterable
  7. >>> from collections import Iterable
  8. >>> isinstance(xy,Iterable) #判断是否可迭代对象
  9. True
  10. >>> list(xy) #结果
  11. [(1, 4), (2, 5), (3, 6)]


2、如果传入的迭代器长度不一致,最短长度的迭代器迭代结束后停止聚合。

  1. >>> x = [1,2,3] #长度3
  2. >>> y = [4,5,6,7,8] #长度5
  3. >>> list(zip(x,y)) # 取最小长度3
  4. [(1, 4), (2, 5), (3, 6)]


3、如果只传入一个迭代器,则返回的单个元素元组的迭代器。

  1. >>> list(zip([1,2,3]))
  2. [(1,), (2,), (3,)]


4、如果不传入参数,则返回空的迭代器。

  1. >>> list(zip())
  2. []


5、zip(*[iter(s)]*n)等效于调用zip(iter(s),iter(s),...,iter(s))。

  1. >>> x = [1,2,3]

  2. >>> list(zip(*[x]*3))
  3. [(1, 1, 1), (2, 2, 2), (3, 3, 3)]

  4. >>> list(zip(x,x,x))
  5. [(1, 1, 1), (2, 2, 2), (3, 3, 3)]


六、FILTER

语法:filter(function, iterable)

说明:

1、filter函数用于过滤序列。过滤的方式则是采用传入的函数,去循环序列的元素调用,如果函数计算的结果为True则保留元素,否则将舍弃该元素。

  1. >>> a = list(range(1,10)) #定义序列
  2. >>> a
  3. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  4. >>> def if_odd(x): #定义奇数判断函数
  5.     return x%2==1

  6. >>> list(filter(if_odd,a)) #筛选序列中的奇数
  7. [1, 3, 5, 7, 9]


2、当function参数传入None时,序列中的元素值如果为False,也会自动舍弃。

  1. >>> c = ['',False,'I',{}] #定义序列
  2. >>> c
  3. ['', False, 'I', {}]

  4. >>> list(filter(None,c)) #筛选函数为None,自动舍弃序列中的False值,空字符串、False值、空序列都是False值,所以丢弃
  5. ['I']


七、LIST类型迭代

  1. >>> L = [1,2,3,4,5]
  2. >>> for i in range(len(L)):
  3. >>> L[i] += 10
  4. >>> print(L)
  5. [11, 12, 13, 14, 15]
  6. >>> L = [x + 10 for x in L]
  7. >>> print(L)
  8. [21, 22, 23, 24, 25]

八、DICT类型迭代

  1. >>> D = dict(a=1, b=2, ,c=3)
  2. >>> for k in sorted(D): print(k, D[k], end=' ')
  3. 1 2 3

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24851054/viewspace-2148744/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 冷备份
请登录后发表评论 登录
全部评论

注册时间:2014-12-06

  • 博文量
    75
  • 访问量
    67554