Python函数定义与调用全解析:从参数传递到作用域实战
写Python绕不开函数。不管你是刚摸到语法边的初学者还是已经能用脚本解决日常问题的爱好者函数定义与调用这堵墙早晚要翻过去。坦白讲我见过不少代码写得又臭又长的人几百行脚本从头写到尾中间改一个参数要用编辑器的全局替换想加一个功能就得把一大段逻辑从头复制一遍。代码能跑但人快崩溃了。函数就是专门治这个毛病的。函数的价值用一句话说清把一段有完整逻辑的代码打包起来给它一个名字定义好入口参数和出口返回值之后随时像用积木一样调用它。这篇文章不打算背文档我会把函数定义与调用里的每个环节都拆开揉碎讲一遍包括参数传递的各种姿势、作用域、坑位现场最后用一个完整案例演示怎么把零散脚本重构成一堆干净的函数。适合谁刚学会if、for想进入结构化开发阶段的初学者非常合适写过一段时间脚本、总觉得代码别扭但不知道怎么改的人也能从中找到顺手可用的重构思路。1. 函数到底是什么从生活例子里理解本质1.1 用“做蛋炒饭”理解函数三要素把函数想象成厨房里的一道工序。你不可能每次炒饭都从头翻菜谱、切葱、热锅、烧油再一步步来一遍第一次学会之后你会把整套流程记在脑子里下次说一句“炒个蛋炒饭”整个流程就被激活了。函数在Python里干的也是这件事。一个完整的函数有三个核心要素名字、入口、出口。名字就是函数名它让你不必关心内部每条语句在干什么只要知道“调用它就能完成这个任务”入口就是参数外部数据通过参数进入函数就像你递给厨师一份米饭和鸡蛋出口就是返回值函数处理后把结果交还给你等你端走。这种抽象能力是编程思维的分水岭。初学者写代码像流水账一行一行往下排眼睛盯着屏幕就能知道哪一步在干什么。但代码一旦超过几百行流水账就会失控一个数据要在多个地方被修改改完忘了同步两台机器上跑出的结果不一样排查起来简直是灾难。函数把“过程”变成一个“物件”你关注的焦点从“每一步怎么实现”转移到“这个功能做什么、输入输出是什么”复杂度立刻降维。1.2 复用只是函数最表面的好处很多人一提函数的好处就只说“复用”其实这只是冰山一角。函数真正改变的是你的组织代码的方式它逼着你把大问题拆成小问题每个小问题都有明确边界这恰恰是工程化开发的核心思维。举一个我踩过的坑。早年间写爬虫脚本连续抓十几个页面每一页都要做同样的清洗、解析、去重。我图省事直接复制粘贴每一段微调几个字段名。结果某个页面改了HTML结构我花了一下午在十几处复制代码里逐一修改漏了两处数据第二天全乱。后来拆成fetch_page、parse_page、save_to_db三个函数改一个数据结构只需要动一个函数。除此之外函数还有两个看不见的好处可测试性和可组合性。把逻辑拆进函数以后你可以单独喂测试数据进去观察返回值对不对而不用把整个程序跑起来才能验证。两个写好的函数还可以拼出新功能比如先tokenize(text)再做filter_stopwords(tokens)组合本身就是一种创作。我越来越觉得写函数的功夫本质上是在训练自己“拆解问题”的能力这个收益会跟着你走很远。2. 函数定义语法def语句的每一处细节都别糊弄2.1 基本写法与函数命名的规矩定义一个函数在Python里非常简单一个def关键字一个函数名一对括号一个冒号然后是缩进的函数体def greet(name): 根据名字生成一句问候语 return f你好{name}这里值得注意的细节不少。函数名要小写单词之间用下划线分隔这是PEP 8约定俗成的主流风格。比如calculate_area比CalculateArea更常见get_user_list比getUserList更符合Python社区习惯。虽然Python并不强制但写出来一眼能看出“这是Python代码”在大团队协作里尤其重要。函数名本身要有“动词感”。函数做的是事情命名最好直接体现动作parse_html、send_email、load_config。不要用data、handle这类似是而非的名字我看到过太多叫process_data的函数看完整个函数体都不知道它到底处理了什么。一个好的函数名加上好的参数名很多时候比注释还管用。函数定义的时候括号里的name叫形参它是函数内部的变量占位符。等真正调用greet(张三)时张三这个值才被传进去这叫实参。很多初学者分不清这两个词其实记住一句话就行定义时是形参调用时是实参。后面讲参数传递时会反复用到这组词。2.2 函数体、docstring和缩进这条底线Python用缩进制作用域函数体必须统一缩进一般用4个空格。刚学的时候总以为缩进只是“好看”直到我见过把混用Tab和空格的代码丢进运行时报IndentationError整段代码直接罢工才明白缩进在Python里不是风格问题是语法问题。函数体内部第一行建议写一个docstring也就是用三引号括起来的说明文字def calculate_area(length, width): 计算矩形面积。 参数: length: 矩形长度。 width: 矩形宽度。 返回: 面积值(float) return length * widthdocstring有三个实实在在的作用。第一输入help(calculate_area)解释器会把这段说明打印出来比翻代码看逻辑快得多。第二很多文档生成工具会从docstring自动抽取API文档团队协作时不用额外维护文档省一大笔功夫。第三docstring逼着你定义函数时先想清楚“这个函数到底要做什么”哪怕只写一句话思路也能清晰很多。如果某个函数暂时不想实现可以先用pass占位这相当于给函数留了个空壳def future_feature(): pass这样代码不会报错程序还能正常运行等后面再补实现。我用这个技巧做项目骨架先把模块间调用关系搭好再一个函数一个函数去填内容写代码的节奏感会好很多。2.3 第一个完整的函数矩形面积计算把上面这些串起来写一个真正可用的计算矩形面积的函数def calculate_area(length, width): 计算矩形面积。 return length * width # 调用它 area calculate_area(3.5, 4.2) print(f矩形面积为: {area:.2f})运行之后会输出矩形面积为: 14.70。这个例子虽然小但已经把定义、docstring、return、调用、结果接收全流程走了一遍。后面要做的所有复杂操作无非是在这几条主线里加更多细节。注意return后面那个值就是函数的出口。area calculate_area(...)这一步等号右边的函数调用会先被计算成结果再把它赋给area。这就是往返的过程清晰、确定、可靠。3. 函数调用参数传递是从门外到门内的通道3.1 位置参数与关键字参数两种玩法各有优劣写函数的时候定义的是形参用的时候传的是实参实参怎么传Python给了两种主流方式。位置参数靠顺序对应。定义def purchase(customer, item, price)调用时purchase(张三, 苹果, 5)三个值按位置依次塞进customer、item、price。这种方式简洁但有个致命弱点一旦调用的地方多了你很容易搞混某个位置到底传的是什么。代码一长purchase(苹果, 5, 张三)这种错位事故几乎不可避免。关键字参数在括号里写明形参名purchase(customer张三, item苹果, price5)这样就不用记顺序可读性也大幅提升。我评价一个函数好不好用很多时候就看我读调用代码时能不能不看函数定义就清楚每个参数的意义。关键字参数在这方面贡献极大。两种混着用时有个硬性规则位置参数必须在前面关键字参数必须在后面否则解释器直接报错。# 正确的混用 purchase(张三, item苹果, price5) # 这里不行会报SyntaxError purchase(customer张三, 苹果, 5)这个规矩并不是Python故意找茬而是为了避免歧义如果位置参数跟在关键字参数后面解释器会拿不准到底该按什么规则匹配。3.2 默认参数给函数一个“备选方案”有些参数在大多数调用时都用同一个值这时候就可以设置默认参数。比如日志函数大部分人都记录到INFO级别极少需要DEBUGdef log(message, levelINFO): print(f[{level}] {message}) log(服务启动) # 默认用INFO log(疑似出现异常, ERROR) # 手动指定ERROR默认参数的写法很简单形参名后面跟等号跟默认值。这里有一个很多老手都会踩的坑默认参数必须放在所有没有默认值的参数后面。# 这样写不行 def log(levelINFO, message): pass为什么因为Python按位置匹配实参如果把level放在第一个调用时log(服务启动)这个字符串会被误认为level而message没有实参可接立刻报错。真正的隐形炸弹在下面这个例子def add_item(item, basket[]): basket.append(item) return basket第一次调用add_item(苹果)返回[苹果]第二次调用add_item(香蕉)返回[苹果, 香蕉]——这好像没错但如果你在一个循环里反复调用并且每次都希望从空篮子开始就会发现问题。print(add_item(苹果)) # [苹果] print(add_item(香蕉)) # [苹果, 香蕉]第二次不应该是[香蕉]吗问题出在basket[]这个空列表只被创建了一次。函数被调用多次用的其实是同一个列表对象。默认参数在定义时就被求值并一直存在内存里。解决方法是改成默认参数为None函数体内再新建列表def add_item(item, basketNone): if basket is None: basket [] basket.append(item) return basket这个坑我见过无数次包括一些工作好几年的开发者也会中招。记住一条原则默认参数永远使用不可变类型比如None、数字、字符串、元组。可变类型的默认值迟早出事。3.3 可变参数*args与**kwargs的收集魔法有时候函数接收的参数数量不确定。比如print函数你传3个值也行传10个值也行。这时候就要用到可变参数。用一个*开头的形参会把没被匹配的位置参数收集成一个元组def total_sum(*numbers): print(numbers) # (1, 2, 3, 4) return sum(numbers) print(total_sum(1, 2, 3, 4)) # 10用**开头的形参则把没被匹配的关键字参数收集成一个字典def print_info(**kwargs): print(kwargs) # {name: 张三, age: 20} print_info(name张三, age20)*args和**kwargs是社区约定俗成的名字Python并不强制你必须用这两个词你可以写*numbers、**options功能完全一样。但既然大家都这么写你最好也这么写别人一看就明白你要收集剩余参数。反向操作同样存在。如果一个函数接收多个位置参数而你手里恰好有一个列表可以在调用时加一个*把它展开def add(a, b, c): return a b c nums [1, 2, 3] print(add(*nums)) # 等价于 add(1, 2, 3)这种方式在从前端传来的数据或配置文件里读取数据时特别好用数据是一大堆值函数接收的是固定参数直接用展开运算符解决不用手动写nums[0]、nums[1]这种难看代码。3.4 返回值return的三种形态函数有没有return行为很不一样。第一种形态没有return函数执行完自动返回Nonedef print_summary(a, b): print(fab{ab}) result print_summary(1, 2) print(result) # NoneNone在Python里代表“什么都没有”。如果函数只是做打印、写入文件这类不产生结果的操作就不需要return。但如果你把这个返回值赋给变量变量就是None。第二种形态return一个值。最常见从函数外部接收结果。第三种形态return多个值。Python会把这些值打包成一个元组返回def get_user(): name 张三 age 20 return name, age name, age get_user() print(name, age) # 张三 20这里name, age get_user()是元组解包把返回的(name, age)一次拆开。我经常用这个特性让函数一次返回多个统计结果比用全局变量传值干净得多。还有一种使用技巧提前return用于条件分支拦截。比如查数据库时数据不存在就可以直接返回None退出而不是硬着头皮走完整个函数def find_user(user_id): if user_id 0: return None # 假设这里是真正的查询逻辑 return f用户{user_id}这种提前返回的写法能让函数里的分支结构更扁平减少可怕的嵌套层级。我自己特别偏爱这种风格它让代码阅读起来像走一条笔直的路而不是到处拐弯。4. 函数作用域变量在哪里出生归宿就在哪里4.1 局部变量与全局变量之间的那道界线函数内部定义的变量叫局部变量它只在函数执行期间存在函数结束就被回收。函数外面定义的变量叫全局变量它从定义处开始一直活着直到整个程序结束。total 0 # 全局变量 def change_total(): total 100 # 这里定义了一个新的局部变量total和外面那个total没有关系 change_total() print(total) # 0初学者经常在这翻车。以为在函数里给total赋值就能改变全局变量结果函数外面打印还是原来的0。原因是赋值语句让Python把total当成了函数内的新局部变量跟全局变量只是同名实际上是两个完全独立的变量。如果确实想在函数内部修改全局变量用global关键字声明total 0 def change_total(): global total total 100 change_total() print(total) # 100但global这种写法我建议能不用就不用。全局变量被过多函数修改以后程序的状态就像一盘散沙你不知道哪个函数在哪一刻动了你的全局值。更优雅的做法是把全局值作为参数传进去、把新结果作为返回值带回来保持函数对外界的“透明性”。有一种特殊边界情况要格外注意函数内部读取全局变量是可以的不需要global。但同一函数里如果发生赋值操作哪怕赋值在读取之后Python也会因为先看到赋值而认为这个名字是局部变量从而报错。count 10 def demo(): print(count) # 报UnboundLocalError count 20这种“障眼法”折磨了无数新手。解决思路很简单如果函数要修改外部变量先决定好是主动用global还是把变量传进函数并返回结果。我选择后者的概率大概占九成以上。4.2 LEGB变量查找的一条顺序链Python在函数内查找一个名字时会按“局部变量→嵌套函数作用域→全局变量→内置作用域”这个顺序找简写就是LEGB规则。name 全局 def outer(): name 外层函数 def inner(): name 内层函数 print(name) # 内层函数 inner() print(name) # 外层函数 outer() print(name) # 全局这条规则解释了为什么同样一个名字在不同位置打印出的结果完全不同。查找总是从最里面一层往外找找到哪个算哪个找不到就报NameError。理解LEGB的最大价值在于看懂函数嵌套和闭包。当内层函数引用了外层函数的变量并且内层函数返回出去时就形成了闭包。闭包在装饰器、回调函数、状态保持等场景里无处不在如果你现在不打好作用域基础后面遇到闭包会一头雾水。我不建议新手一开始就深挖闭包和装饰器但一定要知道作用域的存在。等你在项目里写过多层抽象以后会发现LEGB其实就是“就近原则”的编程版——内层的永远是内层的外层的东西除非有通道参数、返回值、global否则进不来也改不了。5. 实操案例把零散脚本重构为可复用函数5.1 场景处理多份成绩数据聊了这么多概念现在动手把一个真实的零散脚本重构一遍。场景是这样的我手头有好几份班级成绩文件每一行是一条成绩可能有空行、可能有非数字的脏数据。我需要统计每份文件的平均分、最高分和及格率并生成一行简洁的中文报告。新手拿到这种任务通常会写一个平铺直叙的脚本比如第一份文件的统计流程写上重复三遍每一份微调文件路径和变量名。代码倒是能跑但只要文件数量一变多或者统计逻辑要调整就会陷入复制粘贴的泥潭。现在用函数来重构。5.2 第一步拆解任务先列出函数清单我拿到任务后不会立刻写代码先拆任务。这份需求读下来可以拆成三个环节读数据、算统计量、写报告。于是函数清单就是三件套read_scores(path)从文件读取成绩列表负责清理空行和脏数据。compute_stats(scores)输入成绩列表返回平均分、最高分、及格率。format_report(name, stats)把统计结果格式化成一行中文字符串。每个函数只做一件事参数和返回值都很明确。这就是我前面说的“单一职责”拆完之后你会瞬间觉得问题清爽很多。5.3 第二步逐个实现并测试先实现读取函数def read_scores(path): 从文件读取成绩返回float列表忽略空行与无法转换的内容。 scores [] with open(path, encodingutf-8) as f: for line in f: line line.strip() if not line: continue try: scores.append(float(line)) except ValueError: # 脏数据直接跳过 continue return scores注意读取文件用了with open这是上下文管理器能自动关闭文件避免忘记close()。每个成绩读进来后用float(line)转换转换失败就跳过。这里我也在展示“函数内部处理异常”的好处调用者拿到的永远是干净的列表不用关心读取过程那些脏细节。再实现统计函数def compute_stats(scores): 计算平均分、最高分、及格率按60分及格。 total len(scores) if total 0: return None avg sum(scores) / total max_score max(scores) pass_count len([s for s in scores if s 60]) pass_rate pass_count / total return avg, max_score, pass_rate这个函数返回三个值调用方可以用元组解包接收。如果列表为空直接返回None这比在后面算avg时报ZeroDivisionError友好得多。我把None当成“没有有效数据”的信号上一节讲的提前return在这里派上了用场。然后是格式化函数def format_report(name, stats): 生成一行中文报告文本。 if stats is None: return f{name}: 无有效数据 avg, max_score, pass_rate stats return f{name}: 平均{avg:.1f}分, 最高{max_score:.1f}分, 及格率{pass_rate:.1%}到这里三个函数都是独立的可以分别喂数据测试。我每写完一个函数就立刻在交互环境里调一调而不是攒到全部写完再调试。这个习惯帮我省了大量排查时间因为单个函数的边界条件少出错一眼就能定位。5.4 第三步主程序调用与扩展空间最后写一个主程序把这些函数串起来def main(): files [class_a.txt, class_b.txt, class_c.txt] for path in files: scores read_scores(path) stats compute_stats(scores) report format_report(path, stats) print(report) if __name__ __main__: main()这个写法里有一个重要细节if __name__ __main__。它的作用是只有直接运行这个脚本文件时才执行main()如果这个文件被其他模块import主程序不会自动跑起来。这样函数部分可以被其他地方安全复用。重构之后我再想增加一个统计指标比如中位数只需要在compute_stats里加一行返回结果再改format_report里对应的一行其他函数完全不用动。想让程序支持一百份文件无非就是在files列表里加一百个路径。这份从容就是函数带来的。6. 常见问题与排查技巧实录6.1 NameError函数未定义还是变量拼错NameError: name xxx is not defined是新手遇到最多的报错。常见原因有几个一是函数定义在调用之后Python执行到调用语句时函数还没有被放进内存所以找不到二是函数名或者变量名拼写不一致前面写cal_area后面调用calc_area这属于离谱但常见的错误。排查思路很简单先在报错信息里确定“哪个名字未定义”然后到当前文件的全局范围找有没有这个名字的定义。如果函数定义了却没找到检查定义和调用谁在前、谁在后。如果变量没找到很可能在函数内部忘了定义就直接使用。打印dir()也能列出当前作用域的所有名字能帮你搞清楚Python的“视野”里到底有什么。6.2 TypeError参数数量对不上TypeError: f() missing 1 required positional argument: b这类报错表示某函数接收的参数数量和你传的不一致。常见原因包括忘了填某个默认参数调用时少写一个位置参数或者把关键字参数放到了位置参数前面。解决办法先数清楚函数定义有几个形参再核对调用处传了几个实参。我推荐在调用时多用关键字参数它能让解释器自动提示缺少哪个参数报错信息也比纯位置参数更明确。同时注意一个经验修改函数签名增加或删减参数之后全局搜索这个函数的所有调用点逐个确认不能只改定义不改调用。6.3 函数调用“没结果”的隐形问题有人在交互环境里调用一个函数显示输入行结束却什么都没输出。最常见的解释是函数只有print没有return或者写了return但没写后面的值。函数返回值是None时如果用print(result)打印只会看到None。还有一种情况是你确实写了return但把return放在了循环或条件分支的某个分支里遇到不满足条件的情况时函数直接走到结束返回了默认的None。这种问题不是“没结果”而是“结果丢了”。我建议写函数时心里始终有一张“流程路线图”每一条路径结束时要么返回某个值要么明确地不返回。我在重构案例里用了if total 0: return None就是主动定义了这一条路径的返回结果。6.4 可变默认参数的“灵异事件”之前讲过默认参数用可变对象会出问题这里再说一个现场排查思路。如果你的函数默认参数里有[]、{}、set()并且发现多次调用后结果越来越“胖”十有八九就是默认参数被累计复用了。排查方式可以打印函数名加一串特殊值看函数内部id(默认参数对象)是否每次都一样。不过我一般直接用is判断默认值是否还是原来的对象。def demo(items[]): return id(items)两次调用打印的id如果一致就代表默认参数是同一个对象问题实锤。解决方法是把默认参数改成None函数体内再初始化这样每次调用都是新对象一劳永逸。6.5 同一个函数里打印全局变量却报错这就是前面提到的作用域“障眼法”。limit 100 def check(): print(limit) limit 50执行check()会报UnboundLocalError: local variable limit referenced before assignment。原因是函数体内有limit 50Python就会把整个limit当作局部变量print(limit)碰一个还没赋值的局部变量自然报错。遇到这个问题你要做的不是硬加global而是先想清楚设计这个变量是不是真的要被函数修改如果只是读取print(limit)完全可以直接工作前提是函数内不要有同名赋值语句。如果确实要修改再考虑用global或者在参数与返回值之间传递。我在第四章里已经强调过尽量让函数对外部世界透明这是最省心的代码风格。6.6 定位函数bug的几条独家经验最后一个小节说点我调试函数时的实操经验。第一每个新函数写完立刻用几组典型的输入值单独测试包括正常值、边界值空列表、负数、0、脏数据。不要等所有函数写完才统一测试到时候你根本不知道问题出在哪一环。第二把握“纯函数优先”的原则尽量让函数的输出只依赖输入参数不要偷偷依赖全局变量或文件状态。纯函数可预测性极强测试起来几乎不费劲。第三遇到难排查的bug不要只盯着报错信息在函数入口打印一遍所有参数的值经常能发现参数顺序错位、数据格式不对这类低级但致命的问题。我自己的习惯是随手写测试断言不用什么测试框架一行就行assert read_scores(class_a.txt) [89.0, 76.0] assert compute_stats([60, 80]) (70.0, 80.0, 1.0)这比在代码里加一堆print更放心因为断言一旦失败程序立刻停下并告诉你具体哪一行出了问题。函数的设计天然适合这种验证方式这也是我极力推荐大家多用函数的一个现实原因可测试性不是加分项是刚需。回到开头的比喻函数像把蛋炒饭的流程固定成了一道菜的配方。配方写好了同样的味道就能复制无数次改配方也只需动一处。我在实际项目里写了无数个函数之后越来越确信函数定义与调用看起来是语法基础但它决定了一个人写代码的视野和习惯。把函数练扎实后面接触的模块、库、框架所有抽象概念都会顺理成章。最后再分享一个小技巧你可以在写任何一段代码前先问自己“这段逻辑以后会不会被复用或修改”只要答案是肯定的就把它塞进一个函数试试。这个习惯大概率会让你的代码质量上一个台阶。

