Python函数参数详解:位置参数、默认参数、可变参数与关键字参数
函数参数这个话题刚学Python的人觉得自己懂了写过两三个项目的人觉得自己用熟了但真正在代码review里被同事挑刺、在线上事故里被参数坑过的人才知道这里面藏着的细节远比想象中多。我见过太多项目里因为参数设计不合理导致调用方传错顺序、默认值踩可变对象的坑、关键字参数拼写错误排查半天的案例。这篇内容就是把我这些年带新人、做代码审查、重构老项目时积累的参数使用经验完整梳理一遍从位置参数到关键字参数每一种的适用场景、常见陷阱、设计取舍都讲透。不管你是刚接触函数定义的新手还是想系统梳理参数体系的老手都能从中找到可以直接用到项目里的实操建议。1. 四种参数类型到底在解决什么问题1.1 从一次代码审查说起前些年参与过一个数据处理项目的重构原代码里有个函数大概长这样def process_data(data, mode, threshold, retry, timeout, verbose, output): # 几十行处理逻辑 pass调用的时候是这样写的process_data(records, True, 0.85, 3, 30, False, result.csv)这段代码能跑但问题是三个月后没人记得第三个参数0.85到底代表什么第五个参数30是秒还是毫秒。更危险的是有一次有人想改retry的值结果不小心改到了threshold的位置上测试环境没发现上线后数据处理结果全偏了。这就是参数设计不合理的典型后果。Python提供了四种参数类型——位置参数、默认参数、可变参数、关键字参数——它们不是随便设计的语法糖每一种都在解决特定的问题。理解它们各自解决什么场景下的什么痛点比死记语法重要得多。1.2 四种参数的核心定位对比先上一张表把四种参数的核心特征和适用场景理清楚参数类型定义方式核心作用典型场景位置参数def f(a, b)按顺序传参最基础的形式参数少、含义明确的函数默认参数def f(a, b10)提供缺省值简化调用大部分调用使用相同值的场景可变参数def f(*args)接收任意数量的位置参数参数个数不确定如求和、拼接关键字参数def f(**kwargs)接收任意数量的键值对参数配置项传递、装饰器、透传参数这张表看起来简单但每一种参数背后都有一堆细节需要展开。比如默认参数的默认值只在定义时求值一次这个特性导致可变默认值成为Python最经典的坑之一。再比如可变参数和关键字参数在函数签名中的位置是有严格顺序要求的写反了直接语法报错。1.3 参数顺序的硬性规则Python对函数定义中参数的排列顺序有明确规定违反规则会直接抛出SyntaxError。正确的顺序是位置参数默认参数可变位置参数*args关键字参数**kwargs用代码表示就是def func(pos1, pos2, default110, default220, *args, **kwargs): pass这个顺序不是随意定的背后有语法解析的逻辑位置参数必须在默认参数前面否则解析器无法判断哪个参数有默认值*args必须放在所有位置参数和默认参数之后因为它要收集剩余的所有位置实参**kwargs必须放在最后因为它收集所有未匹配的关键字实参。注意从Python 3开始还支持在*args后面定义仅关键字参数这些参数只能通过关键字方式传递不能通过位置方式传递。这个特性在API设计中非常有用后面会详细展开。2. 位置参数最基础也最容易出问题2.1 位置参数的传参机制位置参数是函数定义中最基本的形式调用时按照定义时的顺序依次传入实参。Python内部通过一个有序的参数列表来匹配第一个实参对应第一个形参第二个对应第二个以此类推。def create_user(name, age, city): return f{name}, {age}岁, 来自{city} # 正确调用 create_user(张三, 28, 杭州) # 顺序传错——不会报错但结果完全错误 create_user(杭州, 28, 张三)第二种调用方式不会抛出任何异常因为三个参数都是字符串或整数类型检查通不过的情况才会报错。这种静默错误是最危险的因为程序照常运行只是结果不对。2.2 位置参数的数量匹配规则调用函数时传入的位置参数数量必须与函数定义中的位置参数数量完全一致在没有默认参数和可变参数的情况下。多了会报TypeError: too many positional arguments少了会报TypeError: missing required positional arguments。def add(a, b): return a b add(1, 2) # 正常返回3 add(1) # TypeError: missing 1 required positional argument: b add(1, 2, 3) # TypeError: takes 2 positional arguments but 3 were given这个规则看起来简单但在实际项目中函数参数一多调用时数错个数的情况并不少见。尤其是参数类型相似的时候比如多个字符串参数或多个数值参数少传一个多传一个在代码审查时很容易被忽略。2.3 什么时候该用位置参数位置参数适合以下场景参数数量少一般不超过3个且每个参数的含义从函数名就能推断出来参数之间有自然的顺序关系比如(x, y)坐标、(start, end)范围函数是内部工具函数调用方明确知道参数含义反过来如果参数超过3个或者参数含义不够直观就应该考虑使用关键字参数或默认参数来提升可读性。我个人的经验法则是函数签名超过3个参数时强制要求调用方使用关键字方式传参可以通过在参数前加*来实现def transfer(*, from_account, to_account, amount): pass # 必须这样调用 transfer(from_accountA, to_accountB, amount100) # 这样调用会报错 transfer(A, B, 100) # TypeError这种设计强制调用方写明参数名彻底杜绝了顺序传错的问题。代价是调用时多打一些字但换来的是代码可读性和可维护性的大幅提升。3. 默认参数便利与陷阱并存3.1 默认参数的基本用法默认参数允许在函数定义时为参数指定一个缺省值调用时如果不传该参数就使用默认值def send_request(url, methodGET, timeout30, retries3): print(f{method} {url}, timeout{timeout}s, retries{retries}) send_request(https://example.com/api) # 输出: GET https://example.com/api, timeout30s, retries3 send_request(https://example.com/api, methodPOST, timeout60) # 输出: POST https://example.com/api, timeout60s, retries3默认参数最大的价值在于让调用方只关注需要修改的参数其余使用合理的缺省值。这在配置类函数、工具函数中非常常见。3.2 可变默认值的经典陷阱这是Python面试中出现频率最高的问题之一也是实际项目中最容易踩的坑def append_to(element, target[]): target.append(element) return target print(append_to(1)) # [1] print(append_to(2)) # [1, 2] —— 不是预期的 [2] print(append_to(3)) # [1, 2, 3] —— 更不是预期的 [3]问题的根源在于默认值在函数定义时求值一次之后所有调用共享同一个对象。target[]中的空列表在函数定义时就被创建了之后每次调用如果没有传入target使用的都是同一个列表对象。正确的做法是使用None作为默认值在函数体内判断并创建新对象def append_to(element, targetNone): if target is None: target [] target.append(element) return target print(append_to(1)) # [1] print(append_to(2)) # [2] print(append_to(3)) # [3]同样的陷阱也存在于字典、集合等可变对象作为默认值的情况。记住一条铁律永远不要用可变对象作为默认参数值。3.3 默认参数的求值时机理解默认参数的求值时机非常重要。看下面这个例子import time def log(message, timestamptime.time()): print(f[{timestamp}] {message}) log(first) # [1690000000.0] first time.sleep(1) log(second) # [1690000000.0] second —— 时间戳没有变time.time()只在函数定义时执行了一次之后所有调用都使用同一个时间戳。如果希望每次调用都获取当前时间必须把求值放到函数体内def log(message, timestampNone): if timestamp is None: timestamp time.time() print(f[{timestamp}] {message})这个特性在某些场景下反而有用比如缓存计算结果、初始化配置对象等但大多数情况下我们期望的是每次调用重新求值。3.4 默认参数与位置参数的配合默认参数可以跟位置参数混合使用但有一个限制默认参数必须放在位置参数后面。这是语法层面的硬性要求# 正确 def func(a, b, c10, d20): pass # 语法错误 def func(a, b10, c, d20): pass # SyntaxError: non-default argument follows default argument这个规则的原因很直观如果允许默认参数在位置参数前面那么调用时传入的位置实参就无法确定该匹配哪个形参了。实操心得在设计函数签名时把最常变化的参数放在前面作为位置参数把不常变化的参数放在后面作为默认参数。这样调用方在大多数情况下只需要传前几个参数代码更简洁。4. 可变参数灵活性的代价4.1 *args 的工作机制*args允许函数接收任意数量的位置参数这些参数在函数内部被收集为一个元组def sum_all(*args): print(fargs {args}, type {type(args)}) return sum(args) sum_all(1, 2, 3) # args (1, 2, 3), type class tuple sum_all(1, 2, 3, 4, 5) # args (1, 2, 3, 4, 5), type class tuple sum_all() # args (), type class tuple注意args只是一个约定俗成的名字你可以叫它任何名字*nums、*items都可以但*args是社区通用写法建议遵循。4.2 位置参数与 *args 的配合*args可以和普通位置参数一起使用前面的位置参数会先被匹配剩余的才归*argsdef log(level, *messages): for msg in messages: print(f[{level}] {msg}) log(INFO, 系统启动, 加载配置, 连接数据库) # [INFO] 系统启动 # [INFO] 加载配置 # [INFO] 连接数据库这种模式在日志、批量处理等场景中很常见。第一个参数固定为级别或操作类型后面的参数数量不定。4.3 解包传参* 在调用侧的使用*不仅可以用在函数定义侧收集参数还可以用在调用侧解包序列def add(a, b, c): return a b c numbers [1, 2, 3] print(add(*numbers)) # 等价于 add(1, 2, 3)返回6 # 也可以解包部分 first [1, 2] print(add(*first, 3)) # 等价于 add(1, 2, 3)这个特性在需要把列表或元组的元素作为独立参数传给函数时非常方便。比如print(*items, sep, )就是常见的用法。4.4 *args 的常见误用与注意事项*误用一用args 代替明确的参数列表# 不推荐 def create_user(*args): name, age, city args pass # 推荐 def create_user(name, age, city): pass如果参数个数和含义是确定的就应该明确写出来而不是用*args然后在函数体内解包。后者丢失了函数签名的自描述性调用方无法从签名看出需要传什么。*误用二在args 后面定义普通位置参数def func(*args, last): print(args, last) func(1, 2, 3, last4) # args(1,2,3), last4 func(1, 2, 3, 4) # TypeError: missing required keyword-only argument: last*args后面的参数变成了仅关键字参数只能通过关键字方式传递。这个特性本身很有用但如果不了解这个规则可能会困惑为什么调用报错。注意事项*args收集的是一个元组不是列表。如果需要在函数内修改这些参数需要先转换成列表。另外*args不能收集关键字参数关键字参数需要用**kwargs来收集。5. 关键字参数灵活配置的利器5.1 **kwargs 的工作机制**kwargs允许函数接收任意数量的关键字参数这些参数在函数内部被收集为一个字典def print_config(**kwargs): for key, value in kwargs.items(): print(f{key} {value}) print_config(hostlocalhost, port8080, debugTrue) # host localhost # port 8080 # debug True同样kwargs只是约定名称可以叫任何名字但建议遵循社区惯例。5.2 关键字参数与普通参数的配合**kwargs通常放在参数列表的最后用于收集所有未匹配的关键字参数def request(url, methodGET, **kwargs): print(f{method} {url}) for key, value in kwargs.items(): print(f {key}: {value}) request(https://example.com, methodPOST, timeout30, retries3) # POST https://example.com # timeout: 30 # retries: 3这种模式在封装底层库、透传参数时非常常见。比如自己写一个HTTP请求封装把额外的参数透传给底层的请求库。5.3 解包传参** 在调用侧的使用与*类似**也可以用在调用侧解包字典def create_user(name, age, city): print(f{name}, {age}, {city}) user_info {name: 张三, age: 28, city: 杭州} create_user(**user_info) # 等价于 create_user(name张三, age28, city杭州)这个用法在需要把配置字典直接传给函数时非常方便。但要注意字典的键必须与函数的参数名完全匹配否则会报TypeError: unexpected keyword argument。5.4 关键字参数在API设计中的价值关键字参数最大的价值在于自描述性。对比下面两种调用方式# 位置参数——需要查文档才知道每个参数的含义 create_user(张三, 28, 杭州, True, False) # 关键字参数——一眼就能看出每个参数的含义 create_user(name张三, age28, city杭州, is_activeTrue, is_adminFalse)第二种方式虽然多打了一些字但代码的可读性和可维护性提升了一个档次。在团队协作中这种自描述性带来的收益远大于多打几个字符的成本。Python标准库中很多函数都大量使用关键字参数比如sorted()的key和reverse、print()的sep和end等。这些参数如果只靠位置传递几乎不可能记住顺序。5.5 **kwargs 的典型应用场景场景一装饰器透传参数def log_calls(func): def wrapper(*args, **kwargs): print(f调用 {func.__name__}) return func(*args, **kwargs) return wrapper log_calls def add(a, b, c0): return a b c add(1, 2, c3) # 调用 add # 返回6装饰器中的wrapper函数用*args, **kwargs接收任意参数并原样透传给被装饰的函数这是装饰器能通用化的关键。场景二配置合并DEFAULT_CONFIG { host: localhost, port: 8080, debug: False, timeout: 30, } def init_app(**kwargs): config {**DEFAULT_CONFIG, **kwargs} print(config) init_app(debugTrue, timeout60) # {host: localhost, port: 8080, debug: True, timeout: 60}这种模式在框架和库的初始化函数中非常常见允许用户覆盖默认配置中的任意项。场景三动态函数调用def dispatch(func_name, **kwargs): func_map { create: create_user, delete: delete_user, update: update_user, } if func_name in func_map: return func_map[func_name](**kwargs) raise ValueError(f未知操作: {func_name})根据传入的操作名动态调用对应的函数并把参数透传过去。这种模式在命令分发、路由处理等场景中很实用。6. 参数组合使用的实战技巧6.1 四种参数的完整组合示例把四种参数放在一起函数签名会是这样def complex_func(pos1, pos2, default110, *args, keyword_only20, **kwargs): print(fpos1{pos1}, pos2{pos2}) print(fdefault1{default1}) print(fargs{args}) print(fkeyword_only{keyword_only}) print(fkwargs{kwargs}) complex_func(1, 2, 3, 4, 5, keyword_only30, extra1a, extra2b) # pos11, pos22 # default13 # args(4, 5) # keyword_only30 # kwargs{extra1: a, extra2: b}这个例子展示了所有参数类型的匹配顺序位置参数优先匹配然后是有默认值的参数剩余的归*args*args后面的参数只能通过关键字传递最后未匹配的关键字参数归**kwargs。6.2 仅关键字参数的设计价值在*args后面定义的参数或者单独用一个*分隔成为仅关键字参数只能通过关键字方式传递def divide(a, b, *, precision2): result a / b return round(result, precision) divide(10, 3) # 3.33 divide(10, 3, precision4) # 3.3333 divide(10, 3, 4) # TypeError: takes 2 positional arguments but 3 were given这种设计的价值在于强制调用方写明参数名避免位置传参带来的歧义。对于含义不够直观的参数比如precision、mode、strategy等这种强制是值得的。6.3 参数设计的最佳实践清单根据我多年的项目经验总结出以下参数设计原则参数数量控制在5个以内超过5个参数考虑用配置对象或数据类封装布尔参数强制关键字传递def f(data, *, verboseFalse)避免f(data, True)这种看不懂的调用可变默认值一律用 None在函数体内判断并初始化公共API使用仅关键字参数提升可读性和向后兼容性***args 和kwargs 只用于真正需要灵活性的场景不要为了省事而滥用参数命名要自解释timeout_seconds比t好max_retries比n好6.4 参数传递的性能考量从性能角度看四种参数类型的开销略有差异参数类型调用开销说明位置参数最低直接按位置匹配无需额外处理默认参数低未传时使用默认值开销可忽略*args中等需要创建元组对象**kwargs较高需要创建字典对象哈希开销在绝大多数应用场景中这些差异可以忽略不计。只有在极端性能敏感的场景比如每秒调用数百万次的底层函数才需要考虑参数类型对性能的影响。这种场景下优先使用位置参数避免**kwargs。实操心得如果发现某个热点函数的**kwargs开销成为瓶颈可以考虑把常用的关键字参数显式声明出来只把不常用的留给**kwargs。这样常用参数走快速路径不常用参数走字典路径。7. 常见问题与排查技巧实录7.1 参数相关报错速查表报错信息原因解决方法missing 1 required positional argument少传了位置参数检查调用时是否漏传takes 2 positional arguments but 3 were given多传了位置参数检查是否多传或应该用关键字got an unexpected keyword argument传了函数不认识的参数名检查拼写或函数签名non-default argument follows default argument默认参数写在了位置参数前面调整参数顺序positional argument follows keyword argument调用时关键字参数后面又跟了位置参数把所有位置参数放到前面SyntaxError: invalid syntax参数顺序违反语法规则按位置→默认→*args→**kwargs排列7.2 参数拼写错误的排查方法关键字参数拼写错误是实际开发中很常见的问题尤其是参数名比较长的时候。比如把timeout拼成time_out、把retries拼成retrys。这类错误在运行时才会暴露如果测试覆盖不到就会漏到线上。排查方法使用IDE的自动补全功能减少手写参数名的机会在函数定义中使用**kwargs时添加参数校验逻辑使用类型检查工具如mypy可以在静态阶段发现部分问题def request(url, **kwargs): allowed {timeout, retries, headers} unknown set(kwargs) - allowed if unknown: raise TypeError(f未知参数: {unknown}) # 处理逻辑7.3 参数默认值被意外修改的问题前面讲过可变默认值的陷阱这里补充一个更隐蔽的情况默认值是可变对象但函数内部没有直接修改它而是修改了它的某个属性class Config: def __init__(self): self.items [] def add_item(item, configConfig()): config.items.append(item) return config.items print(add_item(a)) # [a] print(add_item(b)) # [a, b] —— 又是共享对象的问题这种问题更隐蔽因为默认值看起来不像列表那么明显可变。解决方法同样是使用None作为默认值。7.4 参数传递中的引用问题Python的参数传递是传对象引用对于可变对象函数内外的修改会互相影响def modify_list(lst): lst.append(4) my_list [1, 2, 3] modify_list(my_list) print(my_list) # [1, 2, 3, 4] —— 原列表被修改了如果不想让函数修改原对象需要在函数内创建副本def modify_list(lst): lst lst.copy() lst.append(4) return lst这个问题在参数是嵌套结构如列表套字典时更复杂因为浅拷贝只复制最外层。需要根据实际情况决定使用浅拷贝还是深拷贝。7.5 参数数量过多时的重构方案当一个函数的参数超过7个时就应该考虑重构了。常见的重构方案有方案一使用数据类封装参数from dataclasses import dataclass dataclass class RequestConfig: url: str method: str GET timeout: int 30 retries: int 3 headers: dict None def request(config: RequestConfig): pass方案二使用字典或配置对象def request(url, optionsNone): options options or {} timeout options.get(timeout, 30) retries options.get(retries, 3)方案三拆分成多个小函数如果一个函数需要这么多参数往往说明它承担了太多职责可以考虑拆分成多个职责单一的函数。注意事项重构参数时要注意向后兼容。如果是公共API直接改签名会破坏调用方代码。可以通过保留旧签名、内部转发到新实现的方式来平滑过渡。8. 参数设计中的进阶话题8.1 参数类型注解的配合使用Python 3.5 支持类型注解与参数结合使用可以大幅提升代码的可读性和可维护性from typing import Optional def create_user( name: str, age: int, city: str 未知, tags: Optional[list[str]] None, ) - dict: if tags is None: tags [] return {name: name, age: age, city: city, tags: tags}类型注解不会在运行时强制检查但配合mypy等工具可以在开发阶段发现类型错误。对于参数较多的函数类型注解相当于一份内嵌的文档调用方一看就知道该传什么类型。8.2 参数校验的时机与方式对于公共API或框架代码参数校验是必要的。校验的时机一般有两种方式一在函数入口处集中校验def transfer(from_account, to_account, amount): if not isinstance(amount, (int, float)): raise TypeError(amount必须是数字) if amount 0: raise ValueError(amount必须大于0) # 处理逻辑方式二使用装饰器统一校验def validate_params(**rules): def decorator(func): def wrapper(*args, **kwargs): # 根据rules校验参数 return func(*args, **kwargs) return wrapper return decorator方式一简单直接适合参数少的函数方式二适合多个函数共享校验逻辑的场景。8.3 参数默认值与配置管理的结合在实际项目中函数的默认参数值往往来自配置文件或环境变量。这时候需要处理好默认值与配置的优先级关系import os def get_timeout(): return int(os.environ.get(REQUEST_TIMEOUT, 30)) def request(url, timeoutNone): if timeout is None: timeout get_timeout() # 处理逻辑这种模式的好处是默认值不是硬编码的而是可以在运行时通过环境变量调整。同时函数签名中的None表示使用配置值语义清晰。8.4 参数在继承体系中的行为在类继承中子类重写父类方法时参数签名应该保持兼容class Base: def process(self, data, modedefault): pass class Child(Base): def process(self, data, modedefault, extraNone): super().process(data, mode) # 额外处理子类可以增加参数通过默认值保持兼容但不应该减少参数或改变参数顺序否则会破坏里氏替换原则导致父类引用调用子类实例时出错。8.5 参数与函数式编程的结合在函数式编程风格中参数的设计也有讲究。比如functools.partial可以固定部分参数生成新的函数from functools import partial def power(base, exponent): return base ** exponent square partial(power, exponent2) cube partial(power, exponent3) print(square(5)) # 25 print(cube(3)) # 27这种技巧在需要把通用函数特化成专用函数时很有用比如把request(url, method, timeout)特化成get partial(request, methodGET)。参数设计看起来是Python中最基础的内容但真正把它用好、用对需要在项目中不断实践和总结。我个人的体会是好的参数设计让调用方不需要看文档就能正确使用坏的参数设计让调用方每次都要翻源码确认。从今天开始审视一下你项目中的函数签名看看有没有可以改进的地方——把布尔参数改成仅关键字、把可变默认值改成None、把超过5个参数的函数用数据类封装。这些小改动积累起来代码质量会有明显的提升。

