Python函数参数设计实战:位置参数、默认参数、可变参数与关键字参数详解
1. 从一次函数调用报错说起为什么参数设计值得单独拎出来讲刚带新人的时候我特别喜欢观察他们写函数的习惯。有个很典型的场景某同学写了一个计算订单折扣的函数参数列表里塞了七八个参数调用的时候全靠位置硬怼。结果某天业务加了一个新参数插在了中间位置所有调用点全部报错排查了大半天才发现是参数顺序错位。这个坑其实不是他一个人踩过我见过太多项目里函数参数设计得乱七八糟调用方和维护方都痛苦不堪。Python 的函数参数机制看起来简单但真正把位置参数、默认参数、可变参数、关键字参数这四样东西搞清楚、用明白的人其实没想象中那么多。很多人写了两三年 Python遇到*args和**kwargs还是靠猜看到函数签名里出现/和*就发懵。这篇文章就是想把这件事彻底讲透——不是照本宣科地列语法而是从实际写代码的角度告诉你每种参数类型解决的是什么问题、什么时候该用哪种、混用的时候有哪些坑。不管你是刚学 Python 的新手还是已经写过一些项目但总觉得参数这块不够扎实的开发者这篇内容都值得花时间看完。我会从最基础的位置参数讲起一路讲到参数顺序规则、解包技巧、以及实际项目中怎么设计出好用的函数签名。每一部分都会配上可以直接跑的代码示例和我在实际项目中总结出来的经验。2. 位置参数最基础但也最容易出问题的调用方式2.1 位置参数的匹配逻辑位置参数是 Python 函数参数里最原始、最直观的一种。定义的时候按顺序写参数名调用的时候按同样的顺序传值Python 解释器按照位置一一对应地绑定。def create_user(name, age, city): return f{name}, {age}岁, 来自{city} result create_user(张三, 28, 杭州) print(result) # 张三, 28岁, 来自杭州这段代码里张三绑定给name28绑定给age杭州绑定给city。绑定规则非常机械——第一个实参给第一个形参第二个给第二个以此类推。一旦数量对不上Python 会直接抛TypeError不会给你任何自动补全的机会。位置参数的核心问题在于调用方必须记住参数的确切顺序。参数少的时候还好一旦超过三四个调用的时候就得反复去翻函数定义。我在实际项目里见过一个函数有六个位置参数调用的时候写成process_data(data, True, False, None, 3, utf-8)过两天回来看这段代码完全不知道True和False分别代表什么含义。2.2 位置参数的数量校验机制Python 对位置参数的数量检查非常严格。少传了会报missing required positional argument多传了会报takes N positional arguments but M were given。这种严格性其实是好事能在调用阶段就暴露问题而不是等到函数体内部才出错。def greet(name, greeting): return f{greeting}, {name}! # 少传参数 greet(张三) # TypeError: greet() missing 1 required positional argument: greeting # 多传参数 greet(张三, 你好, extra) # TypeError: greet() takes 2 positional arguments but 3 were given我个人的经验是位置参数适合那些参数含义一目了然、顺序符合直觉的场景。比如draw_line(x1, y1, x2, y2)这种坐标顺序是行业惯例用位置参数反而比关键字参数更简洁。但如果参数含义需要猜测就应该考虑用关键字参数来调用。2.3 位置参数在实际项目中的取舍什么时候该用位置参数我的判断标准是三条第一参数数量不超过三个第二参数顺序有自然语义比如从起点到终点、从源到目标第三调用频率极高且参数含义在上下文中非常明确。反过来如果参数数量超过四个或者参数之间存在容易混淆的类型比如多个布尔值就应该果断放弃纯位置参数的设计。我踩过的一个坑是写了一个export_report(data, True, False)这样的函数后来自己调用的时候把两个布尔值传反了导出的报表格式完全不对查了半天才发现问题。从那以后凡是布尔类型的参数我一律强制用关键字参数调用。3. 默认参数灵活性与陷阱并存的雙刃剑3.1 默认参数的基本用法与设计意图默认参数解决的是大部分情况下用同一个值少数情况需要自定义的问题。定义的时候给参数一个默认值调用的时候可以选择性地覆盖。def connect_database(host, port3306, timeout30, charsetutf-8): print(f连接 {host}:{port}, 超时{timeout}秒, 编码{charset}) connect_database(localhost) # 连接 localhost:3306, 超时30秒, 编码utf-8 connect_database(localhost, port5432, charsetgbk) # 连接 localhost:5432, 超时30秒, 编码gbk这种设计的好处显而易见调用方只需要关注自己需要修改的参数其余用默认值就行。从 API 设计的角度看默认参数降低了调用方的认知负担也让函数在面对需求变化时更容易扩展——新增一个带默认值的参数不会破坏已有的调用代码。3.2 默认参数必须指向不可变对象这是 Python 新手最容易踩的坑没有之一。先看一段代码def add_item(item, target_list[]): target_list.append(item) return target_list print(add_item(a)) # [a] print(add_item(b)) # [a, b] ← 不是 [b] print(add_item(c)) # [a, b, c]为什么会这样因为 Python 函数的默认值是在函数定义时求值的而且只求值一次。也就是说target_list[]这个空列表在函数被定义的那一刻就创建好了之后每次调用如果没传这个参数用的都是同一个列表对象。对它的修改会一直累积下去。正确的做法是用None作为默认值在函数体内部判断并创建新对象def add_item(item, target_listNone): if target_list is None: target_list [] target_list.append(item) return target_list print(add_item(a)) # [a] print(add_item(b)) # [b]同样的坑还出现在字典、集合等可变对象上。我见过一个真实案例某项目的日志收集函数用def log(message, context{})作为签名结果所有请求的上下文信息全部混在一起排查了很久才定位到是默认参数的问题。记住一条铁律默认参数永远不要用可变对象用None代替。3.3 默认参数的求值时机与性能考量默认值在函数定义时求值这个特性除了带来可变对象的坑还有一些有意思的影响。比如下面这段代码import time def log_with_time(message, timestamptime.time()): print(f[{timestamp}] {message}) log_with_time(第一条) time.sleep(1) log_with_time(第二条)两次打印的时间戳是一样的因为time.time()只在函数定义时执行了一次。如果你希望每次调用都获取当前时间就必须把求值放到函数体内部def log_with_time(message, timestampNone): if timestamp is None: timestamp time.time() print(f[{timestamp}] {message})这个特性有时候也能被巧妙利用。比如某些场景下你确实希望默认值在程序启动时就固定下来比如配置项的读取那直接写在默认参数里反而是一种简洁的表达方式。但大多数情况下还是建议把动态求值的逻辑放到函数体内部避免给阅读代码的人造成困惑。4. 可变参数让函数接受任意数量的实参4.1 *args 的工作机制与解包过程*args允许函数接受任意数量的位置参数这些参数会被打包成一个元组传给函数。def sum_all(*args): print(f收到的参数: {args}, 类型: {type(args)}) return sum(args) print(sum_all(1, 2, 3)) # 收到的参数: (1, 2, 3), 类型: class tuple print(sum_all(1, 2, 3, 4, 5)) # 收到的参数: (1, 2, 3, 4, 5) print(sum_all()) # 收到的参数: (), 类型: class tuple注意几个关键点args只是一个约定俗成的名字你叫它*numbers、*items都行但社区惯例是*args。函数内部拿到的args是一个元组即使只传了一个参数它也是(1,)而不是1。如果不传任何参数它就是空元组()。*args的典型使用场景包括数学计算中的求和求积、日志函数中接受任意数量的消息片段、装饰器中透传参数等。我在写工具函数的时候经常用它比如一个批量处理函数def batch_process(*tasks): results [] for task in tasks: results.append(task()) return results4.2 **kwargs 与关键字参数的收集**kwargs收集的是任意数量的关键字参数打包成一个字典。def build_profile(**kwargs): print(f收到的参数: {kwargs}, 类型: {type(kwargs)}) for key, value in kwargs.items(): print(f {key} {value}) build_profile(name张三, age28, city杭州) # 收到的参数: {name: 张三, age: 28, city: 杭州}, 类型: class dict**kwargs在需要透传配置项、构建动态参数、编写装饰器时特别有用。比如一个通用的 API 请求函数def api_request(url, **options): headers options.get(headers, {}) timeout options.get(timeout, 30) retry options.get(retry, 3) # ... 发送请求的逻辑这样调用方可以只传自己关心的配置项函数内部按需读取扩展性很好。4.3 可变参数在函数签名中的位置规则*args和**kwargs在函数签名中的位置是有讲究的。标准顺序是位置参数、默认参数、*args、**kwargs。def full_signature(a, b2, *args, **kwargs): print(fa{a}, b{b}, args{args}, kwargs{kwargs}) full_signature(1, 3, 5, 7, name张三, age28) # a1, b3, args(5, 7), kwargs{name: 张三, age: 28}Python 在绑定参数时的优先级是先满足位置参数再满足默认参数多余的 positional 参数给*args所有的 keyword 参数给**kwargs。理解这个优先级才能在混用时预测参数会落到哪里。有一个容易忽略的细节*args后面的参数只能是关键字参数。比如def func(a, *args, b)中b必须用关键字方式传递不能靠位置传。这个特性在 Python 3 中才支持它强制调用方明确指定某些参数的值避免位置传参带来的歧义。5. 关键字参数让调用意图一目了然5.1 关键字参数的本质与调用方式关键字参数指的是在调用函数时通过参数名值的形式传递实参。它的本质是让调用方明确指定每个值对应哪个参数而不是靠位置去猜。def create_order(product, quantity, price, discount1.0): total quantity * price * discount return f{product}: {quantity}件, 总价{total:.2f} # 位置调用 create_order(笔记本, 2, 5999, 0.9) # 关键字调用 create_order(product笔记本, quantity2, price5999, discount0.9) # 混合调用位置参数在前关键字参数在后 create_order(笔记本, 2, price5999, discount0.9)关键字调用的最大好处是可读性。上面那个例子位置调用你得对着函数定义才能知道0.9是折扣而关键字调用一眼就能看明白。在参数较多或者参数类型容易混淆的场景下关键字调用几乎是必须的。5.2 强制关键字参数用 * 分隔符控制调用方式Python 3 引入了一个非常实用的语法在函数签名中用*作为分隔符它后面的参数必须用关键字方式传递。def transfer(source, target, *, amount, currencyCNY): print(f从{source}转账到{target}, 金额{amount} {currency}) # 正确调用 transfer(账户A, 账户B, amount1000) # 错误调用amount 必须用关键字 transfer(账户A, 账户B, 1000) # TypeError: transfer() takes 2 positional arguments but 3 were given这个设计的意图很明确对于金额、货币这种一旦传错就会造成严重后果的参数强制调用方写出参数名避免因为位置搞错而出问题。我在涉及资金、权限、删除操作等敏感逻辑的函数里都会用*把关键参数隔离出来强制关键字传递。5.3 位置参数与关键字参数的混用规则混用的时候有一条铁律位置参数必须写在关键字参数前面。下面这种写法会直接报语法错误# 错误写法 create_order(product笔记本, 2, 5999) # SyntaxError: positional argument follows keyword argumentPython 解释器在解析函数调用时一旦遇到关键字参数就认为后面的所有参数都必须是关键字形式。这个规则没有例外记住就行。另外还有一个容易搞混的点同一个参数不能既用位置传又用关键字传。create_order(笔记本, 2, product笔记本) # TypeError: create_order() got multiple values for argument product这种错误在参数多的时候特别容易犯尤其是复制粘贴代码之后忘了改。我的建议是要么全用位置要么全用关键字不要混着来。如果确实需要混用比如前几个参数含义明确、后面的参数需要指定名称也要保持清晰的规律。6. 参数顺序的完整规则与实战中的签名设计6.1 一张表理清所有参数类型的排列顺序Python 函数参数的完整定义顺序是这样的顺序参数类型示例说明1位置参数def f(a, b)必须传按位置绑定2默认参数def f(a, b1)可选传有默认值3可变位置参数def f(a, *args)收集多余的位置参数4强制关键字参数def f(a, *, b)必须用关键字传递5可变关键字参数def f(a, **kwargs)收集多余的关键字参数一个包含所有类型的完整签名长这样def complex_func(pos1, pos2, default110, *args, kw_only1, kw_only2hello, **kwargs): print(fpos1{pos1}, pos2{pos2}) print(fdefault1{default1}) print(fargs{args}) print(fkw_only1{kw_only1}, kw_only2{kw_only2}) print(fkwargs{kwargs}) complex_func(1, 2, 3, 4, 5, kw_only1必须传, extra1额外1, extra2额外2) # pos11, pos22 # default13 # args(4, 5) # kw_only1必须传, kw_only2hello # kwargs{extra1: 额外1, extra2: 额外2}这张表和这个例子建议收藏每次写复杂函数签名的时候对照着看能避免绝大多数顺序错误。6.2 参数解包调用时的 * 和 **定义函数时用*args和**kwargs是收集参数调用函数时用*和**则是解包参数。这两个方向的操作经常被混淆但理解了之后非常实用。def add(a, b, c): return a b c # 用 * 解包列表或元组 numbers [1, 2, 3] print(add(*numbers)) # 6 # 用 ** 解包字典 params {a: 1, b: 2, c: 3} print(add(**params)) # 6 # 混合使用 args [1] kwargs {b: 2, c: 3} print(add(*args, **kwargs)) # 6解包在实际项目中的典型应用场景是把配置字典直接展开传给函数、把列表数据展开作为参数、在装饰器中透传参数等。我经常用**config的方式把配置文件读出来的字典直接传给初始化函数代码非常干净。6.3 从实际项目出发的参数设计检查清单写了这么多年代码我总结了一套函数参数设计的自查清单每次写完一个稍微复杂点的函数就过一遍参数数量是否超过 5 个如果超过考虑是否应该封装成类或者用字典传参。是否有布尔类型的参数如果有强制用关键字传递避免True/False传反。默认参数是否使用了可变对象如果有立刻改成None。是否有容易混淆的参数对比如start/end、source/target如果有考虑用*强制关键字传递。函数签名是否能在不点进函数体的情况下看懂调用意图如果不能说明参数命名或设计有问题。这套清单看起来简单但真正执行起来能避免大量低级错误。尤其是第三和第四条我在 code review 的时候发现的问题里至少有三成跟这两条有关。7. 那些年我踩过的参数坑与排查实录7.1 默认参数累积问题的完整排查过程前面提到了默认参数用可变对象的坑这里展开讲一个我实际遇到的案例。某次写了一个缓存装饰器大概逻辑是这样def cache_result(func, cache{}): def wrapper(*args): if args not in cache: cache[args] func(*args) return cache[args] return wrapper单测的时候一切正常但上线之后发现不同用户的请求返回了相同的结果。排查过程大致是这样的先确认了函数逻辑没问题然后怀疑是并发问题加了锁之后依然复现。最后打印cache的id()才发现所有被装饰的函数共享了同一个字典对象——因为cache{}是默认参数在装饰器定义时就创建了所有函数共用这一个缓存。修复方式很简单def cache_result(func, cacheNone): if cache is None: cache {} def wrapper(*args): if args not in cache: cache[args] func(*args) return cache[args] return wrapper这个坑的隐蔽性在于单测的时候通常只测一个函数不会暴露共享问题只有多个函数同时使用装饰器时才会出问题。所以默认参数的可变对象问题一定要在 code review 阶段就拦住靠测试很难覆盖到。7.2 参数顺序错位导致的诡异 Bug另一个印象深刻的坑是参数顺序问题。有个函数签名是def send_notification(user_id, message, priority, channel)调用的时候写成了send_notification(user_id, message, sms, high)——把channel和priority传反了。结果就是所有高优先级的通知都发到了错误的渠道而且因为参数类型都是字符串Python 不会报错问题一直没被发现。后来我们的解决方案是对于这种容易混淆的参数全部改成强制关键字传递def send_notification(user_id, message, *, priority, channel): ...这样调用的时候必须写成send_notification(user_id, message, priorityhigh, channelsms)顺序就不再是问题了。虽然多打了几个字但换来的是不会出错。7.3 可变参数与默认参数混用时的绑定陷阱当*args和默认参数同时出现时参数的绑定规则会变得微妙。看这个例子def process(a, b10, *args): print(fa{a}, b{b}, args{args}) process(1) # a1, b10, args() process(1, 2) # a1, b2, args() process(1, 2, 3) # a1, b2, args(3,) process(1, 2, 3, 4) # a1, b2, args(3, 4)关键点在于b虽然有默认值但它仍然是一个位置参数。当你传第二个位置参数时它会优先绑定给b而不是进入args。如果你希望第二个位置参数直接进入args就必须用关键字方式给b传值或者调整参数顺序。这个规则在实际使用中很容易搞混。我的建议是如果函数同时需要默认参数和可变参数尽量把默认参数放在*args后面作为强制关键字参数这样绑定关系最清晰def process(a, *args, b10): print(fa{a}, b{b}, args{args}) process(1, 2, 3) # a1, b10, args(2, 3) process(1, 2, 3, b20) # a1, b20, args(2, 3)这样b永远不会抢走本该属于args的位置参数逻辑清晰很多。8. 把参数机制用对几个可以直接套用的设计模式8.1 用关键字参数替代布尔标志位这是我最想强调的一条实践经验。很多函数的签名里会出现def render(template, cacheTrue, debugFalse)这样的设计调用的时候写成render(index.html, True, False)过两天自己都忘了哪个是哪个。更好的做法是用*强制关键字传递def render(template, *, cacheTrue, debugFalse): ... render(index.html, cacheTrue, debugFalse)虽然多打了几个字但代码的可读性和可维护性提升了一个档次。而且这种写法还有一个额外好处将来如果新增参数不会影响已有的调用代码。8.2 用 **kwargs 做配置透传的边界控制**kwargs很强大但滥用会让函数签名失去自描述性。我的原则是只在确实需要透传未知参数时使用**kwargs并且要在函数内部做白名单校验。def create_client(host, port, **options): allowed {timeout, retry, verify_ssl} unknown set(options) - allowed if unknown: raise ValueError(f不支持的配置项: {unknown}) timeout options.get(timeout, 30) retry options.get(retry, 3) verify_ssl options.get(verify_ssl, True) ...这样做的好处是调用方传了错误的参数名会立刻报错而不是被静默忽略。我见过太多因为**kwargs静默吞掉拼写错误的参数名导致配置不生效、排查半天的案例。8.3 用位置参数 关键字参数组合出好用的 API一个好的函数签名应该做到常用的、含义明确的参数用位置传递不常用的、容易混淆的参数用关键字传递。比如def query_users(keyword, *, page1, page_size20, sort_bycreated_at, orderdesc): ...调用的时候query_users(张三)非常简洁需要分页或排序的时候再指定关键字参数。这种设计在 Web 开发、数据处理等场景中非常常见也是 Python 社区推荐的 API 设计风格。8.4 参数校验的时机与方式最后聊一下参数校验。Python 是动态类型语言函数不会自动检查参数类型所以关键参数的类型和范围校验必须手动做。我的习惯是在函数体开头集中做校验def divide(a, b): if not isinstance(a, (int, float)) or not isinstance(b, (int, float)): raise TypeError(a 和 b 必须是数字) if b 0: raise ValueError(除数不能为 0) return a / b校验的时机很重要尽量在函数入口处完成所有校验不要等到用到参数的时候才检查。这样能保证函数要么一开始就失败要么就完整执行不会出现执行到一半才报错、留下脏数据的情况。参数机制是 Python 函数设计的基础也是区分能写代码和会写代码的一个分水岭。把这四种参数类型搞清楚再结合强制关键字、参数解包、默认值陷阱这些细节你写出来的函数签名会清晰很多调用方用起来也舒服很多。我在实际项目里最深的体会就是花十分钟设计一个好的函数签名能省下后面十个小时的调试和沟通成本。

