zoukankan      html  css  js  c++  java
  • 生成器,迭代器

    生成器函数

      一个函数带着yield就是生成器函数
    
      调用之后不执行,需要next来触发这个函数继续向下执行
    
      一个函数中可以多个yield
    
      生成器函数得到的是一个生成器
    
      启动生成器第一个方法永远是next

    生成器函数和其他函数的区别

      生成器函数和其他函数[本质上]我们得到的结果是相同的
    
      只不过中间过程不同
    
      普通函数 必须得到所有结果之后才返回
    
      生成器函数 可以一边计算结果一边返回

    生成器

      生成器的本质可就是迭代器  
    
      在生成器中 通过next取到的值才是yield的返回值

    生成器函数有什么特点

      调用的时候不执行
    
      返回一个生成器/迭代器
    
      从生成器中取值的方式和迭代器一样
    
    生成器函数中 
    
      send/__next__ 生成器函数之外用的
    
      yield/yield from生成器函数之内用的
    
      next+send==yield
    
      如果函数中的yield要接受参数,那么应该使用send传值
    
      如果函数中的yield不需要接受参数,那么应该使用next
    
      生成器和迭代器都是一样的 ,内部的值都只能取一次
    
      从生成器中取值的方式也和迭代器是一样的:  
    
          for 
    
          next/send
    
          数据类型的强制转换(list8)

     迭代器

      iter 迭代
    
      iterable 可迭代
    
      整数类型是不可迭代的
    
      dir函数是查看一个数据类型内部含有哪些方法
    
       两边带着双下划线的方法就叫做'魔术方法''双下方法''内置方法'
    
      可迭代协议:只要含有__iter__方法的数据类型都是可以迭代的
    
      可迭代的都可以使用for循环

    检查某个变量/值 是不是可迭代的呢

      1.print('__iter__'in dir([]))

      2form collection import Iterable

        print(isinstance([],iterable))

    迭代器的作用;

      节省空间

      for循环就是利用了迭代器节省内存的特点来对Python当中的变量来进行操作

    res=[1,2,3,4]
    
    print(res.__length__())  查看迭代器中有多少个元素
    
    print(res.__setstate__() 控制迭代器从哪开始迭代
    
    print(res.__next__())  从迭代器中取下一个值

    for 循环一个列表的时候必须用的

      __next__  取下一个值

    迭代器协议:

      内部含有__next__ 和__iter__ 的方法的值变量都是迭代器

    如何让创建一个迭代器

      可迭代变量.__iter__()    返回一个迭代器

    迭代器的特点:(节省内存,惰性运算,一次性取值只能按顺序取)

      具有next和iter 方法

      通过一个next多次执行就可以获得所有这个容器中的值

      迭代器中的值只能取一次

      不能取的时候不出现

    for循环取值

      第一种  for

      第二种 next

      第三种 数据类型的类型转换

      for循环内部的机制就是迭代器取值的机制

      在for循环执行过程中:先把可迭代的变成一个迭代器,然后只在丛中一个一个的取值

    for循环和可迭代的关系

      所有的迭代器都是可迭代的

      迭代器都是特殊的存在

    for循环和迭代器的关系

      无论是可迭代的还是迭代器都可以被for循环

      如果直接循环迭代器,那么循环一次就没有了

      如果循环的是飞迭代器,那么每一次循环相当于从头到尾的循环

    range生成的就是迭代器 创建这个迭代器并不会真的吧迭代器中的所有数据一次性生成

    什么时候生成呢?

      只有通过next取值的时候才会生成

    记住你要多少个值,当前该给你什么,并且记住我下一个该给你什么,下一个个当前这个数的关系

      

      

  • 相关阅读:
    149. Max Points on a Line(js)
    148. Sort List(js)
    147. Insertion Sort List(js)
    146. LRU Cache(js)
    145. Binary Tree Postorder Traversal(js)
    144. Binary Tree Preorder Traversal(js)
    143. Reorder List(js)
    142. Linked List Cycle II(js)
    141. Linked List Cycle(js)
    140. Word Break II(js)
  • 原文地址:https://www.cnblogs.com/z1115230598/p/9917209.html
Copyright © 2011-2022 走看看