相关新闻

Python函数详解:从定义调用到装饰器与生成器

Python函数详解:从定义调用到装饰器与生成器

写代码这件事,做得久了你会发现,大部分时间根本不是在搞什么高深算法,而是在跟重复劳动作斗争。同样的逻辑在代码里贴来贴去,项目还没跑起来,人先被折腾得没脾气。Python里解决这个问题最基础、也最趁手的工具&#xf…

2026/10/15 5:32:21 阅读更多 →
2026年AI Agent集成SERP API的实战指南

2026年AI Agent集成SERP API的实战指南

1. 这不是选API,是给AI Agent装上“真实世界的眼睛”2026年,如果你还在用本地爬虫硬啃网页、靠固定规则解析搜索结果,或者把Agent的“信息获取”能力寄托在某个黑盒模型的幻觉输出上——那你的Agent大概率正在生成一堆看似专业、实则离谱的错…

2026/10/15 5:32:21 阅读更多 →
AutoDL+Strata部署Qwen3.8 Flash Next:从零到API全流程指南

AutoDL+Strata部署Qwen3.8 Flash Next:从零到API全流程指南

最近一直在折腾开源大模型的私有化部署,从选型到跑通API踩了不少坑。这次把一个叫Qwen3.8 Flash Next的模型完整地部署了一遍,环境用的是AutoDL云GPU平台,推理服务统一交给Strata这个部署框架来托管。整个过程从零开始,中间有几次…

