zoukankan      html  css  js  c++  java
  • 第28天python学习迭代和递归

    来源可参考:https://www.cnblogs.com/Mengchangxin/p/9257010.html

    迭代:就好比问路:A问B,B知道C知道,叫A自己去找B。

    递归:就好比问路:A问B,B帮忙问C,C帮忙问D。最后D知道了在返回回去

    迭代器协议:

    1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)

    满足迭代器协议:

    a、内部要有next方法;b、内部有iter()方法

    2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

    3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

    注:可以通过__next__取值,就是迭代器

    for循环的本质:循环所有对象,全都是使用迭代器协议。

    正本清源:

    很多人会想,for循环的本质就是遵循迭代器协议去访问对象,那么for循环的对象肯定都是迭代器了啊,没错,那既然这样,for循环可以遍历(字符串,列表,元组,字典,集合,文件对象),那这些类型的数据肯定都是可迭代对象啊?但是,我他妈的为什么定义一个列表l=[1,2,3,4]没有l.next()方法,打脸么。

    (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环式,调用了他们内部的__iter__方法,把他们变成了可迭代对象

    然后for循环调用可迭代对象的__next__方法去取值,而且for循环会捕捉StopIteration异常,以终止迭代

    基于上面讲的列表的三种访问方式,聪明的你立马看除了端倪,于是你不知死活大声喊道,你这不逗我玩呢么,有了下标的访问方式,我可以这样遍历一个列表啊

    # l=[1,2,3,4]
    # for i in l:#相当于i_l=l._iter_()转换成可迭代对象 在使用 i_l.next()进行取值
    # print(i)

    # l=[1,2,3,4]
    # print(l[0])#第一种方法使用索引取值


    #
    # iter_l=l.__iter__()#遵循迭代器协议,生成可迭代对象,生成可抵达对象就支持next方法
    #
    # print(iter_l.__next__())#使用_next_方法取出第1个值:1
    # print(iter_l.__next__())#使用_next_方法取出第2个值:2
    # print(iter_l.__next__())#使用_next_方法取出第3个值:3
    # print(iter_l.__next__())#使用_next_方法取出第4个值:4

    没错,序列类型字符串,列表,元组都有下标,你用上述的方式访问,perfect!但是你可曾想过非序列类型像字典,集合,文件对象的感受,所以嘛,年轻人,for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for循环来遍历了,而且你看到的效果也确实如此,这就是无所不能的for循环,觉悟吧,年轻人

  • 相关阅读:
    字符串替换
    字符串查找
    字符串比较
    字节与字符串相互转换
    1365. How Many Numbers Are Smaller Than the Current Number
    1486. XOR Operation in an Array
    1431. Kids With the Greatest Number of Candies
    1470. Shuffle the Array
    1480. Running Sum of 1d Array
    【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合
  • 原文地址:https://www.cnblogs.com/jianchixuexu/p/11569237.html
Copyright © 2011-2022 走看看