No.17迭代器&生成器

No.17

今日概要

  • 迭代器 ▲
  • 生成器 ▲▲
  • 装饰器 ▲▲▲
  • 项目结构
  • loggoing模块

内容回顾和补充

1函数

  • 基本结构

    def func(a1,a2):
        pass
    
    • 参数
    • 返回值
    • 执行函数
  • 函数小高级

    • 函数作变量
    • 函数作参数
  • 函数中高级

    • 函数作返回值
    • 函数的嵌套
  • 装饰器 & 闭包

  • 递归

  • 匿名函数

  • 内置函数

2模块

  • 定义模块

    • 内置 json / time / datetime / os / sys ...
    • 第三方
      • 安装:
        • pip包管理工具:
          • pip install xlrd
        • 源码安装:
          • 下载源码包:压缩文件
          • 解压文件
          • 打开cmd,进入文件的目录 → cd 解压文件路径
          • 执行:python37 setup.py build
          • 执行:python37 setup.py install
      • 安装路径:D:\Python37\Lib\site-packages
      • 你了解的第三方模块
        • xlrd
        • requests
    • 自定义
      • py文件
      • 文件夹 __init__.py
  • 调用模块

    • import

      • import 模块1 模块1.函数()
      • import 模块1.模块2.模块3 模块1.模块2.模块3.函数()
    • from xxx import xxx

      • from 模块.模块 import 函数 函数()
      • from 模块.模块 import 函数 az f f()
      • from 模块.模块 import * 函数1() 函数2()
      • from 模块 import 模块 模块.函数()
      • from 模块 import 模块 as m m.函数()
    • 特殊情况

      • import 文件夹(加载__init__.py

      • from 文件夹 import *

3其它

  • 两个值数据交换 a,b = b,a
  • 推导式
    • 列表 ▲
    • 字典
    • 集合

4.总结

  • 基础知识
  • 逻辑能力
  • 面试题

5.作业

  1. 列举你常见的内置函数。

  2. 列举你常见的内置模块?

  3. json序列化时,如何保留中文?

  4. 程序设计:用户管理系统

    """
    功能:
     1.用户注册,提示用户输入用户名和密码,然后获取当前注册时间,最后将用户名、密码、注册时间写入到文件。
     2.用户登录,只有三次错误机会,一旦错误则冻结账户(下次启动也无法登录,提示:用户已经冻结)。
    """
    
  5. 有如下文件,请通过分页的形式将数据展示出来。【文件非常小】

    1|飞机|1000
    2|大炮|2000
    3|迫击炮|1000
    4|手枪|123
    ...
    
  6. 有如下文件,请通过分页的形式将数据展示出来。【文件非常大】

    1|飞机|1000
    2|大炮|2000
    3|迫击炮|1000
    4|手枪|123
    ...
    
  7. 程序设计:购物车

    """
    有如下商品列表 GOODS_LIST,用户可以选择进行购买商品并加入到购物车 SHOPPING_CAR 中且可以选择要购买数量,购买完成之后将购买的所有商品写入到文件中【文件格式为:年_月_日.txt】。
    
    注意:重复购买同一件商品时,只更改购物车中的数量。
    """
    # 购物车
    SHOPPING_CAR = {}
    
    # 商品列表
    GOODS_LIST = [
     {'id':1,'title':'飞机','price':1000},
     {'id':3,'title':'大炮','price':1000},
     {'id':8,'title':'迫击炮','price':1000},
     {'id':9,'title':'手枪','price':1000},
    ]
    
  8. 程序设计:沙河商城

    """
    功能:
     1.用户注册,提示用户输入用户名和密码,然后获取当前注册时间,最后将用户名、密码、注册时间写入到文件。
     2.用户登录,只有三次错误机会,一旦错误则冻结账户(下次启动也无法登录,提示:用户已经冻结)。
     3.商品浏览,分页显示商品(小文件); 用户可以选择商品且可以选择数量然后加入购物车(在全局变量操作),
       不再购买之后,需要讲购物车信息写入到文件,文件要写入到指定目录:
         shopping_car(文件夹)
             - 用户名A(文件夹)
                 2019-11-11-09-59.txt
                 2019-11-12-11-56.txt
                 2019-12-11-11-47.txt
             - 用户B(文件夹)
                 2019-11-11-11-11.txt
                 2019-11-12-11-15.txt
                 2019-12-11-11-22.txt
       注意:重复购买同一件商品时,只更改购物车中的数量。
     4.我的购物车,查看用户所有的购物车记录,即:找到shopping_car目录下当前用户所有的购买信息,并显示:
         2019-11-11-09-59
             飞机|1000|10个
             大炮|2000|3个
         2019-11-12-11-56.txt
             迫击炮|10000|10个
             手枪|123|3个
    
     5.用户未登录的情况下,如果访问 浏览商品 、我的购物车 时,提示登录之后才能访问,让用户先去选择登录(装饰器实现)。
    """
    
  9. 请使用第三方模块xlrd读取一个excel文件中的内容。【课外】

内容详细

1.迭代器

自己不会写迭代器,只会使用。

任务:请展示列表中所有的数据。

  • while + 索引 + 计数器

  • 迭代器:对 某种对象(str/list/tuple/dict/set类创建的对象)-可迭代对象 中的元素进行逐一获取。表象:具有__next__()方法且每次调用都获取可迭代对象中的元素(从前到后一个一个获取)。

    • 列表转换成迭代器:

      • v1 = iter([11,22,33,44])
      • v1 = [11,22,33,44].__iter__()
    • 迭代器想要获取每个值:反复调用 val = v1.__next__()

      #示例一
      v1 = [11,22,33,44]
      v2 = iter(v1)      #列表转换成迭代器
      print(type(v2))
      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)
      #示例二
      v1 = 'alex'
      v2 = iter(v1)
      while True:
          try:
              val = v2.__next__()
              print(val)
          except Exception as e:
              pass
      
    • 直到报错:StopIteration错误,表示已经迭代完毕。

    • 如何判断一个对象是否是迭代器:内部是否有__next__方法。

  • for 循环

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