2026/10/15 5:31:21 阅读更多 →

最新新闻

C++构造函数初始化列表:对象生命周期、性能与陷阱全解析

C++构造函数初始化列表:对象生命周期、性能与陷阱全解析

写C代码这么多年,有个问题我几乎每次聊构造函数都会被人问起:成员变量到底是放在初始化列表里写好,还是直接在大括号里赋值好?很多新手甚至干了两三年的开发者都说不清这两者的本质区别。借今天这篇,我打算把构造初始化…

2026/10/15 8:59:13 阅读更多 →
Genus iSpatial物理综合全解析:从模板跑通到Innovus一致性预测

Genus iSpatial物理综合全解析:从模板跑通到Innovus一致性预测

简介:围绕Cadence Genus综合平台iSpatial Flow的快速上手技术资料,面向数字IC前端综合工程师及后端物理实现人员,旨在帮助缩短RTL到GDS的设计周期,并提升综合对后端布局布线的预测准确性。文档系统讲解统一物理优化引擎、关键区域…

2026/10/15 8:59:13 阅读更多 →
游戏原型内嵌层设计:时间、反馈、节奏与心理层的实现与调试

游戏原型内嵌层设计:时间、反馈、节奏与心理层的实现与调试

1. 从“能跑就行”到“手感对了”:为什么原型阶段必须读懂内嵌层做游戏原型的人都有一个通病:拿到一个想法,恨不得当天就把它做成能跑能跳的Demo。角色能动、子弹能飞、分数能加,就觉得原型已经完成了。但真正做过几个项目之后你会…