相关新闻

分层图最短路:融合状态建模与堆优化的动态规划解法

分层图最短路:融合状态建模与堆优化的动态规划解法

1. 这不是普通图论模板,而是一套能真正落地的“分层建模堆优化动态规划”三重协同方案你有没有遇到过这种场景:写一个带状态转移的最短路问题,比如“在最多使用k次免费边的前提下求最短距离”,或者“经过某类节点后路径权重规则会…

2026/10/12 22:03:15 阅读更多 →
Semantic Router 防护(Protection)实战指南:为智能体会话建立有边界的模型稳定性守卫

Semantic Router 防护(Protection)实战指南:为智能体会话建立有边界的模型稳定性守卫

后端API网关模型推理服务AI Agent 【免费下载链接】semantic-router An open, programmable decision layer for models and compute. 项目地址: https://gitcode.com/gh_mirrors/sem/semantic-router 点击查看 免费下载 本篇指南深入讲解 Semantic Router 的 Rout…

2026/10/12 22:02:13 阅读更多 →
AI模型代码破坏风险与防御性工程实践指南

AI模型代码破坏风险与防御性工程实践指南

1. 当模型开始“动手脚”:一个被忽视的风险切面第一次看到“AI破坏实验室代码”这个说法时,我的直觉是:这大概率又是一次标题党。毕竟我们日常跟各类模型打交道,写代码、改bug、生成测试用例,它顶多就是“写错”&#…

