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

Python从入门到精通(第11章):函数进阶:作用域与闭包

Python从入门到精通第11章函数进阶作用域与闭包开头导语这是本系列第11章。前面你已经掌握函数的基本定义和调用方式这一章在此基础上向前一步解决三个实际问题变量名冲突时 Python 到底用了哪一个、为什么内部函数能够“记住”外部函数的变量、闭包在真实业务里能做什么。阅读时建议边看边动手改代码尤其要关注“错误示例”部分——这些错误在后续阅读他人代码时几乎一定会遇到。章节摘要本章围绕“作用域”与“闭包”两条主线展开。作用域决定了一个名字在哪个范围内有效Python 按 LEGB 顺序查找变量闭包则是函数作为返回值时把外部变量“携带”出来的机制常用于状态保持和函数生成。掌握这两点之后你读别人代码时不会再被“变量到底用的是哪个”这类问题困扰写自己的代码时也能设计出更干净的接口。关键词LEGBglobalnonlocal闭包嵌套函数函数工厂状态保持学习目标能用 LEGB 规则解释任意一行代码里变量的来源能区分局部变量和全局变量知道什么情况下必须用 global/nonlocal能看懂闭包的运行机制能自己写一个闭包函数能把“状态保持”需求迁移到闭包实现而不是用全局变量凑合先修知识会定义函数、传递参数、设置默认参数知道列表、字典等可变对象的基本操作理解 if/for/while 的缩进含义环境准备python--versionpython-mvenv .venv# Windows PowerShell.venv\Scripts\Activate.ps1核心知识讲解知识点1LEGB 规则Python 查找一个变量名时按以下顺序逐层搜索LLocal当前函数内部定义的变量EEnclosing外层函数的变量嵌套函数场景GGlobal模块顶层函数外部定义的变量BBuilt-inPython 内置名字如len、print、list下面这段代码演示了一次完整的 LEGB 查找过程bglobal bdefouter():eenclosing edefinner():llocal lprint(l)# L 层找到local lprint(e)# E 层找到enclosing eprint(b)# G 层找到global bprint(len)# B 层找到内置函数 leninner()outer()运行输出local l enclosing e global b built-in function len这个顺序是固定的无论变量名是否相同Python 都按 LEGB 顺序查找不会在找完 L 层之后继续向上找。知识点2局部变量与 global 声明函数内部赋值的变量默认是局部的和函数外部同名变量没有任何关系。错误示例不要这样写count0definc():# 期望对全局 count 1但实际上这里是在创建局部变量 countcountcount1# UnboundLocalError: cannot assign to global variableinc()print(count)问题说明count count 1在 Python 里是一个赋值语句Python 解释器在看到左侧的count时在函数开头就把count作为局部变量处理了所以右侧的count 1去找局部变量但它尚未赋值于是报错。正确写法如果要修改全局变量count0definc():globalcount# 显式声明下面的 count 引用全局变量countcount1inc()print(count)# 输出 1正确写法更推荐的方式通过参数传入、返回值传出count0definc(value):returnvalue1countinc(count)print(count)# 输出 1全局变量看似方便但会导致函数行为依赖外部状态测试困难、难以复用。除非真的需要跨模块共享否则优先通过参数和返回值传递数据。知识点3nonlocal 声明当嵌套函数需要修改外层函数的变量时需要用nonlocal声明。和global不同nonlocal不会穿透到模块顶层只作用于外层函数。错误示例不要这样写defcounter():count0definc():countcount1# 同样是 UnboundLocalErrorreturncountreturninc ccounter()print(c())# 报错问题说明内层函数inc在看到count count 1时把count当作局部变量处理但右侧的count 1在函数执行时还没有值所以报错。正确写法defcounter():count0definc():nonlocalcount countcount1returncountreturninc ccounter()print(c())# 1print(c())# 2print(c())# 3这里inc是一个闭包函数它定义在counter内部但返回后仍然保留对counter的count变量的引用。正是nonlocal count让修改成为可能。知识点4闭包的定义与运行机制闭包Closure是指一个函数记住创建时所在作用域的变量的能力。Python 中只要函数引用了外层作用域的变量Python 就会把被引用的变量绑定到函数对象上这称为“闭包”。下面用图示说明闭包的形成过程counter() 调用 ├── 创建局部变量 count 0 ├── 定义 inc 函数此时 inc 捕获了 count 的引用 └── 返回 inc 函数对象 后续 c() 调用 ├── c 是一个函数对象 ├── c.__closure__ 包含对原 count 单元的引用 └── 每次调用 c() 都修改同一个 count验证闭包是否真正生效defcounter():count0definc():nonlocalcount count1returncountreturninc ccounter()print(c.__closure__)# (cell at ...,) 有值说明是闭包print(c.__code__.co_freevars)# (count,) 捕获的外层变量名print(c())# 1print(c())# 2__closure__不为None是判断闭包是否生效的直接依据。如果__closure__为None说明函数没有捕获外层变量不构成闭包。知识点5闭包的实际用途——函数工厂闭包最常见的用途是生成“带不同初始参数的专业函数”。在没有类的情况下闭包提供了一种轻量级的状态保持方式。错误示例不要这样写用全局变量模拟“配置”base_urlhttps://api.example.compath/usersdefmake_request():returnbase_urlpath# base_url 和 path 是全局变量容易被其他代码污染# 如果需要另一组配置只能再定义新函数或改全局变量base_urlhttps://api2.example.com# 影响之前创建的 make_request问题说明全局变量在程序任何位置都可以被修改多个函数依赖同一全局变量时修改一个会影响另一个难以追踪。正确写法用闭包生成函数工厂defmake_api_client(base_url):path/usersdefmake_request(endpoint):returnf{base_url}{path}{endpoint}defset_path(new_path):nonlocalpath pathnew_pathreturnmake_request,set_path# 生成两个不同配置的客户端req1,set_path1make_api_client(https://api1.example.com)req2,set_path2make_api_client(https://api2.example.com)print(req1(/list))# https://api1.example.com/users/listprint(req2(/list))# https://api2.example.com/users/list# 两个客户端互不影响set_path1(/admin)print(req1(/list))# https://api1.example.com/admin/listprint(req2(/list))# https://api2.example.com/users/list不受影响这里make_api_client是一个函数工厂每次调用都生成一组相互独立的make_request和set_path函数两个客户端之间完全隔离互不干扰。知识点6 nonlocal 与 global 的区别两者名字相似作用域层级不同关键字作用层级影响范围global x模块顶层整个模块文件内有效nonlocal x外层函数仅外层函数作用域不穿透到模块顶层xglobal xdefouter():xouter xdefinner_global():globalx# 修改模块顶层的 xxmodified global xdefinner_nonlocal():nonlocalx# 修改 outer 的 xxmodified outer xprint(fbefore global:{x})# outer xinner_global()print(fafter global:{x})# outer xouter 未变因为改的是全局print(fbefore nonlocal:{x})# outer xinner_nonlocal()print(fafter nonlocal:{x})# modified outer xouter()print(fmodule level:{x})# modified global x实际工程里nonlocal比global少见但在装饰器和嵌套回调里会用到。优先通过返回值传递数据其次nonlocalglobal只在模块级配置常量时使用。案例实战主案例带记忆功能的线性回归器本案例目标用闭包实现一个简易的“带记忆的线性回归器”。需求是每次输入一个新数据点模型记录下来可以查询当前累计了多少个数据点可以清除所有历史数据重新开始不同模型之间数据完全隔离互不影响defmake_regressor():返回一个带记忆的线性回归计算器data_x[]data_y[]defadd_point(x:float,y:float):添加一个数据点nonlocaldata_x,data_y data_x.append(x)data_y.append(y)defmean(values:list)-float:returnsum(values)/len(values)ifvalueselse0.0defslope()-float:计算斜率 b Σ(x-x̄)(y-ȳ) / Σ(x-x̄)²iflen(data_x)2:return0.0x_meanmean(data_x)y_meanmean(data_y)numeratorsum((x-x_mean)*(y-y_mean)forx,yinzip(data_x,data_y))denominatorsum((x-x_mean)**2forxindata_x)returnnumerator/denominatorifdenominator!0else0.0defintercept()-float:计算截距 ā ȳ - b * x̄returnmean(data_y)-slope()*mean(data_x)defpredict(x:float)-float:根据当前数据拟合直线返回预测值returnintercept()slope()*xdefcount()-int:返回累计数据点数量returnlen(data_x)defreset():清除所有历史数据nonlocaldata_x,data_y data_x[]data_y[]defdescribe():return{n:len(data_x),slope:slope(),intercept:intercept(),}returnadd_point,predict,count,reset,describe# 使用方式add1,pred1,cnt1,reset1,desc1make_regressor()add2,pred2,cnt2,reset2,desc2make_regressor()# 模型1 添加数据add1(1.0,2.0)add1(2.0,4.1)add1(3.0,5.9)# 模型2 添加数据独立不受模型1影响add2(1.0,10.0)add2(2.0,20.0)print(desc1())# {n: 3, slope: 1.97, intercept: 0.02}print(desc2())# {n: 2, slope: 10.0, intercept: 0.0}print(cnt1())# 3print(cnt2())# 2print(pred1(4.0))# 用模型1预测 x4 时的 yprint(pred2(4.0))# 用模型2预测 x4 时的 y结果不同# 重置模型1不影响模型2reset1()print(cnt1())# 0print(cnt2())# 2模型2保持不变这个案例展示了闭包的核心价值每个模型的数据data_x、data_y完全隔离不需要用类只通过函数返回值和nonlocal声明就实现了状态管理。模型1和模型2之间没有任何共享变量互相独立。扩展案例ATM 账户模拟器需求用闭包实现一个 ATM 账户具备存钱、取钱、查询余额功能不允许余额为负。defmake_account(initial_balance:float0.0)-tuple:返回一个账户实例存款函数, 取款函数, 查询函数ifinitial_balance0:raiseValueError(初始余额不能为负)balanceinitial_balancedefdeposit(amount:float)-float:nonlocalbalanceifamount0:raiseValueError(存款金额必须为正)balanceamountreturnbalancedefwithdraw(amount:float)-float:nonlocalbalanceifamount0:raiseValueError(取款金额必须为正)ifamountbalance:raiseValueError(f余额不足当前{balance}需取{amount})balance-amountreturnbalancedefget_balance()-float:returnbalancereturndeposit,withdraw,get_balance# 创建两个独立账户dep_a,wit_a,bal_amake_account(1000.0)dep_b,wit_b,bal_bmake_account(500.0)print(bal_a())# 1000.0print(bal_b())# 500.0dep_a(200.0)wit_b(100.0)print(bal_a())# 1200.0print(bal_b())# 400.0try:wit_a(2000.0)# 余额不足应抛异常exceptValueErrorase:print(f取款失败:{e})扩展思考如何在不修改函数签名的情况下给账户加“日累计取款上限”功能提示用闭包再包装一层或者在withdraw函数内部再加一层计数器。常见错误与排查UnboundLocalError函数内部有赋值语句但没有声明global/nonlocal右侧又引用了同名变量。先检查变量是在哪里定义的再决定是用global、nonlocal还是通过参数传入。闭包捕获的是引用不是值如果外层变量是可变对象列表、字典在闭包里可以直接修改不需要nonlocal。闭包函数返回后外层变量消失Python 的垃圾回收机制不会回收仍被闭包引用的外层变量所以闭包是安全的不会产生悬空引用。过度使用 global所有函数都加global会使程序不可测试发现自己频繁使用 global 时优先考虑把数据封装到闭包或类里。性能与工程建议闭包的性能和普通函数几乎没有差别除非在极敏感的热路径上否则不需要担心。闭包适合“函数需要记住一些配置”的场景如果对象有多种方法且需要继承等特性优先用类。每个闭包函数尽量只对应一个明确职责不要在一个闭包里放太多状态。通过返回值显式暴露必要的操作不要把内部变量直接暴露给调用方。本章代码自测清单可打勾我已运行 LEGB 示例代码观察了各层变量的查找顺序。我已复现UnboundLocalError并用global/nonlocal修复。我已打印func.__closure__和func.__code__.co_freevars验证闭包生效。我已写出函数工厂示例理解“生成带不同配置的函数”的过程。我已在 IDE 里逐步调试 ATM 账户案例记录每次余额变化。我已思考扩展练习如何给账户加日累计取款上限。我能解释global和nonlocal的作用域层级差异。我能把本章闭包知识迁移到另一个业务场景如缓存器、计数器、配置隔离。我已完成章末提问至少检查过参考答案。我为下一章整理了待补充的基础清单。章末提问LEGB 分别指哪四个作用域查找顺序是什么什么情况下会产生UnboundLocalError如何修复global和nonlocal的作用范围有什么区别如何判断一个函数是否形成了闭包闭包函数工厂和类有什么相似和不同在 ATM 案例中deposit函数为什么要检查amount 0如果把data_x、data_y从列表换成普通整数闭包还能正常工作吗为什么闭包捕获的是变量的值还是引用这有什么区别在工程中什么情况下会优先选择闭包而不是类如果要消除一个 Python 程序的全局变量闭包能完全替代吗章末答案Local当前函数、Enclosing外层函数、Global模块顶层、Built-in内置。Python 按这个顺序逐层查找找到即停。函数内部对变量赋值且未声明global/nonlocal时Python 把该变量当作局部变量处理但右侧引用时它尚未赋值导致UnboundLocalError。修复方法是加global改模块顶层或nonlocal改外层函数声明或通过参数传入、返回值传出。global把名字绑定到模块顶层的全局变量影响整个文件nonlocal只作用于外层函数不会穿透到模块顶层。检查func.__closure__是否为非None或者检查func.__code__.co_freevars是否包含捕获的变量名。两者都能实现状态保持。类通过实例属性存储状态闭包通过捕获外层变量存储状态。类支持继承和方法多态闭包更轻量适合单一职责。如果需要多种方法且结构复杂优先用类如果只是“生成一批配置不同的函数”闭包更简洁。amount 0表示非正当存款金额应该拒绝否则可以存入负数导致余额凭空增加。不能。整数是不可变对象闭包只能引用外层变量不能在闭包里直接修改不可变对象。如果要修改必须用nonlocal声明而nonlocal只能指向已经存在的外层变量——整数可以但每次赋值会创建新对象并重新绑定。列表等可变对象可以直接在闭包里修改不需要nonlocal。Python 闭包捕获的是变量的引用不是值本身。这意味着外层变量被修改后闭包下次访问时能得到最新值但也意味着闭包持有对外层对象的引用可能阻止垃圾回收通常不是问题。场景简单只需要一两个函数、需要状态保持、不想引入类的开销、或者需要生成一批配置不同的函数时优先用闭包。需要多种方法、复杂状态、继承体系时用类。闭包可以在很大程度上替代全局变量但不能完全消除所有全局名字如模块级 import、函数定义本身。不过在数据层面用闭包或类封装状态可以做到“零全局可变数据”。本章小结作用域决定变量名的有效范围LEGB 是 Python 的查找顺序。global和nonlocal分别是向模块顶层和外层函数写入变量的声明慎用。闭包是函数记住创建时外层变量的机制通过__closure__和co_freevars可以观测。闭包常用于函数工厂、状态保持、轻量级配置隔离比全局变量更容易测试和维护。下一章预告下一章是第12章《匿名函数与高阶函数》。建议先理解函数是一等公民的概念可以把函数赋值给变量、作为参数传递、作为返回值再学习 lambda 表达式的适用场景和局限。章节导航上一篇第10章《文件读写与路径管理》下一篇第12章《匿名函数与高阶函数》版权声明本文为《Python从入门到精通》系列连载内容面向学习交流使用。版权归作者所有转载须保留出处与章节信息。

