Python迭代器深度解析:for循环、生成器与惰性求值
写Python代码这些年我见过太多人在for循环上栽跟头却很少有人真正停下来问一句for循环凭什么能遍历列表、字典、文件、甚至无限序列答案就是标题里这个看似不起眼的名词——Python迭代器Iterator。它不只是一个面试考点更是理解Python数据流处理的钥匙。这篇文章我会从for循环的底层执行讲起手写迭代器、拆解生成器、聊透惰性求值最后把实战里最容易踩的坑和排查方法一并整理出来。无论你是刚学Python不久的新手还是写了两三年代码想补基础的老手只要你想彻底搞懂“for循环背后到底发生了什么”这篇文章都能给你一个完整且能落地的答案。1. for循环启动前的“暗箱操作”迭代协议是怎么运转的1.1 从一条语句拆出的三步流程很多教程告诉你“for循环就是遍历元素”这个说法没错但它掩盖了真正的工作原理。你用for item in my_list:的时候Python解释器并不是简单地“一个个取出来”它做的事情其实可以拆成三步调用iter(my_list)拿到一个迭代器对象。反复调用这个迭代器对象的__next__()方法每次取一个元素。当__next__()抛出StopIteration异常时循环捕获这个异常安静地结束。我当年第一次看到这个解释的时候心里想的是这不就是把简单问题复杂化吗直到后来有一次处理一个几千万行的日志文件按行读取时内存直接爆炸我才明白这套“多此一举”的设计恰恰是Python能处理大数据流的核心。你可以自己在交互式环境里体验一下这个流程my_list [10, 20, 30] it iter(my_list) print(next(it)) # 10 print(next(it)) # 20 print(next(it)) # 30 print(next(it)) # 抛异常 StopIteration看清楚列表本身不是迭代器它只是一个可迭代对象真正的迭代器是iter(my_list)返回的那个东西。循环体内每执行一次next()就会被调用一次直到异常出现。这个“用异常来控制结束”的设计初看反直觉但其实非常优雅——它让迭代器协议变得极其简单任何对象只要实现好__next__就能被for无缝驱动。1.2 iter()与next()两个函数撑起整个流程iter()和next()是理解整个迭代器体系的两个入口。先说iter()它的作用就是“给我一个迭代器”。如果传入的是序列列表、元组、字符串它会返回一个“序列迭代器”如果传入的是实现了__iter__()的对象它会调用__iter__()并返回其结果如果你传的是一个老式的、只实现了__getitem__()的对象它还会退而求其次创建一个按索引顺序访问的迭代器。next()就更直接了它等价于调用iterator.__next__()。每调用一次迭代器就“吐出”下一个值同时内部状态往前推进。这里最需要记住的一点是迭代器是有状态的而且这个状态是单向的不能回退。你取走了第三个元素就不可能再回头拿第二个除非你重新创建一个迭代器。说句题外话很多从别的语言转来的朋友会问为什么不能用下标直接访问非要搞迭代器因为下标访问的前提是“数据在内存里、有固定长度”而迭代器的设计目标是“不知道长度、甚至没有长度也能一个个生产出来”。斐波那契数列、传感器数据流、网络分页请求这些场景根本没有办法用下标去做只能用迭代器逐次拉取。2. 可迭代对象和迭代器不是一回事这是很多人写错代码的根源2.1 一份清单帮你分清楚我复盘过团队里不少同事的代码发现问题最多的就是对“可迭代对象”和“迭代器”的混淆。网上很多文章把两者混着说导致很多人以为“列表是迭代器”结果在代码里写出各种奇怪的问题。用一句话分清可迭代对象是“能产出迭代器的东西”迭代器是“真正逐个吐值的东西”。对比维度可迭代对象Iterable迭代器Iterator判断方式实现了__iter__()或__getitem__()实现了__iter__()和__next__()是否有next()方法通常没有必须有能否重复遍历能每次iter()产生全新迭代器不能迭代完就耗尽典型例子列表、字典、字符串、集合文件对象、iter(列表)的返回值、生成器能否用for可以for会自动调用iter()可以同样也是先调iter()想要在代码里验证一个对象到底是哪一类最直接的办法是用isinstance()配合collections.abc里的抽象基类from collections.abc import Iterable, Iterator my_list [1, 2, 3] print(isinstance(my_list, Iterable)) # True print(isinstance(my_list, Iterator)) # False it iter(my_list) print(isinstance(it, Iterable)) # True print(isinstance(it, Iterator)) # True注意观察迭代器一定是可迭代对象因为迭代器自己实现了__iter__()并且__iter__()返回的是自己。这保证了迭代器也能被for使用。但反过来不成立列表是Iterable但不是Iterator。这个关系你最好刻进脑子里后面排查各种诡异问题都要靠它。2.2 为什么同一个列表可以多次for而迭代器不行有个很经典的实验同一个列表可以连续for两遍但同一个迭代器for完第一遍之后第二遍什么都拿不到。my_list [1, 2, 3] for x in my_list: print(x) # 1 2 3 for x in my_list: print(x) # 1 2 3 正常 it iter(my_list) for x in it: print(x) # 1 2 3 for x in it: print(x) # 什么都不会输出原因就是前面说的列表作为可迭代对象每次被for时都会调用iter(my_list)生成一个全新的迭代器所以每次都能从头开始而it自己已经是迭代器了for循环对它调用iter(it)时它返回的是自己本身内部指针已经走到了末尾自然没有任何值可以再吐。我见过不止一个同事把迭代器保存下来想在多处复用结果第二次一跑发现数据全没了第一反应是“数据被消费了”。对数据确实是被消费了这恰恰体现了迭代器的“流”特性它像一根吸管你吸完了就没了想再喝只能换一根新的吸管。3. 手写一个迭代器自定义类的完整实操3.1 最简迭代器模板理解了协议手写迭代器其实非常机械。你需要做的就是在类里面实现两个方法__iter__()和__next__()。__iter__()负责返回迭代器本身__next__()负责产生下一个值并且在没有值可给的时候抛出StopIteration。下面是一个倒计时的迭代器从指定数字倒数到0class Countdown: def __init__(self, start): self.current start def __iter__(self): return self def __next__(self): if self.current 0: raise StopIteration value self.current self.current - 1 return value for num in Countdown(5): print(num) # 5 4 3 2 1 0这里有几个关键点要说明白第一__iter__只是返回self这意味着这个类本身既是可迭代对象也是迭代器。这种写法在简单场景里没有问题但如果你希望同一个对象能被多次遍历就不能这么干应该把__iter__里返回一个新的独立迭代器。第二状态变量这里的self.current是迭代器的灵魂。每次调用__next__都必须更新状态否则会陷入死循环。我见过有人把状态写成了局部变量每次调用都从初始值开始结果永远吐同样的值。第三StopIteration不能省。for循环就是靠这个异常来终止的如果迭代器永远不抛for循环就会一直跑下去。3.2 迭代器在真实业务里的三个场景光会写模板没用得知道往哪里用。我根据自己的实战经验总结了三个最常见的业务场景。第一个场景是分页遍历。比如对接第三方接口拿数据对方一次只给一页每页100条。你不用迭代器的时候得写个下标记录当前页数然后拼命维护那个下标用迭代器状态收敛在对象内部代码干净得多。class PaginatedAPI: def __init__(self, api_client, page_size100): self.client api_client self.page_size page_size self.page 1 self.buffer [] self.index 0 self.done False def __iter__(self): return self def __next__(self): if self.index len(self.buffer): if self.done: raise StopIteration self.buffer self.client.fetch_page(self.page, self.page_size) self.page 1 self.index 0 if not self.buffer: self.done True raise StopIteration item self.buffer[self.index] self.index 1 return item第二个场景是树结构遍历。做目录扫描、解析嵌套评论、遍历组织架构这些都是典型的树形数据。用递归当然可以但递归对深度很敏感层级一深容易爆栈。把迭代器写成显式栈驱动的形式既能保持代码清晰又不用太担心递归深度问题。第三个场景是自定义数据源的懒加载。比如你有一个极大的CSV文件但只想逐行处理不想一次性读进内存。虽然直接用文件对象本身就够了但如果你要在这个基础上做清洗、转换、过滤包一层迭代器是非常自然的选择。4. 生成器更省事的迭代器实现路径4.1 yield怎么改写了执行流程手写类的方式实现了迭代器但说实话代码量还是有点大。Python提供了一个更轻量的方案就是生成器。只要函数里出现yield关键字这个函数就不再是普通函数而变成生成器函数。调用它时函数体不会立即执行而是返回一个生成器对象——生成器就是一种迭代器。def countdown(start): current start while current 0: yield current current - 1 for num in countdown(5): print(num)这个和上面用类写的Countdown效果一模一样但代码短了很多。关键在于理解yield的执行语义每次执行到yield函数就会暂停把当前值抛给调用方下次再被next()驱动时它会从暂停的位置继续往下执行。有一次我给新同事讲这个他说这就像游戏存档yield是存档点执行到那里就保存现场退出来下次继续从存档点开始打。这个比喻我非常喜欢因为yield不仅仅是把值交出去它还把整个局部变量、执行位置都保存了下来。这份“现场保存”能力是普通函数完全不具备的。4.2 生成器表达式与惰性求值带来的收益除了生成器函数Python里还有生成器表达式写法跟列表推导式几乎一样只是把方括号换成圆括号squares_gen (x * x for x in range(10)) print(squares_gen) # generator object genexpr at 0x...生成器表达式并不会立刻算出所有元素它只是定义了一个计算规则真正的计算发生在你遍历它的那一刻。这就是惰性求值。惰性求值带来的最大收益就是内存占用低处理一亿个数的时候列表推导式会试图把一亿个元素全部装进内存而生成器表达式一次只算一个。我在处理数据清洗时经常这么写先用一个生成器做过滤再用另一个做字段转换最后再交给下游统计。中间没有任何一步产生大列表。data (raw for raw in load_all_records()) cleaned (normalize(r) for r in data if r is not None) stats compute_stats(cleaned)这串代码看起来很普通但数据量一旦上来它的内存优势就会体现得极其明显。我之前处理一份5GB的CSV如果每个步骤都转成列表内存直接飙到十几GB机器当场卡死全部改用生成器之后内存占用稳定在几百MB以内跑起来非常顺畅。5. 常见问题排查与避坑经验5.1 迭代器“一次用完”的救场方案前面提到的“迭代器耗尽了”是出现频率最高的问题。一旦迭代器走到头再想遍历就什么都没有。这个问题怎么救我总结了三种方案按场景选。如果你只是需要把迭代器的结果存下来复用最直接的办法是用list()把它整个转成列表。但要注意这会一次性把所有元素加载进内存如果元素量很大又会回到内存爆炸的老路上去。如果你需要反复遍历同一个生成器产生的结果但数据量又大到不能装进列表有两个思路一是改造生成器函数让每次调用它都返回一个新生成器二是用itertools.tee()把迭代器复制成几个独立副本。from itertools import tee it iter([1, 2, 3, 4, 5]) it1, it2 tee(it, 2) print(list(it1)) # [1, 2, 3, 4, 5] print(list(it2)) # [1, 2, 3, 4, 5]这里必须提醒一句tee()也不是魔法它的实现原理是内部缓存已消费的元素如果两个副本前进的距离相差很大缓存的数据量也会相应增大。所以它适合“两条线同时推进”的场景不适合“一个跑完再跑另一个且数据量巨大”的场景。5.2 for循环中修改容器到底安全吗这个问题几乎每个项目里都会遇到。在for循环遍历列表的同时如果直接append或remove程序不会报错但结果往往非常诡异。我以前排查过一个bug遍历列表时把所有偶数删掉结果发现某些偶数还在列表里。numbers [1, 2, 3, 4, 5, 6] for num in numbers: if num % 2 0: numbers.remove(num) print(numbers) # [1, 3, 5, 6] 6没被删掉原因是for循环内部维护了一个递增的下标。删除元素会导致后面的元素往前挪但循环的下标不受影响于是跳过了原本紧跟在被删元素后面的那个元素。这不是迭代器的问题而是“修改容器会把迭代过程搞乱”的典型表现。安全的做法是要么遍历原列表的副本for num in numbers[:]要么遍历的时候只记录要删的索引循环结束后再统一处理要么直接改用列表推导式生成新列表。个人习惯是“能不原地修改就绝不原地修改”新开一个列表存储结果代码可读性和安全性都更好。5.3 排查清单速查表我把这些年调试迭代器相关问题总结成一张速查表遇到问题可以先对照一下现象可能原因解决办法同一个迭代器第二次遍历没数据迭代器是一次性消费的重新用iter()生成新迭代器或用itertools.tee()自定义类直接for时报“not iterable”没实现__iter__()或__getitem__()补上__iter__()返回自身或独立迭代器for循环中间改列表结果错乱循环中直接增删元素改变了迭代下标遍历副本或先记录后统一修改生成的迭代器用next()取不到值状态变量没有初始化或没有更新检查__init__里的状态初始值和__next__里的状态推进代码卡在while里出不来__next__()没抛出StopIteration确保耗尽时抛出StopIteration生成器只执行了第一行代码生成器是惰性的调用函数不会执行函数体用next()或for驱动它执行一眼可见的无限迭代器直接list()卡死list()会一直消费到StopIteration用itertools.islice()限量截取这张表里我标出的最后一条尤其值得注意。很多新手看到生成器可以无限产生值就忍不住拿list()去看一眼结果然后程序就彻底卡死了。正确的姿势是用islice或者takewhile这类工具来配合。from itertools import islice def fibonacci(): a, b 0, 1 while True: yield a a, b b, a b fib fibonacci() first_ten list(islice(fib, 10)) print(first_ten) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]6. 文件对象和itertools迭代器实战的两把趁手工具6.1 文件对象就是最典型的迭代器说了这么多抽象的东西我举一个最贴近日常的例子文件对象。Python里打开文件后返回的文件对象本身就是迭代器。这意味着你可以直接for line in file:逐行读取而不必用readlines()一次性把所有行读进内存。with open(huge_log.txt, r, encodingutf-8) as f: for line in f: process(line)这个写法在处理几百MB甚至几GB的日志文件时内存占用几乎可以忽略不计。相反如果你用readlines()文件有多大内存基本就得吃多大我之前处理几个G的日志时就这样炸过一次所以现在只要遇到“大文件”我脑子的第一反应就是“迭代器逐行处理别贪图方便一次性读完”。6.2 itertools里的高频迭代工具itertools是我在真实项目中反复使用的标准库模块它提供的工具函数全部围绕迭代器设计配合起来能省下大量代码。我挑几个高频的分享。chain()可以把多个迭代器串联成一个。比如你要同时扫描多个日志文件把它们当作一个整体来处理直接用chain(file1, file2, file3)就可以了不用手动写循环拼接。zip()配套的zip_longest()解决的是长度不等时的合并问题。用普通zip()短的耗尽了就结束用zip_longest()可以补默认值继续合并。groupby()可以对排好序的迭代器做分组。我之前做埋点日志分析时按用户ID分组统计行为序列groupby()比手动维护字典分组方便太多。注意它要求数据是有序的相同键必须连续出现否则分组效果会出乎意料。cycle()会无限循环地遍历一个可迭代对象。做轮询调度的时候很好用比如三个后端服务轮流接请求next(cycle([svr-a, svr-b, svr-c]))就能拿到下一个服务名。这些工具的共性是它们接收迭代器返回新的迭代器全程惰性求值。用它们组合出来的数据处理管线既清晰又不吃内存是非常值得花时间掌握的技巧。7. 迭代器协议在源码和日常编码里的扩展联想7.1 一个自定义可迭代类的完整示范为了让你能在实际项目里直接用起来我给出一个稍微完整一点的示范自定义一个页游玩家战力排行榜的迭代器既能支持for遍历又能支持len()之类的常见操作。class Leaderboard: def __init__(self, players): self._players sorted(players, keylambda x: x[score], reverseTrue) def __iter__(self): return iter(self._players) def __len__(self): return len(self._players) players [ {name: A同学, score: 3200}, {name: B同学, score: 4100}, {name: C同学, score: 2800}, ] board Leaderboard(players) for player in board: print(player[name], player[score]) # B同学 4100 # A同学 3200 # C同学 2800注意这里__iter__返回的是iter(self._players)而不是self这样的设计让排行榜对象可以被重复遍历多次。每次for都会基于底层的列表生成一个新迭代器。这个思路可以套用到很多业务对象上订单列表、任务队列、消息分页结果只要你想让它“既像容器一样能反复遍历又想在遍历的时候做点格式化或过滤”就可以往这个模板上靠。7.2 从迭代器到数据管线的思维转换掌握了迭代器之后写代码会有一个非常明显的变化习惯用“管线”的思考方式取代“直接操作容器”。以前处理数据我总是先构造一个大列表然后写for循环逐个处理最后再存结果现在我会思考每一步应该产生什么流怎么用生成器和itertools把步骤串起来。这个思维转换并不复杂但要提醒一点不是所有地方都适合用迭代器。如果你的数据量不大而且需要反复随机访问直接用列表反而更简单没必要为了“用迭代器”而用迭代器。追求代码的可读性和可维护性永远比追求某种“高级写法”更重要。我在实际项目中见过太多为了炫技而上迭代器的代码明明一个列表就能解决问题非要套三层生成器表达式最后别人根本看不懂。好的迭代器代码应该是逻辑清晰、内存可控、可复用而不是越花哨越好。我自己这些年写下来最大的体会是Python的迭代器协议并不复杂但它是一层底色铺在for循环、生成器、文件读取、itertools工具链的下面。一旦理解了这层底色再看很多标准库的源码、第三方库的API设计都会有豁然开朗的感觉。以后你再写for循环不妨多想一步这一步背后是iter()和next()在替你打工而你自己也已经可以随时成为一个能写迭代器的人了。

