当前位置: 首页 > news >正文

python迭代器生成器

迭代器生成器区别

通俗版概念

  1. 迭代器(Iterator)​

    • 像“快递员送快递”​
      你有一个包裹清单(比如Excel里的测试用例),快递员(迭代器)会按顺序一个一个送(遍历),直到送完。
      ✅ ​适合场景:数据已经全部准备好(如从文件读取的测试用例列表)。
      ❌ ​缺点:如果包裹太多(数据量大),一次性全放车上(内存)会塞不下。
  2. 生成器(Generator)​

    • 像“现炒小菜”​
      你去餐馆吃饭,厨师(生成器)不会提前炒好100盘菜,而是你点一盘(需要数据),他炒一盘(动态生成)。
      ✅ ​适合场景:测试数据量极大(如1万用户注册)、分页接口遍历、大文件处理。
      ❌ ​缺点:菜只能按顺序上(不能回头遍历)。

什么时候用迭代器?什么时候用生成器?

场景用迭代器用生成器
数据是否现成?数据已经存在(如Excel、CSV文件)数据需要动态生成(如参数化测试)
数据量大小数据量小(比如100条用例)数据量大(如1万用户、大文件)
是否需要省内存?不需要(数据可一次性加载)需要(数据分批生成或读取)
代码简洁性直接遍历列表、字典用 yield 一行搞定动态生成

一句话选择原则

  • 用迭代器:数据现成的、量不大,直接遍历。
  • 用生成器:数据量大、需要动态生成或省内存时(如测分页接口、大文件上传)。
场景1:遍历已有的测试用例(用迭代器)​

需求:从CSV文件中读取100条测试用例,依次执行。
迭代器解决:直接遍历现成的数据集合。

import unittest
import csv
import requests

class TestAPI(unittest.TestCase):
    def test_all_cases(self):
        # 迭代器应用点1:csv.DictReader() 本身是一个迭代器
        # 它会逐行读取CSV文件,而不是一次性加载全部数据到内存
        with open("test_cases.csv", "r") as f:
            csv_reader = csv.DictReader(f)  # <-- 这里创建了一个文件迭代器
            
            # 迭代器应用点2:for循环本质是调用迭代器的__next__()
            # 每次循环读取一行数据(按需加载)
            for case in csv_reader:  # <-- 这里隐式使用迭代器遍历
                response = requests.request(
                    case["method"], 
                    case["url"]
                )
                self.assertEqual(response.status_code, 200, f"用例 {case} 请求失败")

迭代器在代码中的应用

  1. ​**csv.DictReader(f) 是迭代器**:
    像「传送带」逐行传送CSV数据(不一次性堆内存),处理大文件不卡顿。
  2. ​**for case in csv_reader**:
    循环时自动触发「下一份!」动作(调用__next__()),逐条拿数据测试。

场景说明(通俗版)

需求:用户注册接口需要测试各种随机用户名。
痛点:手动写100条用例太麻烦,一次性生成全部数据占内存。

import unittest
import requests

# 生成器:生成100个用户(user_1到user_100)
def user_generator():
    for i in range(1, 101):  # 改一个数字就能测任意次数
        yield {"username": f"user_{i}", "email": f"user_{i}@test.com"}

class TestUsers(unittest.TestCase):
    def test_100_users(self):
        for user in user_generator():  # 自动循环100次
            response = requests.post("https://api.example.com/register", json=user)
            self.assertEqual(response.status_code, 200)

代码核心逻辑

  1. 生成器函数 user_generator()

    • range(1, 101) → 生成1到100的数字。
    • yield → 每次循环吐出一个用户数据(如 user_1user_2...user_100)。
http://www.dtcms.com/a/64183.html

相关文章:

  • linux 进程和计划管理
  • MongoDB 聚合管道速成教程
  • 5G/6G通信技术
  • C++ 中的操作符重载(Operator Overloading)
  • Mybatis XML基本使用
  • Aliyun CTF 2025 web 复现
  • OSPF的LSA详解(报文分析+具体例子)
  • 安装 ubuntu 2404 LTS 服务器 设置 服务器名称
  • 【路径查询组件优化记录:数据处理与显示逻辑重构】
  • Node-RED基础1
  • Django项目无法调取swagger.json接口数据
  • 内网不出网突破技巧-简述
  • 19873连通块中点的数量
  • std::ranges::views::common, std::ranges::common_view
  • 小程序渲染之谜:如何解决“加载中...”不消失的 Bug(glass-easel)
  • 跳表实现学习
  • Linux远程工具SecureCRT下载安装和使用
  • Python文件,模块
  • ​【C++设计模式】第二十三篇:观察者模式(Observer)
  • HOT100系列——(普通数组+矩阵)
  • DB-GPT-0.7版本win11安装,最新版本,安装方式变更了
  • ELK traceId 通过A服务调用B服务举例
  • 『MaxKB』MaxKB源码在Docker环境的部署实战
  • 第27周JavaSpringboot电商进阶开发 2.常用功能进阶
  • 要登录的设备ip未知时的处理方法
  • WPF-DataGrid的增删查改
  • 【MapSet】哈希表
  • 麒麟操作系统和统信的区别,上面一般用什么OFFICE,excel软件?
  • Java 什么是线程安全及如何实现线程安全
  • EasyRTC嵌入式音视频通话SDK:基于纯C语言的跨平台实时通信系统设计与实践