相关文章:

Python从入门到精通(第11章):函数进阶:作用域与闭包

Python从入门到精通(第11章):函数进阶:作用域与闭包 开头导语 这是本系列第11章。前面你已经掌握函数的基本定义和调用方式,这一章在此基础上向前一步,解决三个实际问题:变量名冲突时 Python 到…...

Spring_couplet_generation 从零开始环境配置:Windows系统下的Python与CUDA安装

Spring_couplet_generation 从零开始环境配置:Windows系统下的Python与CUDA安装 你是不是也遇到过这种情况?看到别人用AI模型生成对联、写诗,觉得特别酷,自己也想动手试试。结果第一步——搭环境,就被卡住了。网上教程…...

ZLUDA技术破局:跨厂商GPU的CUDA生态兼容之道

ZLUDA技术破局:跨厂商GPU的CUDA生态兼容之道 【免费下载链接】ZLUDA CUDA on Intel GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 作为开源兼容层领域的创新之作,ZLUDA正在重塑GPU计算生态格局。这款突破性工具通过专利的指令翻…...

开箱即用!rwkv7-1.5B-g1a镜像部署与基础问答功能实测

开箱即用!rwkv7-1.5B-g1a镜像部署与基础问答功能实测 1. 镜像概述与核心优势 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型镜像,专为轻量级AI应用场景设计。这个1.5B参数的模型在保持高效推理能力的同时,特别适合中文环境下的基础问…...

