zoukankan      html  css  js  c++  java
  • for循环 底层工作原理

    for 循环是对容器进行迭代的过程。

    • 什么是迭代?

      迭代就是从某个容器对象中逐个地读取元素,直到容器中没有更多元素为止。

    • for 循环的步骤是什么?

    1. 先判断对象是否为可迭代对象,不是的话直接报错,抛出TypeError异常,是的话,调用 __iter__方法返回一个迭代器
    2. 不断地调用迭代器的__next__方法,每次按序返回迭代器中的一个值
    3. 迭代到最后,没有更多元素了,就抛出异常 StopIteration,这个异常 python 自己会处理,不会暴露给开发者
    • 那么,哪些对象支持迭代操作?任何对象都可以吗?

      for 循环本质是不断地调用迭代器的__next__方法,直到有 StopIteration 异常为止,

      所以任何可迭代对象都可以作用在for循环中。

    弄明白了 for 的执行原理之后,我们就可以实现自己的迭代器用在 for 循环中:

     1 class MyRange:
     2     def __init__(self, num):
     3         self.i = 0
     4         self.num = num
     5 
     6     def __iter__(self):
     7         return self
     8 
     9     def __next__(self):
    10         if self.i < self.num:
    11             i = self.i
    12             self.i += 1
    13             return i
    14         else:
    15             # 达到某个条件时必须抛出此异常,否则会无止境地迭代下去
    16             raise StopIteration() 

    因为它实现了__next__方法,所以 MyRange 本身已经是一个迭代器了,所以 __iter__返回的就是对象本身 self。

    现在用在 for 循环中试试:

    1 for i in MyRange(3):
    2     print(i)
    3 # 输出
    4  0
    5  1
    6  2

    有没有发现,自定义的 MyRange 功能和内建函数 range很相似。

    综上所述:

    for 循环本质是不断地调用迭代器的__next__方法,直到有 StopIteration 异常为止,所以任何可迭代对象都可以作用在for循环中。

  • 相关阅读:
    ORM取数据很简单!是吗?
    谨慎使用反射机制
    AxeSlide软件项目梳理
    Uncaught Error: Cannot find module 'strip-ansi'
    vue 子组件data属性为啥必须是一个函数
    new FormData()
    computed methods watch filters
    关于template标签用法总结(含vue中的用法总结)
    区分http请求状态码来理解缓存(协商缓存和强制缓存)
    canvas绘制--圆角多边形
  • 原文地址:https://www.cnblogs.com/liangmingshen/p/9405875.html
Copyright © 2011-2022 走看看