python之迭代器

简介:

 何为迭代?迭代就是重复做一件事

  可迭代(iterable)对象有哪些:

    支持每次返回自己所包含的一个成员的对象;

    对象在内部实现了__iter__方法或者__getitem__方法:

      序列类型,如:list、str、tuple

      非序列类型,如:dict、file

      用户自定义的一些包含了__iter__()或__getitem__()方法的类

wKioL1hSQ7GSpRbFAAA1X9qJhm4626.jpg

  可以直接作用于for循环的数据有以下几种:

    1、集合数据类型:list、tuple、dict、file、str等

    2、生成器对象:generator,包括生成器和带yield的generator function

  这些可直接作用于for循环的对象统称为可迭代对象:Iterable

  可以使用isinstance()判断一个对象是否是Iterable对象。

1
2
3
4
5
6
7
In [ 3 ]:  from  collections  import  Iterable
 
In [ 4 ]:  isinstance ([],Iterable)
Out[ 4 ]:  True
 
In [ 5 ]:  isinstance ( 'abc' ,Iterable)
Out[ 5 ]:  True

  可迭代对象能干什么?

    可迭代对象支持每次返回自己所包含的一个成员的对象,每次取得一个,从头遍历到尾部。也就是说可迭代对象本身是可遍历的。

  以下举例来说明:

  定义一个列表:

1
list1  =  [ 'Sun' , 'Mon' , 'Tue' , 'Wed' , 'Thu' , 'Fri' , 'Sat' ]

  使用dir()函数查看list1列表所支持的所有方法和属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
In [ 2 ]:  dir (list1)
Out[ 2 ]:
[ '__add__' ,
  '__class__' ,
  '__contains__' ,
  '__delattr__' ,
  '__delitem__' ,
  '__delslice__' ,
  '__doc__' ,
  '__eq__' ,
  '__format__' ,
  '__ge__' ,
  '__getattribute__' ,
  '__getitem__' ,
  '__getslice__' ,
  '__gt__' ,
  '__hash__' ,
  '__iadd__' ,
  '__imul__' ,
  '__init__' ,
  '__iter__' ,
  '__le__' ,
  '__len__' ,
  '__lt__' ,
  '__mul__' ,
  '__ne__' ,
  '__new__' ,
  '__reduce__' ,
  '__reduce_ex__' ,
  '__repr__' ,
  '__reversed__' ,
  '__rmul__' ,
  '__setattr__' ,
  '__setitem__' ,
  '__setslice__' ,
  '__sizeof__' ,
  '__str__' ,
  '__subclasshook__' ,
  'append' ,
  'count' ,
  'extend' ,
  'index' ,
  'insert' ,
  'pop' ,
  'remove' ,
  'reverse' ,
  'sort' ]

  在输出中可以看到list1的方法中有__iter__和__getitem__。

  list1.__iter__()方法返回一个可迭代对象的迭代器地址,而不是返回元素本身,这就意味着,当调用__iter__方法或者__getitem__方法时,在内存中就创建了一个能够遍历某个对象的每一个元素的迭代器

1
2
In [ 3 ]: list1.__iter__()
Out[ 3 ]: <listiterator at  0x7fec6bbafb90 >


  一直在说迭代器,那么到底什么是迭代器呢?

    迭代器(iterator)又称游标(cursor),它是程序设计的软件设计模式,是一种可以在容器物件(container,如列表等)上实现元素遍历的接口。迭代器是一种特殊的数据结构,它是以对象的形式存在的。

    说白点,可以被next()函数调用并不断返回下一个值的对象称之为迭代器:Iterator


  对于集体中每一个元素,想要执行遍历,那么针对这个集体的迭代器定义了遍历集体中每一个元素的顺序或者方法。对于迭代器来说,我们可以对它调用next方法来获取其每一个元素或者说遍历其每一个元素。

迭代器是不可逆的,当遍历结束后抛出异常,不会从头开始再次迭代,若想从头再来一遍只能重新创建一个迭代器


  除了调用__iter__和__getitem__方法能生成一个迭代器以外,还可以调用iter()函数来生成迭代器,其方法是:

    iter(可迭代对象),如:

