zoukankan      html  css  js  c++  java
  • 迭代器

    1. 什么是可迭代对象:实现了 __iter__()方法的对象,为可迭代对象。

    2. 什么是迭代器: 实现了 __iter__()方法,并且__iter__()必须返回一个对象的引用,这个对象中不但实现了iter()方法,还需要__next__()方法。

    3. 迭代器不生成数据,只保存生成数据的方式。

    4. 迭代器可以for循环,每次for循环,返回的是__next__()方法中的返回值。

    5. for循环的过程,如:

    for name in classmate:
        print(name)
        time.sleep(1)

    1. 判断classmate是否是可以迭代的对象,  即是否实现了__iter__()方法。  isinstance(classmate, Iterable))

    2. __iter__()方法是否返回了一个具有 __iter__()方法和__next__()方法的对象引用。

    import time
    from collections import Iterable
    from collections import Iterator
    
    
    class Classmate(object):
        def __init__(self):
            self.names = list()
    
        def add(self, name):
            self.names.append(name)
    
        def __iter__(self):
            """如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
            return ClassIterator()
    
    
    class ClassIterator(object):
        def __iter__(self):
            pass
    
        def __next__(self):
            return 11
    
    
    classmate = Classmate()
    classmate.add("老王")
    classmate.add("王二")
    classmate.add("张三")
    
    for name in classmate:
        print(name)
        time.sleep(1)
    01-迭代器-初步

    循环这个迭代器时,会输出__next__()方法的返回值,即11

    import time
    from collections import Iterable
    from collections import Iterator
    
    
    class Classmate(object):
        def __init__(self):
            self.names = list()
    
        def add(self, name):
            self.names.append(name)
    
        def __iter__(self):
            """如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
            return ClassIterator(self)
    
    
    class ClassIterator(object):
    
        def __init__(self, obj):
            self.obj = obj
            self.current_num = 0
    
        def __iter__(self):
            pass
    
        def __next__(self):
            if self.current_num < len(self.obj.names):
                ret = self.obj.names[self.current_num]
                self.current_num += 1
                return ret
            else:
                raise StopIteration
    
    
    classmate = Classmate()
    classmate.add("老王")
    classmate.add("王二")
    classmate.add("张三")
    
    # print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))
    # classmate_iterator = iter(classmate)
    # print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))
    # print(next(classmate_iterator))
    
    for name in classmate:
        print(name)
        time.sleep(1)
    02-迭代器

    循环时,输出 ‘老王’, ‘王二’, ‘张三’

    import time
    from collections import Iterable
    from collections import Iterator
    
    
    class Classmate(object):
        def __init__(self):
            self.names = list()
            self.current_num = 0
    
        def add(self, name):
            self.names.append(name)
    
        def __iter__(self):
            """如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
            return self  # 调用iter(xxobj)的时候 只要__iter__方法返回一个 迭代器即可,至于是自己 还是 别的对象都可以的, 但是要保证是一个迭代器(即实现了 __iter__  __next__方法)
    
        def __next__(self):
            if self.current_num < len(self.names):
                ret = self.names[self.current_num]
                self.current_num += 1
                return ret
            else:
                raise StopIteration
    
    
    classmate = Classmate()
    classmate.add("老王")
    classmate.add("王二")
    classmate.add("张三")
    
    # print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))
    # classmate_iterator = iter(classmate)
    # print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))
    # print(next(classmate_iterator))
    
    for name in classmate:
        print(name)
        time.sleep(1)
    03-迭代器(__iter__()返回自己)
    class Fibonacci(object):
        def __init__(self, all_num):
            self.all_num = all_num
            self.current_num = 0
            self.a = 0
            self.b = 1
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.current_num < self.all_num:
                ret = self.a
            
                self.a, self.b = self.b, self.a+self.b
                self.current_num += 1
    
                return ret
            else:
                raise StopIteration
    
    
    fibo = Fibonacci(10)
    
    
    for num in fibo:
        print(num)
    04-使用迭代器生成斐波那契数列
  • 相关阅读:
    应用一:Vue之开发环境搭建
    基于vue项目的js工具方法汇总
    JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去… 及其浮点数计算精度问题(推荐的类库 Numeral.js 和 accounting.js)
    Redis源码分析(二十五)--- zmalloc内存分配实现
    Redis源码分析(二十五)--- zmalloc内存分配实现
    SpringBoot系列——WebMvcConfigurer介绍
    跨域问题与SpringBoot解决方案
    源码分析SpringBoot启动
    SpringBoot+SpringSecurity+jwt整合及初体验
    【mysql学习】InnoDB数据结构
  • 原文地址:https://www.cnblogs.com/yuqiangli0616/p/10123313.html
Copyright © 2011-2022 走看看