2.可迭代对象

  • 内部具有__iter__()方法且返会一个迭代器 ▲

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

3.生成器(函数的变异)

#函数
def func():
    return 123
func()
#生成器函数(内部是否包含yield)
def func():
    print('f1')
    yield 1
    print('f2')
    yield 2
    print('f3')
    yield 100
    print('f4')
    
#函数的内部代码不会执行,返回一个生成器对象。    
v = func()

#生成器可以被for循环,一旦开始循环那么函数内部代码就会开始执行。
for item in v:
    print(item) 
#遇到yield就终止,把yield值返回给item,接着开始下一次循环只会执行上次yield后面的代码,直到最后yield的值赋给了item。
def func():
    count =1
    while True:
        yield count
        count += 1
        
val = func() # 调用函数返回生成器,val就是一个生成器对象。

for item in val:
    print(tiem)

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

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

val = func()

for item in val:
    print(item)

示例:读文件 ▲

def func():
    '''
    分批读取文件中的内容,将文件中的内容返回给调用者。
    :return:
    '''
    cursor = 0
    while True:
        f = open('y.txt','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 j in data_list:
        	yield j

for item in func():
    print(item)

redis源码示例 ▲

其他知识

  • yield from 关键字
  • 生成器推导式

总结

  • 迭代器: 对可迭代对象中的元素进行逐一获取,迭代器对象的内部都有一个__next__()方法,用于以一个个获取数据。

  • 可迭代对象:可以被for循环且此类对象中都有__iter__()方法且要返回一个迭代器(生成器)。

  • 生成器:函数内部有yield则就是生成器函数,调用函数则返回一个生成器,循环生成器时则函数内部代码才会执行。

    特殊的迭代器 ▲

    def func():
        yield 1
        yield 2
        yield 3
    
    v = func()
    result = v.__next__()
    print(result)
    result = v.__next__()
    print(result)
    result = v.__next__()
    print(result)
    

    特殊的可迭代对象

    def func():
        yield 1
    
    v = func()
    result = v.__iter__()
    print(result)
    
posted @ 2020-03-19 15:11  Sco_Lunatic  阅读(98)  评论(0)    收藏  举报