python三大神器之'迭代器'

迭代器:

1.认识迭代器

  迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

  我们怎样才能判定一个对象是都是可以迭代的呢?

2.可迭代对象

  list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,这类对象被称为可迭代对象

3. 如何判断一个对象是否是一个可迭代对象

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

 

from collections import Iterable
# 使用isinstance() 函数检测某个对象是否是一个可迭代的对象

# 列表是可迭代对象
result = isinstance([1,2], Iterable)
print(result)

# 元组是可迭代对象
result = isinstance((1,2), Iterable)
print(result)

# 字符串是可迭代对象
result = isinstance("hello", Iterable)
print(result)

# 字典是可迭代对象
result = isinstance({"a": 10, "b": 100}, Iterable)
print(result)

# 数字不是可迭代对象
result = isinstance(100, Iterable)
print(result)

# 定义类
class MyClass(object):
    pass

# 创建对象
c1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)

运行结果

True
True
True
True
False
False

4.如何将一个不可迭代的对象转换为可迭代对象:

  在探讨这个问题之前我们需要了解,可迭代对象的本质:可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。而在python中内置的魔法方法__iter__()方法可以将一个对象转换为可迭代对象,因此只要一个类中有__iter__()方法,那么这个类实例出的对象就是个可迭代对象,接下来我们你验证下:

from collections import Iterable
# 使用isinstance() 函数检测某个对象是否是一个可迭代的对象

class MyClass(object):
    # 可迭代对象的本质是,类中是否定义了 __iter__() 方法
    def __iter__(self):
        return self

c1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)

 运行结果

true

5.创建一个迭代器类

  那么上面的创建的迭代对象能用next()访问吗?结果肯定是不能的,我们虽然在类中定义了一个__iter__()方法,但我们并没有定义一个函数去迭代这个类,这时我们需要用python的内置方法__next__()去迭代这个对象,接下来我们会分别创建一个迭代器和迭代对象去s验证:

from collections import Iterable
from collections import Iterator

class StudentList(object):

    def __init__(self):
        # 创建列表
        self.items = list()

    def addItem(self,item):
        # 追加元素到列表中
        self.items.append(item)

    def __iter__(self):

        # 创建迭代器对象
        studentIterator = StudentIterator(self.items)

        # 返回迭代器对象
        return studentIterator

# 定义迭代器
class StudentIterator(object):
    # 定义构造方法
    # 1)完成 索引下标定义和初始化
    # 2)接收要遍历的列表值

    def __init__(self, items):

        self.items = items
        self.current_index = 0

    def __iter__(self):
        return self

    def __next__(self):
        # 判断位置是否合法
        if self.current_index < len(self.items):
            # 根据current_index 返回列表值
            item = self.items[self.current_index]
            # 让 下标+1
            self.current_index += 1
            # 返回元素内容
            return item

        else:
            # 停止迭代
            # 主动抛出异常,迭代器没有更多的值(到了迭代器末尾)
            raise StopIteration

# 实例化对象
stulist = StudentList()

stulist.addItem("小明")
stulist.addItem("小红")
stulist.addItem("小刚")
# 检查是否是可迭代对象
result = isinstance(stulist, Iterable)
print(result)

for value in stulist:
    print(value)

image-20180704185515374

  运行结果

小明
小红
小刚

注意:如果我们用next()访问的次数超过迭代对象的范围会报错,也许你会疑问为什么平时我们遍历列表,元组等可迭代对象时为什么没有这种情况,那是因为python内部在我们遍历可迭代对象时超出范围会自动停止,我们定义迭代器类时直接抛出错误了,没有做那么复杂的处理。

    

  

 

  

python三大神器之'迭代器'

原文地址:https://www.cnblogs.com/xuchuankun/p/9508329.html

时间: 2024-08-05 16:59:15

python三大神器之'迭代器'的相关文章

python三大神器之virtualenv

http://www.cnblogs.com/freely/p/8022923.html https://blog.csdn.net/weixin_42874054/article/details/83448531 查看pip版本: [email protected]:~$ pip --version pip 19.0.1 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6) 原文地址:https://www.cnblogs.c

python三大神器之fabric

Fabric Fabric是一个python的远程执行shell的库,同时它也是一个命令行工具.它提供了丰富的同 SSH 交互的接口,可以用来在本地或远程机器上自动化.流水化地执行 Shell 命令. 安装Fabric Fabric的官网是 www.fabfile.org,源码托管在Github上.你可以clone源码到本地,然后通过下面的命令来安装.但是在源码安装前,你必须先将Fabric的依赖包Paramiko装上.   python setup.py develop 同时也可以使用pip安

shell编程三大神器之sed

shell编程三大神器之awk

shell编程三大神器之grep

Python高级特性:迭代器和生成器 -转

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()

python高级编程之迭代器与生成器

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #迭代器与生成器 #--------------------------------------- #迭代器基于2个方法 """ next:返回容器下一个项目 __iter__:返回迭代器本身 """ #通过内建函数和序列来创建 i=iter('abc') print i.next()#a print i.next(

Python标准库:迭代器Itertools

Infinite Iterators: Iterator Arguments Results Example count() start, [step] start, start+step, start+2*step, ... count(10) --> 10 11 12 13 14 ... cycle() p p0, p1, ... plast, p0, p1, ... cycle('ABCD') --> A B C D A B C D ... repeat() elem [,n] elem

ORACLE恢复神器之ODU/AUL/DUL

分享ORACLE数据库恢复神器之ODU.DUL和AUL工具. ODU:ORACLE DATABASE UNLOADER DUL:DATA UNLOADER AUL:也称MyDUL 关于三种工具说明: (1)Oracle 的内部工具是DUL(Data UnLoader).这个需要Oracle 的支持. (2)老熊写的ODU   网址:http://www.oracleodu.com/en/ (3)d.c.b.a (支付宝 楼方鑫)写的AUL. 网址:http://www.anysql.net/do