2026/10/12 22:02:13 阅读更多 →

最新新闻

LightGBM因子筛选与BiLSTM时序建模:量化投资策略实战

LightGBM因子筛选与BiLSTM时序建模:量化投资策略实战

简介:这份资源面向计算机相关专业学生、高校教师及量化投资初学者,提供一套将LightGBM与BiLSTM结合进行因子组合选取并构建量化投资策略的完整实践项目,可直接用于毕业设计、课程设计、实训实验或公司项目二次开发。压缩包共1408个文件&#…

2026/10/13 1:02:48 阅读更多 →
基于LightGBM与BiLSTM双模型融合的因子组合量化策略实战

基于LightGBM与BiLSTM双模型融合的因子组合量化策略实战

简介:这份资源面向计算机相关专业学生、高校教师及量化投资初学者,提供一套将LightGBM与BiLSTM结合进行因子组合选取并构建量化投资策略的完整实践项目,可直接用于毕业设计、课程设计、实训实验或公司二次开发。压缩包共1408个文件&#xff0…

2026/10/13 1:02:48 阅读更多 →
ECharts 5 中国地图完整实现:从 GeoJSON 获取到省市县下钻实战

ECharts 5 中国地图完整实现:从 GeoJSON 获取到省市县下钻实战

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

2026/10/13 1:02:48 阅读更多 →
AnyPS5串流实战:跨网络远程玩PS5的架构设计与延迟优化

AnyPS5串流实战:跨网络远程玩PS5的架构设计与延迟优化

1. 从“AnyPS5”这个标题说起:它到底想解决什么问题第一次看到“AnyPS5”这个标题,我脑子里蹦出来的第一个念头是:这大概率是一个围绕“跨平台串流”或者“远程访问”做文章的项目。为什么这么判断?因为“Any”这个前缀在技术圈里…

2026/10/13 1:02:48 阅读更多 →
数学建模初等模型:商人过河问题Matlab实现与BFS求解

数学建模初等模型:商人过河问题Matlab实现与BFS求解

数学建模之初等模型——商人过河问题(Matlab实现)商人过河这个问题,从小学奥数到数学建模课堂,几乎是所有接触过离散模型的人绕不开的一道经典题。题面本身非常简单:三个商人带着三个仆人过河,船一次最多坐…

2026/10/13 1:02:48 阅读更多 →
CRF序列标注原理与实战:从全局最优解到工业级部署

CRF序列标注原理与实战:从全局最优解到工业级部署

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

2026/10/13 1:01:48 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →