• 20.python迭代器


    可迭代对象Iterable和迭代器对象Iterator

    可迭代对象:

    满足前提:

    可以被循环操作的对象,就是可迭代对象

    举例:str、list、tuple、set、dict、range、generator...

    如何高效的检测一个对象是否是可迭代对象?

    可以使用collections模块中的Iterable类型配合isinstance(obj,type)内置函数来判断即可

    操作步骤如下:

    步骤一:导入collections模块

    步骤二:collections.Iterable(类型)配合内置函数isinstance()来进行判断,代码如下:

    isinstance(obj,collections.Iterable)

    如果返回值为True,那么它就是一个可迭代对象

    如果返回值为False,那么它不是一个可迭代对象


    演示如何判断是否是可迭代对象

    import collections
    str1 = 'abcdefg'
    lt = [1,2,3,4,5]
    tp = (10,20,30)
    s = {100,200,300,400}
    dic1 = {'aa':'AA','bb':'BB'}
    r = range(10)
    gen = (x for x in range(5))

    print(isinstance(str1,collections.Iterable))       #True
    print(isinstance(lt,collections.Iterable))         #True
    print(isinstance(tp,collections.Iterable))         #True
    print(isinstance(s,collections.Iterable))          #True
    print(isinstance(dic1,collections.Iterable))       #True
    print(isinstance(r,collections.Iterable))          #True
    print(isinstance(gen,collections.Iterable))        #True

    print(isinstance(100,collections.Iterable))        #False 对于这种整数型数据100没有循环的概念

    迭代器对象:

    满足前提:

    1).必须是一个可迭代对象

    2).可以被next()函数所调用的

    举例:generator...

    如何高效的检测一个对象是否是迭代器对象

    可以使用collections模块中的Iterator类型配合isinstance(obj,type)内置函数来判断即可

    操作步骤如下:

    步骤一:导入collections模块

    步骤二:collections.Iterator(类型)配合内置函数isinstance()来进行判断,代码如下:

    isinstance(obj,collections.Iterator)

    如果返回值为True,那么它就是一个可迭代对象

    如果返回值为False,那么它不是一个可迭代对象

    演示是否是迭代器对象

    import collections
    str1 = 'abcdefg'
    lt = [1,2,3,4,5]
    tp = (10,20,30)
    s = {100,200,300,400}
    dic1 = {'aa':'AA','bb':'BB'}
    r = range(10)
    gen = (x for x in range(5))

    print(isinstance(str1,collections.Iterator))      #False
    print(isinstance(lt,collections.Iterator))        #False
    print(isinstance(tp,collections.Iterator))        #False
    print(isinstance(s,collections.Iterator))         #False
    print(isinstance(dic1,collections.Iterator))      #False
    print(isinstance(r,collections.Iterator))         #False

    print(isinstance(gen,collections.Iterator))       #Ture 只有gen能被next()函数调用
    以下代码有问题:问题在于iterator对象才能被next()函数所调用
    # print(next(lt))     #TypeError

     

    再谈类型转换:
    将可迭代对象转换为迭代器对象
    内置函数:iter(iterable)

    #假设一个内置函数iter()里面必须传入一个叫iterable对象,将可迭代对象转换成迭代器对象
    #内置函数iter 传入lt对象 返回给it1对象

    lt = [1,2,3,4,5]
    tp = (10,20,30)

    it1 = iter(lt)
    print(it1,type(it1))   #<tuple_iterator object at 0x00000000021BD160> <class 'tuple_iterator'>
    it2 = iter(tp)
    print(it2,type(it2))
    print(next(it1))           #1
    print(next(it2))           #10

    #print(next(lt))    而直接next()是会报错的,因为next()不会执行lt对象类型   TypeError: 'list' object is not an iterator
    以下代码有问题:
    因为3.14属于float类型,它并不是一个Iterable(可迭代对象),
    所以不能被iter()函数转换称为Iterator(迭代器对象)
    # obj = iter(3.14)
    # print(obj,type(obj))

    【注意事项】:

    内置函数:

    iter(iterable)必须只能调用可迭代对象,否则报错

  • 相关阅读:
    任务Task系列之Parallel的静态For,ForEach,Invoke方法
    任务Task系列之使用CancellationToken取消Task
    泛型基础
    串的两种模式匹配算法
    数据结构之串类型
    c#基础知识之设计类型
    挣脱
    数据结构之栈和队列
    数据结构之线性表
    NGUI背包系统
  • 原文地址:https://www.cnblogs.com/bonheur/p/12374446.html
Copyright © 2020-2023  润新知