相关新闻

AB与西门子PLC以太网直连:零硬件协议桥接实战

AB与西门子PLC以太网直连:零硬件协议桥接实战

简介:本资源是一份面向工业自动化工程师与PLC系统集成人员的实操型技术指南,聚焦罗克韦尔(AB)Compact系列与西门子S7-1500 PLC之间跨品牌以太网通讯的落地实现,解决多厂商设备互联难、编程开发成本高的工程痛点。全文以…

2026/10/15 7:19:55 阅读更多 →
Delphi7下的FastReport 5.3.13报表二维码开发实战解析

Delphi7下的FastReport 5.3.13报表二维码开发实战解析

简介:FastReport Vcl 5.3.13 for Delphi 7 是面向 Delphi 7 开发者的报表生成组件,主要解决老项目与既有业务系统中集成现代报表、并快速生成含二维码标签的复杂打印需求。该版本在传统表格、图表、图像与文本混排基础上,新增二维码生成与显示…

2026/10/15 7:19:55 阅读更多 →
罗克韦尔与西门子PLC以太网直连实战:CIP+S7comm+协议互通方案

罗克韦尔与西门子PLC以太网直连实战:CIP+S7comm+协议互通方案

简介:本资源是一份面向工业自动化工程师与PLC系统集成人员的实操型技术指南,聚焦罗克韦尔(AB)Compact系列与西门子S7-1500 PLC之间跨品牌以太网通讯的落地实现,解决多厂商设备互联难、编程开发成本高的工程痛点。全文以…