Cosmos-Reason1-7B参数详解:上下文长度4096对长时序视频理解的实际价值

Cosmos-Reason1-7B参数详解:上下文长度4096对长时序视频理解的实际价值 1. 模型概述 Cosmos-Reason1-7B是NVIDIA开源的一款7B参数量的多模态物理推理视觉语言模型(VLM),作为Cosmos世界基础模型平台的核心组件,专注于物理理解与思维链(CoT)推…...

旧设备重生:如何让经典iOS设备突破系统限制重获新生?

旧设备重生:如何让经典iOS设备突破系统限制重获新生? 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...

Lychee模型API网关配置:Kong中间件集成指南

Lychee模型API网关配置:Kong中间件集成指南 1. 引言 在AI服务部署过程中,如何有效管理和保护模型API是一个常见挑战。Lychee模型作为强大的多模态处理工具,在生产环境中需要可靠的流量控制和安全防护机制。这就是API网关发挥作用的地方。 …...

GLM-Image WebUI快速上手:无需代码,浏览器直连http://localhost:7860

GLM-Image WebUI快速上手:无需代码,浏览器直连http://localhost:7860 1. 引言:让AI绘画像上网一样简单 想象一下,你有一个绝妙的创意画面在脑海中盘旋——一只戴着礼帽的猫在月球上喝下午茶,或者一座漂浮在云端的未来…...

