【半月社3】Python基础之迭代和迭代器

【半月社3】Python基础之迭代和迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

什么是迭代:

我们通过顺序、分支(if else)、循环(for while)来控制程序的运行,这被称之为控制流

根据冯诺依曼模型,计算机所作的就是: 输入数据——处理数据——输出数据

我们输入一组数据,需要对其中的每一项进行处理,这就引入了重复操作,不管叫什么,

循环、迭代、递归、编历,都只是对这种重复操作的具体实现。

在编程中语言中,通过for语法和工具来实现对数据的重复操作也就是迭代(如果使用while循环,调用的是序列索引)


for i in range(0,10)
    print(i)

my_dic = {1:'a',2:'b',3:'c'}
for i in my_dic:
    print(i)

首先,我们来看上面的for循环迭代例子,既可以循环有序的列表,也可以循环无序的字典。

显然,在python的for循环中,并没有对每个带循环变量进行下表索引,而是直接对每个变量进行循环迭代。

for循环在底层不使用索引而是使用迭代器,for循环也可以作用于任何可迭代对象,迭代器会驱动可迭代对象进行循环遍历。

如何判断一个对象是否是可迭代对象呢?

在Python中提供了一个collections模块,可以用其中的isinstance()方法来判断某对象是否是Iterable(可迭代对象)。

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False

也可使用此方法判断某对象是否是迭代器

isinstance([], Iterator)  # False

isinstance(iter([]), Iterator)  # True

isinstance(iter("abc"), Iterator)  # True

python中也可以同事引用两个变量进行for循环,比如

>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
...     print(x, y)
...
1 1
2 4
3 9

经过了上面的介绍,我们知道了python 迭代的基本含义,那么什么是迭代器,什么又是可迭代对象呢?


可迭代对象和迭代器

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

从使用方法来说:

可迭代对象是任何可以用for循环遍历的东西。可迭代对象可以被循环遍历,任何可以被循环遍历的东西都是可迭代对象。

从对象定义来说:

我们可以用内置的dir()函数来查看对象的属性和方法,一个对象是不是可迭代对象和迭代器,由这些属性和方法决定

1)如果一个对象拥有__iter__方法(可迭代协议)或__getitem__(序列协议),其是可迭代对象

2)如果一个对象拥有__iter__next方法,其是迭代器

也就是说,可迭代对象包含了迭代器,我们先来简单了解一下__iter__方法

当我们调用__iter__()方法时,有两种情况:

1)如果访问的对象是可迭代对象,此方法会返回当前可迭代对象的迭代器实例

2)如果访问的对象是迭代器,此方法会返回self(即此迭代器自身)

举例来说,如果我们定义了如下的可迭代对象和迭代器

#!/usr/bin/env python  
# coding=utf-8  
  
  
class MyList(object):            # 定义可迭代对象类  
  
    def __init__(self, num):  
        self.data = num          # 上边界  
  
    def __iter__(self):  
        return MyListIterator(self.data)  # 返回该可迭代对象的迭代器类的实例  
  
  
class MyListIterator(object):    # 定义迭代器类,其是MyList可迭代对象的迭代器类  
  
    def __init__(self, data):  
        self.data = data         # 上边界  
        self.now = 0             # 当前迭代值,初始为0  
  
    def __iter__(self):  
        return self              # 返回该对象的迭代器类的实例;因为自己就是迭代器,所以返回self  
  
    def next(self):              # 迭代器类必须实现的方法  
        while self.now < self.data:  
            self.now += 1  
            return self.now - 1  # 返回当前迭代值  
        raise StopIteration      # 超出上边界,抛出异常  

当我们创建可迭代对象实例或迭代器实例时,调用iter方法时,都会返回迭代器实例。

当我们使用for循环时,会自动创建一个迭代器,我们也可以用iter内置函数创建迭代器

a = {1, 2, 3, 4}

list_iter = iter(a)
next(list_iter)
next(list_iter)
next(list_iter)
next(list_iter)

这里我们用到了迭代器的next()函数,可用next函数来获取它的下一个元素

next()函数会返回迭代的每一步,超出边界后会抛出stopIteration异常

实际上在序列中,for循环是如下面这样利用迭代器驱动工作的(自动调用next方法):

fetch = iter(seq)
while True:
  try:
    i = fetch.next()
  except StopIteration:
    break
  do_something_to(i) 

for循环字典迭代时,迭代器会遍历字典的键(key)

对文件生成的对象迭代时,会自动调用readline()方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值