博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于python中可迭代对象和迭代器的一些理解
阅读量:6880 次
发布时间:2019-06-27

本文共 3745 字,大约阅读时间需要 12 分钟。

很多python教程中,对python的解释不容易理解,本文记录自己的理解和体会,是对迭代器和生成器的初步理解

一、关于迭代的认识

给定一个列表、元祖、字典、甚至字符串,我们使用for去遍历,这样我们叫迭代

  • 1、列表的迭代

    list1 = ['哈哈', '西西', '嘻嘻']for x in list1:    print(x)复制代码
  • 2、列表中需要迭代出下标使用enumerate

    list1 = ['哈哈', '西西', '嘻嘻']for index, value in enumerate(list1):    print(index, value)复制代码
  • 3、元祖和字符串的迭代与列表的类似,一样的可以使用enumerate进行下标迭代

  • 4、字典的迭代方式一

    dict1 = {
    'name': '张三', 'age': 20, 'gender': '男'}for item in dict1: print(item)复制代码
  • 5、字典的迭代方式二

    dict1 = {
    'name': '张三', 'age': 20, 'gender': '男'}for key in dict1.keys(): print(key)复制代码
  • 6、字典的迭代方式三

    dict1 = {
    'name': '张三', 'age': 20, 'gender': '男'}for value in dict1.values(): print(value)复制代码
  • 7、字典的迭代方式四

    dict1 = {
    'name': '张三', 'age': 20, 'gender': '男'}for k, v in dict1.items(): print(k, v)复制代码

二、可迭代与迭代器的区别

  • 1、可迭代一般都可以使用for来遍历

  • 2、迭代器不仅仅可以使用for遍历还可以使用next()函数一次获取一个元素

  • 3、可迭代转换迭代对象使用iter(可迭代对象)

  • 4、判断可迭代对象与迭代器的方式

    from collections.abc import Iterator, Iterable# Iterable 表示可迭代对象# Iterator 表示迭代器list1 = [1, 2, 3]print(isinstance(list1, Iterator))print(isinstance(list1, Iterable))print(isinstance(iter(list1), Iterator))复制代码
  • 5、集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象

三、自己实现一个可迭代的对象

  • 1、方式一(在类中实现__getitem__魔法函数)

    from collections.abc import Iterator, Iterableclass Company(object):    def __init__(self, employee_list):        self.employee = employee_list    def __getitem__(self, item):        return self.employee[item]if __name__ == "__main__":    company = Company(['张三', '李四', '王五'])    print(isinstance(company, Iterable))    print(isinstance(company, Iterator))    print(isinstance(iter(company), Iterator))    for item in company:        print(item)复制代码
  • 2、方式二(在类中实现__iter__魔法函数,需要结合__next__魔法函数)其实已经是迭代器

    from collections.abc import Iterator, Iterableclass Company(object):    def __init__(self, employee_list):        self.employee = employee_list        self.index = 0    def __iter__(self):        return self            def __next__(self):        try:            current_val = self.employee[self.index]        except IndexError:            raise StopIteration        self.index += 1        return current_valif __name__ == "__main__":    company = Company(['张三', '李四', '王五'])    print(isinstance(company, Iterable))    print(isinstance(company, Iterator))    for item in company:        print(item)复制代码
  • 3、总结

    • 1.iter内置函数会调用__iter__魔法函数,如果没有__iter__ 魔法函数就会去调用__getitem__魔法函数
    • 通过isinstance(company, Iterable)判断对象是否可迭代
    • 通过isinstance(company, Iterator)判断对象是否为迭代器
    • 可迭代器对象不代表是迭代器,但是可以通过iter()函数将可迭代的转换为迭代器

四、自定义迭代器

  • 1、最简单也是最粗暴的方式,直接在类中实现两个魔法函数__iter____next__函数

    from collections import Iterable, Iteratorclass Foo(object):    def __init__(self, start, stop):        self.start = start        self.stop = stop    def __iter__(self):        return self    def __next__(self):        if self.start > self.stop:            raise StopIteration        self.start += 1        return self.startif __name__ == "__main__":    foo = Foo(1, 5)    print(isinstance(foo, Iterable))    print(isinstance(foo, Iterator))复制代码
  • 2、单独定义一个类来继承迭代器,必须实现__next__魔法函数

    from collections.abc import Iterable, Iteratorclass MyInterator(Iterator):    """    定义一个迭代器    """    def __init__(self, employee_list):        self.iter_list = employee_list        self.index = 0    def __next__(self):        try:            word = self.iter_list[self.index]        except IndexError:            raise StopIteration        self.index += 1        return word复制代码
    class Company(object):    def __init__(self, employee_list):        self.employee = employee_list        self.index = 0    def __iter__(self):        return MyInterator(self.employee)if __name__ == "__main__":    company = Company(['张三', '李四', '王五'])    print(isinstance(company, Iterator))    print(isinstance(company, Iterable))复制代码

转载地址:http://uufbl.baihongyu.com/

你可能感兴趣的文章
人脸识别技术的真相
查看>>
Netflix是这样炼成的:谁构建,谁运维
查看>>
Docker Containers LiveLessons课程的评论与问答
查看>>
独家!阿里开源自用OpenJDK版本,Java社区迎来中国力量
查看>>
Rust 1.31正式发布,首次引入Rust 2018新功能
查看>>
架构设计复杂度的6个来源
查看>>
访谈:Kotlin在Pinterest的逆势生长
查看>>
QCon讲师对对碰——洪小军采访梁宇鹏:就是爱Golang
查看>>
MultiDex工作原理分析和优化方案
查看>>
解密新一代Java JIT编译器Graal
查看>>
IBM在云计算中推动了Swift并使用了Swift的运行环境、包目录和其更多属性
查看>>
MongoDB 是如何鼓励和激励开发者社区的
查看>>
Apple开源新的压缩算法LZFSE
查看>>
.NET Core运行时和基础类库性能提升
查看>>
当编程语言掌握在企业手中,是生机还是危机?
查看>>
HTML5 Canvas玩转酷炫大波浪进度图
查看>>
RethinkDB已经将其数据库移植到Windows
查看>>
可观测性对测试的影响:QCon伦敦大会上对Amy Phillips的访谈
查看>>
Sharding-Sphere成长记——写在分布式数据库代理端里程碑版本3.0.0发布之际
查看>>
JS阻止事件冒泡以及浏览器默认行为
查看>>