相关新闻

王道机试指南第二版:算法目录背后的考研复试提分逻辑

王道机试指南第二版:算法目录背后的考研复试提分逻辑

1. 这本《王道机试指南(第二版)》到底在解决什么问题?“算法目录”四个字看似平淡,但放在“王道机试指南”这个语境里,它根本不是一份简单的章节列表——它是一张被反复验证过的、通向研究生复试上机环节的生存地图。我…

2026/10/12 21:46:47 阅读更多 →
Spring Boot 集成 QRCodeWriter 实现高可靠二维码生成

Spring Boot 集成 QRCodeWriter 实现高可靠二维码生成

1. 为什么不用现成的二维码服务,而要自己写 QRCodeWriter?“Spring Boot 制作二维码”这个标题看起来平平无奇,但我在某高校实验室带学生做毕业设计时,连续三年都遇到同一个问题:学生一上来就去搜“Spring Boot 生成二…

2026/10/12 21:46:47 阅读更多 →
Mac 上 Anaconda 安装与使用全指南:环境管理与常见问题排查

Mac 上 Anaconda 安装与使用全指南:环境管理与常见问题排查

1. 为什么在 Mac 上还要认真对待 Anaconda很多人在 Mac 上第一次装 Python 环境,都是直接去官网下载一个 Python 安装包,然后pip install一路装下去。刚开始写几个小脚本没问题,等到要跑数据分析、机器学习、深度学习项目的时候,麻…