2026/10/15 7:19:55 阅读更多 →

最新新闻

DeepSeek从入门到精通:模型选型、Prompt设计、API与本地部署避坑

DeepSeek从入门到精通:模型选型、Prompt设计、API与本地部署避坑

简介:这份《DeepSeek:从入门到精通》由清华大学新闻与传播学院新媒体研究中心团队出品,面向大模型爱好者、开发者及企业AI应用人员。教程系统梳理DeepSeek是什么、能做什么以及如何使用,重点对比推理模型与通用模型在数学推导、代…

2026/10/15 7:53:02 阅读更多 →
AnyPS5:基于Electron与SQLite的PS5本地游戏库管理工具实战

AnyPS5:基于Electron与SQLite的PS5本地游戏库管理工具实战

直接分享一个我最近折腾完的小项目吧——AnyPS5。这名字看着像模拟器,其实不是,它是一个纯本地的PS5游戏库管理工具。起因也很简单:自己的PS5游戏越堆越多,光盘、数字版、会免、试玩版混在一起,官方界面的筛选和归类能…

2026/10/15 7:53:02 阅读更多 →
腾米厨电技术创新:多级油烟分离与智能清洁解析

腾米厨电技术创新:多级油烟分离与智能清洁解析

1. 腾米厨电的市场定位与产品理念腾米厨电作为新兴厨房电器品牌,其核心定位是"以技术创新重构厨房清洁体验"。在当前厨房电器同质化严重的市场环境下,腾米选择从"洁净"这一细分场景切入,通过差异化的产品设计和技术方案&…