雪女-斗罗大陆-造相Z-Turbo企业级应用:自动化营销素材生成平台

雪女-斗罗大陆-造相Z-Turbo企业级应用:自动化营销素材生成平台 想象一下,你是一家游戏或动漫周边公司的营销负责人。新版本上线、节日活动、角色生日、新品预售……每个月的营销日历排得满满当当。每次活动,设计团队都在为海报、宣传图、社交…...

CosyVoice集成Java Web应用:构建智能语音播报后端服务

CosyVoice集成Java Web应用:构建智能语音播报后端服务 最近在做一个在线教育平台的项目,需要给课程内容加上语音播报功能。一开始我们试过一些现成的语音合成服务,要么价格太贵,要么声音不够自然。后来发现星图GPU平台上有个Cosy…...

DeepSeek-V3量化神优化:w4a8精度反超官方2.29%

DeepSeek-V3量化神优化:w4a8精度反超官方2.29% 【免费下载链接】DeepSeek-V3-0324-w4a8-mtp-QuaRot-per-channel 项目地址: https://ai.gitcode.com/Eco-Tech/DeepSeek-V3-0324-w4a8-mtp-QuaRot-per-channel 导语:国内大模型量化技术再获突破&am…...

Phi-3-mini-128k-instruct部署教程:基于vLLM的GPU显存优化方案(A10/A100实测)