2026/10/15 8:59:13 阅读更多 →
WebLogic 12.2.1.4.0 Linux通用版下载与静默安装实战指南

WebLogic 12.2.1.4.0 Linux通用版下载与静默安装实战指南

简介:这份资源面向需要在Linux服务器上部署Java企业级应用的运维与开发人员,提供Oracle WebLogic 12c 12.2.1.4.0的通用版本静默安装包,可用于搭建、部署和管理企业级Java应用,属于中间件层面的实战工具。压缩包为zip格式&#xf…

2026/10/15 8:59:13 阅读更多 →
SURPAC三维矿体建模全流程:从钻孔数据库到资源量估算

SURPAC三维矿体建模全流程:从钻孔数据库到资源量估算

简介:SURPAC是地质勘探、矿产资源评价与环境监测领域广泛应用的建模工具,这份Word文档系统梳理了SURPAC建模的核心知识点,适合初次接触SURPAC建模的工程师、地质技术人员及相关专业学生。内容涵盖项目数据在微机中的存贮组织、原始数据组织、…

2026/10/15 8:59:13 阅读更多 →
T3 Stack 全栈开发实战:类型安全架构从入门到避坑指南

T3 Stack 全栈开发实战:类型安全架构从入门到避坑指南

在前后端分离大行其道的今天,TypeScript 全栈方案已经不是什么新鲜词。但有一个技术组合,从 2022 年开始就在海外开发者圈子里持续霸榜,直到现在依然是很多团队做中大型项目的首选架构,就是 t3code 背后这套技术栈——更准确地说&…

2026/10/15 8:58:11 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →