Python进阶(23)—迭代器

◎知识点

  1. 迭代器概述

  2. 迭代器对象


◎脚本练习

"""迭代器"""

"""
    可以用于for-in语句的对象被称为可以迭代(Iterable)对象。例如:range、列表、元组、字符串、
字典、集合、生成器,都是可迭代对象。
    可以调用内置函数isinstance()判断一个对象是否是可迭代对象。标准库模块collections中的
类Iterable用于表示可迭代对象。
"""

from collections import Iterable

print(isinstance([1, 2, 3], Iterable))  # True
print(isinstance('abc', Iterable))      # True
print(isinstance((i * i for i in range(1, 7)), Iterable))      # True


"""
    如果一个可迭代对象可以作为内置函数next()的实参从而支持惰性推算,那么该对象被称为
迭代器(Iterator)对象。
    对于range、列表、元组、字符串、字典和集合等可迭代对象,都不可以作为内置函数next()的实参,
而生成器可以。所以,生成器是迭代器的一种。
    可以调用内置函数isinstance()判断一个对象是否是迭代器对象。标准库模块collections中的
类Iterator用于表示迭代器对象
"""

from collections import Iterator

L = [1, 2, 3]
s = 'abc'

# next(L) # TypeError: 'list' object is not an iterator
# next(s) # TypeError: 'str' object is not an iterator

print(isinstance(L, Iterator))  # False
print(isinstance(s, Iterator))  # False
print(isinstance((i * i for i in range(1, 7)), Iterator))   # True

"""
    可以调用内置函数iter()把不支持惰性推算的可迭代对象转换为迭代器对象
"""

iter_L = iter(L)
iter_s = iter(s)

print(isinstance(iter_L, Iterator)) # True
print(isinstance(iter_s, Iterator)) # True

print(next(iter_L)) # 1
print(next(iter_s)) # a

"""
    如果一个对象同时实现了特殊方法__iter__()和__next__(),那么该对象也被称为迭代器对象。如果
将该对象用于for-in语句,for-in语句首先会调用特殊方法__iter__()返回一个可迭代对象,然后不断调用
该可迭代对象的特殊方法__next__()返回下一次迭代的值,直到遇到StopIteration时退出循环
"""

class MyIterator(object):
    def __init__(self):
        self.data = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.data > 5:
            raise StopIteration()
        else:
            self.data += 1
            return self.data

for item in MyIterator():
    print(item)

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b
        if self.a > 50:
            raise StopIteration()
        return self.a

for item in Fib():
    print(item)

Python进阶(23)—迭代器


◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_advanced/iterator.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5460.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注