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

    迭代器和生成器

    知识点补充:类和对象

    • int str list ----类
    • 由类创建的的东西叫做对象

    迭代器

    • 定义:对某对象(str/list/tuple/dict/set)【序列】【可迭代对象】中的元素进行逐一获取

    • 在对字典进行迭代时,只对其键进行迭代

    • 从列表中循环每一个元素

      v1 = [11,22,33,44]
      v2 = iter(v1) #v1是迭代器
      #或者
      v2 = v1.__iter__()
      while True:
          try:
              val = v2.__next__()#每次可迭代一个
              print(val)
          except Exception as e: #如果有异常
              break
      
    • 如何判断一个对象是否为迭代器:1.内部是否有__next__方法 2.利用type( )函数

    • for循环内部就是迭代器

    可迭代对象

    • 可迭代对象的标记:

      • 1.可以被for循环的 2. 内部有__iter__方法且返回一个迭代器

    生成器

    # 生成器函数(内部是否包含yield)
    def func():
        print('f1')
        yield 1
        print('f2')
        yield 2
        print('f3')
        yield 100
        print('f4')
    # 函数内部代码不会执行,返回一个生成器对象
    v1 = func() #函数不执行
    #生成器是可以被for循环的,一旦开始循环那么函数内部代码就开始执行
    for item in v1:
        print(item)
    
    • 利用生成器生成1到10万

      def func():
          count = 1
          while True:
              yield count
              count += 1
              if count = 100000:
                  return
      val = func()
      for i in val:
          print(i)
          #或者
          if i >= 100000:
              break
      #优点边做边用
      
    • 每次循环都会获得yield的返回值

      def func():
          return 2
          yield 1
      a = func()
      print(a)
      
    • 只要yield存在就是生成器

    练习题

    • 分行读取文件的内容

      def func():
          cursor = 0
          while True:
              f = open('db','r',encoding = 'utf-8')
              f.seek(cursor)
              data_list = []
              for i in range(10):
                  line = f.readline()
                  if not line:
                      return
                  data_list.append(line)
              cursor = f.tell()
              f.close()
      
              for rew in data_list:
                  yield rew
      
      for item in func():
          print(item)
      

    补充:

    • 生成器还一种特殊的迭代器,也是一种特殊的可迭代对象
  • 相关阅读:
    SDUT-3376_数据结构实验之查找四:二分查找
    SDUT-3375_数据结构实验之查找三:树的种类统计
    SDUT-3373_数据结构实验之查找一:二叉排序树
    深度优先遍历和广度优先遍历
    SDUT-2498_AOE网上的关键路径
    SDUT-2140_判断给定图是否存在合法拓扑序列
    SDUT-2144_最小生成树
    SDUT-3364_欧拉回路
    SDUT-3363_驴友计划
    Java练习 SDUT-2271_Eddy的难题
  • 原文地址:https://www.cnblogs.com/yangzilaing/p/13507350.html
Copyright © 2011-2022 走看看