news 2026/8/6 7:29:28

return、rasie、yiled的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
return、rasie、yiled的区别

一、return:函数返回结果 + 终止执行

唯一用途是从函数中返回指定结果,并立即终止函数的执行,函数内return之后的代码不会被执行

二、raise:主动触发异常 + 终止异常传播前的执行

主动手动抛出指定的异常对象,中断当前的程序执行流程,若抛出的异常未被try...except捕获,程序会直接崩溃并输出异常信息。

三、yield:生成器产出值 + 挂起函数(保留状态)

作用是产出一个值给生成器的调用方,同时挂起当前函数的执行状态(保留所有变量、执行位置),待下一次通过next()for循环触发时,从挂起的位置继续执行,直到再次遇到yield或函数结束。

1.流式输出示例

import uvicorn from fastapi import FastAPI import asyncio from fastapi.responses import StreamingResponse from pydantic import BaseModel import json app = FastAPI(title="SSE 流式响应示例") class QueryModel(BaseModel): a: str async def async_query(a: str) -> str: await asyncio.sleep(3) return f"查询结果:参数={a},查询成功" # ✅ 正确:aa 返回生成器对象,不 await async def aa(a: str): """ 中间层函数 - 只负责创建和返回生成器 不要 await!不要 await!不要 await! """ # 可以在这里做参数校验、日志记录、权限检查等 print(f"[中间层] 收到参数: {a}") b="haha" # 直接返回生成器对象,不执行它 return event_generator(a,b) async def event_generator(a: str,b:str): print(b) """SSE 异步生成器""" yield f"data: {json.dumps({'status': '开始查询', 'progress': 0})}\n\n" # 立即刷新缓冲区 await asyncio.sleep(0) # 分阶段发送进度 for i in range(1, 4): await asyncio.sleep(1) yield f"data: {json.dumps({'status': f'查询中...{i}秒', 'progress': i * 33})}\n\n" result = await async_query(a) yield f"data: {json.dumps({'status': '完成', 'result': result, 'progress': 100})}\n\n" @app.post("/select") async def select(q: QueryModel): # ✅ 从中间层获取生成器 generator = await aa(q.a) # await aa() 是等待 aa 函数本身,不是等待生成器 return StreamingResponse( generator, # 传入生成器对象 media_type="text/event-stream", # ← 2. 告诉浏览器:这是SSE流 headers={ # ← 3. 禁用所有缓冲机制 "Cache-Control": "no-cache, no-transform", "Connection": "keep-alive", "X-Accel-Buffering": "no", } ) if __name__ == '__main__': uvicorn.run("main:app", host="127.0.0.1", port=8000)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/28 3:30:34

all-MiniLM-L6-v2行业应用:法律文书相似度比对系统构建

all-MiniLM-L6-v2行业应用:法律文书相似度比对系统构建 1. 为什么法律场景特别需要轻量又精准的语义模型 在法院、律所和企业法务部门,每天都要处理大量合同、起诉状、判决书、答辩意见和律师函。这些文档看似格式规范,但核心信息往往藏在措…

作者头像 李华
网站建设 2026/8/4 16:39:28

电赛高频信号调理:从LNA到AGC的系统设计与实现

1. 信号调理在电子设计竞赛中的工程定位与系统架构 信号调理不是孤立的电路设计环节,而是连接物理世界与数字处理系统的关键桥梁。在电赛高频信号类题目中,其核心价值在于将微弱、高频、动态范围宽的原始信号,转化为ADC可精确采集、MCU可高效…

作者头像 李华
网站建设 2026/7/30 11:44:39

从Keepout到Board Cutout:AD2019中元器件定位孔的设计规范与实战解析

从Keepout到Board Cutout:AD2019中元器件定位孔的设计规范与实战解析 在PCB设计领域,元器件定位孔的处理看似简单,却常常成为新手工程师的"隐形杀手"。想象一下:当你精心设计的电路板打样回来,却发现关键接…

作者头像 李华
网站建设 2026/7/29 12:50:35

嵌入式数字滤波算法选型与STM32工程实现指南

1. 数字滤波算法工程实现原理与选型指南 在嵌入式信号测量系统中,数字滤波并非简单的“去噪”操作,而是对采样数据进行有目的的数学变换,以满足特定频域响应需求。其本质是离散时间系统对输入序列的线性时不变(LTI)处理…

作者头像 李华
网站建设 2026/7/26 0:33:47

电赛电源系统全链路设计:拓扑选择、同步整流与PCB布局实战

1. 电赛电源系统工程实践:从拓扑选择到PCB布局的全链路解析全国大学生电子设计竞赛中,电源模块从来不是配角,而是决定系统稳定性、效率与可靠性的核心枢纽。历届赛题清晰地印证了这一规律:2016年“逆变器”题要求36VAC输出、90%效…

作者头像 李华