zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    普通平衡树(AVL树)
    正态分布与二项分布
    grahql操作
    skywalking定时删除在大并发下引起的性能问题
    Apache SkyWalking SQL注入漏洞复现分析 (CVE-2020-9483)
    skywalking远程调试Apache SkyWalking SQL注入
    sourceTree详细使用教程
    git 分支的相关操作、创建分支、查看分支、切换分支、删除分支
    [Git高级教程 (一)] 通过Tag标签回退版本修复bug
    idea 版本2018.3.6版本的安装
  • 原文地址:https://www.cnblogs.com/chen55555/p/10209677.html
Copyright © 2011-2022 走看看