zoukankan      html  css  js  c++  java
  • day11 Python 迭代器

    迭代器

    我们之前一直在用可迭代对象进行迭代操作. 那么到底什么是可迭代对象. 本小节主要讨论可迭代对象. ⾸先我们先回顾一下⽬前我们所熟知的可迭代对象有哪些:

    str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可迭代协议. 什么是可迭代协议. ⾸先我们先看一段错误代码:

     # 对的
    s = "abc" 
    for c in s:
        print(c)
    
    # 错的
    for i in 123:
        print(i)  # TypeError: 'int' object is not iterable    

    注意看报错信息中有这样一句话. 'int' object is not iterable . 翻译过来就是数类型对象是不可迭代的. iterable表⽰可迭代的. 表⽰可迭代协议. 那么如何进⾏验证你的数据类型是否符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有⽅法.

    在打印结果中. 寻找 如果能找到__iter__ ,那么这个类的对象就是⼀个可迭代对象.

    s = "我的哈哈哈"
    print(dir(s)) # 可以打印对象中的⽅法和函数
    print(dir(str)) # 也可以打印类中声明的方法和函数
     

    我们发现在字符串串中可以找到__iter__. 继续看⼀一下list, tuple, dict, set;我们发现这⼏个可以进⾏for循环的东⻄都有__iter__函数, 包括range也有. 可以自⼰试⼀下.

    这是查看一个对象是否是可迭代对象的第一种办法. 我们还可以通过isinstence()函数来查看一个对象是什么类型的。

    综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议. 就可以获取到相应的迭代器. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤迭代器中的__next__()来获取到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理理到底是什么? 继续看代码。

    l = [1,2,3] 
    l_iter = l.__iter__() 
    from collections import Iterable from collections import Iterator 
    print(isinstance(l,Iterable)) #True 
    print(isinstance(l,Iterator)) #False 
    print(isinstance(l_iter,Iterator)) #True 
    print(isinstance(l_iter,Iterable)) #True
    s = "我爱北北京天安⻔门" 
    c = s.__iter__() 
    print(c.__next__()) 
    print(c.__next__()) 
    print(c.__next__()) 
    print(c.__next__()) 
    print(c.__next__()) 
    print(c.__next__()) 
    print(c.__next__()) 
    print(c.__next__())

    # 获取迭代器器
    # 使⽤迭代器器进行迭代. 获取一个元素

    #我

    #爱
    #北
    #京
    #天
    #安
    #⻔
    # StopIteration

    for循环的机制:

    for i in [1,2,3]:
        print(i)
    

    使⽤用while循环+迭代器来模拟for循环(必须要掌握)

    lst = [1,2,3] 
    lst_iter = lst.__iter__() 
    
    while True:
        try:
            i = lst_iter.__next__()
            print(i)
        except StopIteration:
            break

    总结:
    Iterable: 可迭代对象. 内部包含__iter__()函数
    Iterator: 迭代器. 内部包含__iter__() 同时包含__next__(). 迭代器的特点:

    1. 节省内存.
    2. 惰性机制
    3. 不能反复, 只能向下执行.

    for循环的时候. ⼀开始的 时候是__iter__()来获取迭代器. 后⾯每次获取元素都是通过__next__()来完成的. 当程序遇到 StopIteration将结束循环.

  • 相关阅读:
    随机小错2_0527
    随计小错
    C++实现读写文件
    03-树2 List Leaves (25 分)
    获取毫秒级的时间戳
    new对象时,类名后加括号与不加括号的区别
    FoxMail 7.2的邮件存储目录修改
    C/C++ 开源算法库
    VS2015的安装
    脏内存导致BUG的问题
  • 原文地址:https://www.cnblogs.com/fanghongbo/p/9885300.html
Copyright © 2011-2022 走看看