zoukankan      html  css  js  c++  java
  • doraemon的python 迭代器与生成器

    6.9 迭代器

    6.9.1迭代器的定义

    自己不用写,只需要学会用

    迭代器:对可迭代对象中的元素进行逐一获取,表象:具有'' next ''方法且每次调用都获取可迭代对象中的元素(从前到后一个个获取)

    • 列表转化为迭代器:

      • v1 = iter([11,22,33,44])

      • v1 = [11,22,33,44].iter()

    • 迭代器想要获取每个值,就必须反复执行

    v1 = [11,22,33,44]

    #列表转化成迭代器
    v2 = iter(v1)
    result = v2.__next__()
    result = v2.__next__()
    result = v2.__next__()
    result = v2.__next__()
    #如果报错:Stopiteration,表示已经迭代完成

    v1 = [11,22,334,44]
    v2 = iter(v1)
    while True:
       try:
           val = v2.__next__()
           print(val)
       exceppt Exception as e:
           break
    • for 循环

    v1 = [11,22,334,44]

    #内部会将v1转换成迭代器
    #内部会反复执行 迭代器.__next__()
    #取完后不报错

    for item in v1:
    print(item)

    6.9.2 可迭代对象

    • 内部具有 iter() 方法并且返回一个迭代器

    v1 = [11,223,33,44]
    result = v1.__iter__()
    • 可以被for循环

    6.10生成器(函数的变异)

    #函数
    def func():
       return 123
    func()
    #生成器很熟(内部包含有yield)
    def func():
       print('F1')
       yield 1
       print('F2')
       yield 2
       print('F3')
       yield 100
       print('F4')    
       
    #函数内部代码不会执行,返回一个生成器对象,只有被for循环才只想内部代码
    v1 = func()

    #生成器是可以被for循环,一旦开始循环那么函数内部得代码就会开始执行
    for item in v1:
       print(item)

    6.10.1 生成器推导式

    #正常循环
    def func():
    result = []
       for i in range(10):
           result.append(i)
       return result
    v1 = func()
    for item in v1():
    print(v1)
       
    #推导式
    v1 = [i for i in range(10)]#列表推导式立即循环创建所有的元素


    #正常循环
    def func():
    for i in range(10):
           def f():
               return i
           yield f
    v2 = func()
    for item in v2():
       print(item())

    #推导式
    v2 = (lambda :i for i in range(10))
    for item in v2:
       print(item())
    #生成器推导式,创建了一个生成器,内部循环未执行。也就是说,i还是一个变量,还没有赋值,只有等到for循环的时候,i就从0开始循环。

     

    • 案例

    def func():
       count = 1
       while True:
           yield count
           count += 1
           if count == 99
          return
           
    val = func()

    for item in val:
       print(item)
    • 示例:读文件

    def func():
       """
      分批次去读取文件的内容,将文件的内容返回给调用者
      """
       cursor = 0
       while True:
           with open('a.txt',mode='r',encoding='utf-8') as f:
               f.seek(cursor)  #将光标移动到指定的位置
               data_list = []
               for i in range(10):
                   len = f.readline()
                   if not len:
                       return
                   data_list.append(len)
               cuesor = f.tell()  #获取光标的位置
               f.close()
               
               for row in data_list:
                   yiled row
                   
    for item in func():
       print(item)

     

  • 相关阅读:
    基于Android的学生电子假条管理平台(笔记18)
    基于Android的学生电子假条管理平台(笔记17)
    请假制度管理与责任规避(笔记16)
    高校学生考勤管理系统功能设计(笔记15)
    浅析普通高校考勤请假制度的困境及其解决方法(笔记14)
    浅析普通高校考勤请假制度的困境及其解决方法(笔记13)
    高职大学生非正常请假现象透视(笔记12)
    学校应该完善与落实学生考勤制度——两张与众不同的请假条的故事(笔记11)
    《基于ASP.NET技术的小区物业管理系统设计与实现》论文笔记(二十)
    《基于JSP小区物业信息管理系统的设计与实现》论文笔记(十九)
  • 原文地址:https://www.cnblogs.com/doraemon548542/p/11241792.html
Copyright © 2011-2022 走看看