• python中的迭代器(iterable)和迭代对象(iterator), type和isinstance


    iterable:可迭代对象有 str,list,tuple,set,dic, range(),文件句柄

    判断可迭代对象方法:

    方法一

    s = 'abcdefg'
    # # 内部有__iter__方法的就是可迭代对象,遵循可迭代协议
    # print(dir(s))
    print('__iter__' in dir(s))     # Ture
    print('__next__' in dir(s))     # False
    
    li = [1, 2, 3, 4]
    print('__iter__' in dir(li))    # Ture
    print('__next__' in dir(li))    # False
    
    t = (1, 2, 3, 4)
    print('__iter__' in dir(t))     # Ture
    print('__next__' in dir(t))     # False
    
    se = {1, 2, 3, 4}
    print('__iter__' in dir(se))     # Ture
    print('__next__' in dir(se))     # False
    
    dic = {'name': 'rock', 'age': 23, 'gender': 'male'}
    print('__iter__' in dir(dic))     # Ture
    print('__next__' in dir(dic))     # False
    
    
    # 把可迭代对象转化成迭代器
    s = 'abcdefg'
    # obj = s.__iter__()
    obj = iter(s)
    print(obj.__next__())   # 每次找到一个元素
    print(obj.__next__())
    # 内部既有__iter__又有__next__方法的就是迭代器
    print('__iter__' in dir(obj))
    print('__next__' in dir(obj))
    
    # 文件句柄时可迭代器
    f1 = open('1.txt', 'r', encoding='utf-8')
    print('__iter__' in dir(f1))     # Ture
    print('__next__' in dir(f1))     # Ture
    f1.close()

     方法二

    from collections import Iterable
    from collections import Iterator
    s = 'abcdefg'
    # obj = s.__iter__()
    obj = iter(s)
    
    print(isinstance(s, Iterator))      # False 判断是否是可迭代器
    print(isinstance(s, Iterable))      # True 判断是否是可迭代对象
    print(isinstance(obj, Iterator))    # True 判断是否是可迭代器
    print(isinstance(obj, Iterable))    # True 判断是否是可迭代对象

    迭代器的作用:

    1.节省内存,只记录第一个元素和下一个元素的地址,用完释放
    2、惰性机制,next一次访问一个
    3、一条路到黑,不走回头路
    s2 = [1, 2, 3, 4, 5]
    obj2 = iter(s2)
    print(next(obj2))
    print(next(obj2))

    isinstance和type的区别

    # type() isinstance()区别?
    # type()只是判断该对象的数据类型
    isinstance()    # 不仅可以判断该对象的数据类型,而且可以判断其他很多。
    s1 = 'abcd'
    print(isinstance(s1, str))
    print(type(s1))

     while模拟for循环

    # while 循环模拟for循环机制
    li = [i for i in range(20)]
    obj = iter(li)
    while 1:
        try:
            print(next(obj))
        except StopIteration:
            break
  • 相关阅读:
    在 Queue 中 poll()和 remove()有什么区别?
    jdk 8 HashMap源码解读
    java 中,没有任何方法和成员变量的接口
    ArrayList、LinkedList、Vector、Array
    StringBuilder和StringBuffer
    Collection
    jdk代理和cglib代理源代码之我见
    多 线程
    Spring的@Enable*注解的工作原理
    redis 学习
  • 原文地址:https://www.cnblogs.com/chen55555/p/10209677.html
Copyright © 2020-2023  润新知