2026/10/15 7:53:02 阅读更多 →
CAD二次开发之Hatch填充:从对象模型到批量面积统计

CAD二次开发之Hatch填充:从对象模型到批量面积统计

做CAD二次开发的人,早晚都会跟填充(Hatch)打交道。哪怕你专职写图框、写标注、写块属性,也总有那么一天,用户会甩给你一句:能不能把这些封闭区域全部填上剖面线?能不能把每块填充的面积自动统计…

2026/10/15 7:53:02 阅读更多 →
双线性插值原理与Python实现:图像缩放的核心算法详解

双线性插值原理与Python实现:图像缩放的核心算法详解

简介:面向图像处理、计算机图形学和数值计算初学者,这份用C语言完成的双线性插值实现,以四个已知顶点构造四边形内插值函数的基本思路为主线,把数学公式拆解为可运行的工程代码,特别适合想搞懂λx、λy权重计算并动手编…

2026/10/15 7:53:02 阅读更多 →
低延迟趋势线LLT:从EMA到二阶滤波的交易择时Python实现

低延迟趋势线LLT:从EMA到二阶滤波的交易择时Python实现

简介:广发证券发布的《低延迟趋势线与交易择时》金融工程专题报告,面向技术分析者、量化策略研究员与短线交易者,针对传统移动平均线(MA)平滑性与延迟性难以兼顾的痛点,系统介绍低延迟趋势线(LL…

2026/10/15 7:52:01 阅读更多 →

日新闻

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 阅读更多 →