-
我写了个用 yield return 返回过滤结果的 C# 方法、在方法开头加了参数为空就抛异常的校验,调用处也老老实实包了 try-catch,结果传 null 进去那个异常死活没被 catch 住一路飞到最外层,盯着代码看半天才反应过来整个方法体压根没在调用那一刻执行的深度复盘
我写了个 C# 方法,接收一个集合和阈值、用 yield return 逐个吐出大于阈值的元素,很注意防御地在方法第一行就校验:集合为 null 就抛 ArgumentNullException,调用方也规规矩矩把调用包在 try-catch 里准备优雅降级。可上线后一个 null 传进来程序直接崩了:异常确实抛了,却没被那个明明包着调用的 try-catch 接住,而是穿过它一路冒泡到最顶层。我…- 0
- 0
-
一个生成器我先遍历了一遍算总数、再遍历一遍做处理,结果第二遍啥也没有、处理了零条数据:一次 Python 迭代器只能消费一次、把一次性的流当成可反复遍历的列表的深度复盘
我写脚本批量处理数据,逻辑很直白——先遍历一遍算出总共多少条打印进度,再遍历一遍真正处理每一条。本地测着没问题,上线处理大数据日志却显示共 0 条待处理、一条都没处理。打印那个变量才看清:它不是 list,而是个生成器(迭代器);迭代器只能消费一次,第一遍 sum 算总数时就把它的游标走到了尽头、消费光了,第二遍遍历时它已经空了。这篇复盘从故障现场讲到迭代器为什么只能消费一次、它和列表的本质区别(…- 0
- 0
-
我先用生成器算了个总数,再想遍历它处理数据,结果第二次遍历竟然一个元素都没有,我对着 Python 生成器只能迭代一次、用完就耗尽这个坑排查了大半天的复盘
一个让我对 Python 生成器到底是什么彻底搞明白的坑,诡异在我拿着同一个变量第一次遍历它好好的有一堆数据、第二次遍历它却空空如也一个元素都没有,就好像数据被偷偷搬空了。要先统计一批数据总数再逐个处理,用了生成器既省内存又优雅:data = (x for x in source if x.is_valid);count = sum(1 for _ in data) 算出 100 条;然后 for…- 2
- 0
-
迭代器模式完全指南:从 for-each 到 Stream / Generator 的现代演化
迭代器模式是 23 个 GoF 模式里最"成功"的一个 —— 成功到几乎所有现代语言都把它内置进语法:Java 的 for-each、Python 的 for x in、JS 的 for...of、C# 的 foreach、Rust 的 iter()。这背后都是迭代器模式。但内置归内置,什么时候要自己实现迭代器、惰性求值的代价、流式处理的边界,这些工程问题没那么显然。这篇文章把…- 2
- 0
-
Python 生成器从入门到精通:yield、迭代器协议与惰性求值
很多人写了几年 Python,对 yield 的认识还停留在"它能让函数返回多个值"。这个理解不算错,但太浅,浅到没法解释这些问题:为什么 yield 的函数调用后不执行?为什么生成器只能遍历一次?生成器和迭代器到底什么关系?yield from 又是什么?这篇文章把生成器、迭代器协议、惰性求值这三件事一次讲透,并给出能直接用在生产代码里的模式。 从迭代器协议说起 要理解生成器…- 0
- 0
惰性求值
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!