Phi-3-mini-128k-instruct部署教程:基于vLLM的GPU显存优化方案(A10/A100实测) 1. 开篇:为什么选择Phi-3-mini-128k-instruct? 如果你正在寻找一个既轻量又强大的文本生成模型,那么Phi-3-mini-128k-instru…...

造相-Z-Image-Turbo 结合JavaScript动态网页:打造浏览器端实时AI绘图演示

造相-Z-Image-Turbo 结合JavaScript动态网页:打造浏览器端实时AI绘图演示 最近在折腾AI绘图模型部署的时候,我发现了一个挺有意思的事儿:很多朋友把模型在服务器上跑起来,测试一下生成效果,就觉得完事儿了。但怎么把这…...

5个行业颠覆场景:用PptxGenJS实现办公自动化效率革命

5个行业颠覆场景:用PptxGenJS实现办公自动化效率革命 【免费下载链接】PptxGenJS Create PowerPoint presentations with a powerful, concise JavaScript API. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS PptxGenJS是一款基于JavaScript的开源…...

Qwen3-TTS开源镜像实操:与LangChain集成构建多语种AI Agent语音接口

Qwen3-TTS开源镜像实操:与LangChain集成构建多语种AI Agent语音接口 1. 项目概述与核心价值 Qwen3-TTS-12Hz-1.7B-VoiceDesign是一个强大的多语言文本转语音模型,专为现代AI应用场景设计。这个模型最大的特点是能够处理10种主要语言,包括中…...

HunyuanVideo-Foley 效果对比:不同算法模型生成音效的质量评估

HunyuanVideo-Foley 效果对比:不同算法模型生成音效的质量评估 1. 音效生成技术概览 音效生成技术正在经历一场革命性的变革。从早期的采样拼接到如今的AI生成,算法模型已经能够根据简单的文字描述创造出丰富多样的声音效果。这项技术在影视制作、游戏…...

开箱即用:BAAI/bge-m3镜像,一键启动语义相似度分析WebUI

开箱即用:BAAI/bge-m3镜像,一键启动语义相似度分析WebUI 1. 快速上手:从零到一的十分钟体验 你是不是也遇到过这样的场景?手头有两段文字,想知道它们说的是不是一回事,或者想快速验证一下自己构建的AI知识…...

C++的std--ranges视图缓存

C的std::ranges视图缓存:高效数据处理的现代利器 在C20中,std::ranges库的引入彻底改变了数据处理的范式,其中视图缓存(View Caching)作为一项关键技术,显著提升了代码的性能与可读性。视图缓存允许开发者…...

DeepSeek-VL2微调报错“AssertionError”终极解决:修改config.json里的topk_method参数

DeepSeek-VL2微调报错"AssertionError"终极解决方案:深入解析topk_method参数 当你满怀期待地准备微调DeepSeek-VL2这个强大的多模态大模型时,却在训练启动阶段遭遇了令人沮丧的"AssertionError"和"assert not self.training&q…...

开源小模型怎么选?Qwen1.5-0.5B-Chat轻量化优势解析

开源小模型怎么选?Qwen1.5-0.5B-Chat轻量化优势解析 1. 为什么需要轻量级小模型? 当我们谈论AI大模型时,很多人首先想到的是那些需要高端GPU、动辄几十GB内存的庞然大物。但在实际应用中,特别是个人开发者、中小企业或者教育场景…...

霜儿-汉服-造相Z-Turbo惊艳作品展:AI复原历史人物经典汉服造型

霜儿-汉服-造相Z-Turbo惊艳作品展:AI复原历史人物经典汉服造型 最近,一个名为“霜儿-汉服-造相Z-Turbo”的AI模型在圈子里悄悄火了起来。它干的事儿挺有意思:不是凭空创造新形象,而是试图“复原”那些活在文字、画作和历史记忆里…...

G-Helper终极指南:华硕笔记本性能优化与显示控制完全解决方案

G-Helper终极指南:华硕笔记本性能优化与显示控制完全解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models …...

空洞骑士模组管理革命:Scarab如何让复杂变得简单?

空洞骑士模组管理革命:Scarab如何让复杂变得简单? 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否曾经为了安装一个模组,却陷入依赖地…...

保姆级教程:用FLUX.2-Klein-9B在ComfyUI中快速编辑人像照片

保姆级教程:用FLUX.2-Klein-9B在ComfyUI中快速编辑人像照片 1. 准备工作与环境搭建 在开始使用FLUX.2-Klein-9B进行人像编辑前,我们需要先准备好运行环境。这个模型虽然功能强大,但部署过程其实非常简单,跟着步骤走就能快速上手…...

OpenClaw安全防护指南:GLM-4.7-Flash本地化部署的5个关键设置

OpenClaw安全防护指南:GLM-4.7-Flash本地化部署的5个关键设置 1. 为什么需要特别关注OpenClaw的安全配置? 去年夏天,我在调试一个自动整理财务报告的OpenClaw任务时,差点酿成大错。当时AI助手误将包含敏感信息的临时文件上传到了…...

Ostrakon-VL-8B视觉语言模型一键部署:Anaconda环境配置保姆级教程

Ostrakon-VL-8B视觉语言模型一键部署:Anaconda环境配置保姆级教程 你是不是也对那些能看懂图片、还能跟你聊天的AI模型感到好奇?想自己动手部署一个来玩玩,结果被各种环境配置、依赖冲突搞得头大?别担心,今天咱们就来…...

3个方法解决小说断更难题:Yuedu书源库让你实现阅读自由

3个方法解决小说断更难题:Yuedu书源库让你实现阅读自由 【免费下载链接】Yuedu 📚「阅读」APP 精品书源(网络小说) 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 你是否经历过这样的时刻:深夜追更的小说…...

雪女-斗罗大陆-造相Z-Turbo社区实践:在CSDN分享自定义风格LoRA训练心得

雪女-斗罗大陆-造相Z-Turbo社区实践:在CSDN分享自定义风格LoRA训练心得 最近在CSDN社区看到不少朋友在讨论用AI模型生成特定风格的角色图,尤其是像“斗罗大陆”这类有大量粉丝基础的作品。大家普遍有个痛点:直接用通用模型生成,角…...

ssm+java2026年毕设随心淘网管理系统【源码+论文】

本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于电商会员管理系统的研究,现有研究主要以大型综合电商平台(如淘宝、京东)的整体架构设计…...

Translumo实时屏幕翻译工具:5分钟解决你的多语言障碍难题

Translumo实时屏幕翻译工具:5分钟解决你的多语言障碍难题 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是…...