2026/10/12 21:46:47 阅读更多 →

最新新闻

第6章:Spring AI 2.0 ChatClient 门面

第6章:Spring AI 2.0 ChatClient 门面

上章思考题答案 用户原话里的 {orderId} 若放进 SystemPromptTemplate 再渲染,StringTemplate 会把它当成变量。缺这个键时,ValidationMode.THROW 抛 IllegalStateException,正常咨询被拒绝。用户原话应走 UserMessage 或 ChatClient.user&a…

2026/10/14 0:03:43 阅读更多 →
【车载定位】基于扩展卡尔曼滤波 EKF,分别利用 TDOA、AOA 以及 TDOA+AOA 融合观测,搭配近恒速 NCV / 近恒位置 NCP运动模型对车辆轨迹估计附Matlab代码

【车载定位】基于扩展卡尔曼滤波 EKF,分别利用 TDOA、AOA 以及 TDOA+AOA 融合观测,搭配近恒速 NCV / 近恒位置 NCP运动模型对车辆轨迹估计附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &…

2026/10/14 0:03:43 阅读更多 →
人工智能期末复习:用习题集构建考点地图,高效备考不挂科

人工智能期末复习:用习题集构建考点地图,高效备考不挂科

简介:这份资源汇集人工智能课程各章小结与经典习题解答,适合正在系统学习人工智能基础、准备期末考试的本科生或自学者使用。内容覆盖人工智能的概念与发展阶段、研究学派与研究领域、知识与知识表示(谓词逻辑、产生式规则、框架、语义网络&a…

2026/10/14 0:03:43 阅读更多 →
wandb-core 中的 Wire 依赖注入:从贡献指南到 go:generate 自动装配实战

wandb-core 中的 Wire 依赖注入:从贡献指南到 go:generate 自动装配实战

机器学习深度学习数据可视化可观测性 【免费下载链接】wandb The AI developer platform. Use Weights & Biases to train and fine-tune models, and manage models from experimentation to production. 项目地址: https://gitcode.com/gh_mirrors/wa/wandb 点…

2026/10/14 0:03:43 阅读更多 →
微博评论文本情感分析:从数据清洗到三模型对比的完整实践

微博评论文本情感分析:从数据清洗到三模型对比的完整实践

简介:面向毕业设计场景,资源围绕微博评论文本情感分析,完整覆盖支持向量机、朴素贝叶斯与AdaBoost三种机器学习算法的建模流程,适合计算机相关专业本科生用于课程设计或毕业设计参考。压缩包共70个文件,约6.05MB&#…

2026/10/14 0:03:43 阅读更多 →
小型超市仓库管理系统

小型超市仓库管理系统

小型超市仓库管理系统选题背景与意义 随着我国城镇化进程的不断推进以及居民消费水平的持续提升,小型超市作为连接城市社区与消费者的重要商业节点,在日常生活中的作用日益凸显。尤其是在一二线城市周边的居民区、城乡结合部及中小城镇,小型超…

2026/10/14 0:02:42 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →