美文网首页Python新世界
关于python中可迭代对象和迭代器的一些理解!

关于python中可迭代对象和迭代器的一些理解!

作者: 919b0c54458f | 来源:发表于2018-12-15 10:49 被阅读1次

    很多 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 进行下标迭代

    jinqun1:960410445  即可获取数十套PDF哦!

    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、集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象

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

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

    from collections.abc import Iterator, Iterable

    class 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, Iterable

    class 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_val

    if __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() 函数将可迭代的转换为迭代器

    相关文章

      网友评论

        本文标题:关于python中可迭代对象和迭代器的一些理解!

        本文链接:https://www.haomeiwen.com/subject/zknohqtx.html