1
2
In [ 4 ]:  iter (list1)
Out[ 4 ]: <listiterator at  0x7fec6bbe6450 >

  iter(list1)相当于调用了list1的__iter__方法

  生成器是迭代器对象,但list、tuple、dict、str虽然是可以迭代对象,却不是迭代器对象,因为他们都没有next()方法。

  我们可以用iter()函数将list、tuple、dict、str等转换成迭代器。

  既然我们可以通过iter()函数将list、tuple、dict、str等这些数据类型转换成迭代器,那为什么不一开始就让这些数据类型默认就是一个迭代器对象呢?

  这是因为python中的Iterator迭代器对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration异常。

  我们可以把这个数据流看成是一个有序的序列,但我们不可能知道这个序列的准确长度,只能通过next()函数不断的按需生成下一个数据,所以Iterator的计算是惰性的。

  在python中,迭代器是遵循迭代协议的对象,使用iter()可从任何序列对象中得到迭代器,若要实现迭代器,需要在类中定义next()方法(python3中是__next__())

  要使得迭代器指向下一个元素,则使用成员函数next():

  在python中,是函数next(),而非成员函数

  当没有元素时,则引发StopIteration异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
In [ 5 ]: a  =  iter (list1)
 
In [ 6 ]: a. next ()
Out[ 6 ]:  'Sun'
 
In [ 7 ]: a. next ()
Out[ 7 ]:  'Mon'
 
In [ 8 ]: a. next ()
Out[ 8 ]:  'Tue'
 
In [ 9 ]: a. next ()
Out[ 9 ]:  'Wed'
 
In [ 10 ]: a. next ()
Out[ 10 ]:  'Thu'
 
In [ 11 ]: a. next ()
Out[ 11 ]:  'Fri'
 
In [ 12 ]: a. next ()
Out[ 12 ]:  'Sat'
 
In [ 13 ]: a. next ()
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
StopIteration                             Traceback (most recent call last)
<ipython - input - 13 - aa817a57a973>  in  <module>()
- - - - 1  a. next ()
 
StopIteration:

  for循环可用于任何可迭代对象:

    for循环开始时,会通过迭代协议传递给iter()内置函数,从而能够从可迭代对象中获得一个迭代器,返回的对象有需要的next方法。










本文转自 忘情OK  51CTO博客,原文链接:http://blog.51cto.com/itchentao/1883056,如需转载请自行联系原作者
目录
相关文章
|
27天前
|
大数据 数据处理 开发者
Python中的迭代器和生成器:不仅仅是语法糖####
本文探讨了Python中迭代器和生成器的深层价值,它们不仅简化代码、提升性能,还促进了函数式编程风格。通过具体示例,揭示了这些工具在处理大数据、惰性求值及资源管理等方面的优势。 ####
|
1月前
|
存储 程序员 数据处理
深入理解Python中的生成器与迭代器###
本文将探讨Python中生成器与迭代器的核心概念,通过对比分析二者的异同,结合具体代码示例,揭示它们在提高程序效率、优化内存使用方面的独特优势。生成器作为迭代器的一种特殊形式,其惰性求值的特性使其在处理大数据流时表现尤为出色。掌握生成器与迭代器的灵活运用,对于提升Python编程技能及解决复杂问题具有重要意义。 ###
|
2月前
|
存储 索引 Python
Python 迭代器是怎么实现的?
Python 迭代器是怎么实现的?
47 6
|
3月前
|
索引 Python
解密 Python 迭代器的实现原理
解密 Python 迭代器的实现原理
53 13
|
3月前
|
机器学习/深度学习 设计模式 大数据
30天拿下Python之迭代器和生成器
30天拿下Python之迭代器和生成器
23 3
|
2月前
|
存储 大数据 Python
Python 中迭代器与生成器:深度解析与实用指南
Python 中迭代器与生成器:深度解析与实用指南
25 0
|
4月前
|
数据采集 存储 大数据
Python关于迭代器的使用
在Python编程中,数据的处理和操作是核心任务之一。 想象一下,你有一个装满各种颜色球的箱子,你想逐个查看并使用这些球,但又不想一次性将它们全部取出。 这就引出了我们今天要讨论的主题——迭代。
|
4月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。
|
4月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。
|
5月前
|
数据采集 存储 大数据
Python中关于迭代器的使用
总之,迭代器是Python编程的基石,它们在处理数据、优化性能和构建复杂系统方面都有着不可替代的地位。随着技术的不断进步,迭代器将继续在各种编程场景中发挥重要作用。