欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

s21day17 python笔记

程序员文章站 2022-05-14 12:52:11
s21day17 python笔记 一、内容回顾及补充 1. 回顾 2. 补充 第三方模块补充 需要下载安装后才能导入使用 安装方式: pip包管理工具 源码安装 安装路径:C:\Python37\Lib\site packages 常用的第三方模块:requests / xlrd 二、 迭代器 2 ......

s21day17 python笔记

一、内容回顾及补充

  1. 回顾

  2. 补充

    • 第三方模块补充

      • 需要下载安装后才能导入使用

      • 安装方式:

        • pip包管理工具
        # 把pip.exe 所在的目录添加到环境变量中。
        pip install 要安装的模块名称  # pip install xlrd
        • 源码安装
        # 下载源码包(压缩文件) -> 解压 -> 打开cmd窗口,并进入此目录:cd c:\python37\lib\site-packages
        # 执行:python3 setup.py build
        # 执行:python3 setup.py install
      • 安装路径:c:\python37\lib\site-packages

      • 常用的第三方模块:requests / xlrd

二、 迭代器

2.1 基本知识

  1. 用途:对 某种对象(str/list/tuple/dict/set类创建的对象-可迭代对象)中的元素进行逐一获取

  2. 表象:具有__next__方法且每次调用都获取可迭代对象中的元素(从前到后一个一个获取)

  3. 示例:

    • 列表转换成迭代器:
      • v1 = iter([11,22,33,44])
      • v1 = [11,22,33,44].__iter__()
    • 迭代器想要获取每个值:反复调用 val = v1.__next__()
    v1 = [11,22,33,44]
    
    # 列表转换成迭代器
    v2 = iter(v1)
    
    # 迭代器获取每个值
    result1 = v2.__next__()
    print(result1)
    result2 = v2.__next__()
    print(result2)
    result3 = v2.__next__()
    print(result3)
    result4 = v2.__next__()
    print(result4)
    
    result5 = v2.__next__()
    print(result5)    # 报错:stoplteration    表示已经迭代结束
  4. for循环:运用了迭代器

    v1 = [11,22,33,44]
    
    # 1.内部会将v1转换成迭代器
    # 2.内部反复执行 迭代器.__next__()
    # 3.取完不报错
    for item in v1:
        print(item)

2.2 可迭代对象

  • 标记:
    • 内部具有 __iter__() 方法且返回一个迭代器。(*)
    • 可以被for循环

三、 生成器

3.1 基本知识

  1. 可以理解为:函数的变异、特殊的迭代器、特殊的可迭代对象

  2. 生成器的作用:

    • 生成数据
    • 迭代
  3. 示例:

    # 生成器函数(内部是否包含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)

3.2 总结

  1. 重点:

    • 函数中如果存在yield,那么该函数就是一个生成器函数
    • 调用生成器函数会返回一个生成器
    • 生成器只有被for循环时,生成器函数内部的代码才会执行,每次循环都会获取yield返回的值
  2. 建议:

    • 生成器函数中一般不要有return

    • 如果需要终止生成器函数中的循环,可以用return

      def func():
          count = 1
          while true:
              yield count
              count += 1
              if count == 100:
                  return
      val = func()
      for item in val:
          print(item)
  3. 生成器示例:读取大文件内容

    def func():
        #  分批去读取文件中的内容,将文件的内容返回给调用者。
        cursor = 0
        while true:
            f = open('db', 'r', encoding='utf-8')    # 通过网络连接上redis
            # 代指  redis[0:10]
            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()  # 关闭与redis的连接
    
            for row in data_list:
                yield row
    
    for item in func():
        print(item)