Python教程23:迭代器(Iterator)

Python教程23:迭代器(Iterator) “万变不离其宗。” 我们已经用过很多次for循环,但你知道它背后的机制吗?今天我们学习迭代器(Iterator)——Python迭代的核心协议。 1. 什么是迭代器 可迭代对象vs迭代器 可迭代对象(Iterable): 可以用for循环遍历的对象 实现了__iter__()方法 例如:列表、元组、字典、字符串、生成器 迭代器(Iterator): 实现了__iter__()和__next__()方法的对象 可以被next()函数调用 记住当前位置,可以逐个返回元素 关系: 所有迭代器都是可迭代对象 但不是所有可迭代对象都是迭代器 可迭代对象调用iter()得到迭代器 1# 列表是可迭代对象,但不是迭代器 2my_list = [1, 2, 3] 3print(hasattr(my_list, '__iter__')) # True 4print(hasattr(my_list, '__next__')) # False 5 6# 获取迭代器 7iterator = iter(my_list) 8print(hasattr(iterator, '__iter__')) # True 9print(hasattr(iterator, '__next__')) # True 10 11# 使用迭代器 12print(next(iterator)) # 1 13print(next(iterator)) # 2 14print(next(iterator)) # 3 15# print(next(iterator)) # StopIteration 2. 迭代器协议 Python的迭代器协议包含两个方法: iter() 返回迭代器对象本身: 1class MyIterator: 2 def __iter__(self): 3 return self # 返回自己 作用: 让对象可以用于for循环 让对象可以调用iter() next() 返回下一个元素,没有元素时抛出StopIteration: 1class MyIterator: 2 def __next__(self): 3 # 返回下一个元素 4 # 或抛出StopIteration 5 pass 3. for循环的工作原理 for循环实际上是迭代器协议的语法糖: ...

2024-10-27 · 4 min · 797 words · 老墨

Rust 学习笔记 04:控制流程

Rust 学习笔记 04:控制流程 “Controlling complexity is the essence of computer programming.” – Brian Kernighan 写控制流程(条件判断、循环)是程序员每天都在做的事。 对于 Go 开发者来说,我们习惯了 if err != nil 和万能的 for 循环。 但在 Rust 里,控制流程被注入了"表达式"的灵魂,变得更加灵活(也更骚)。 1. if 表达式 注意标题:是 if 表达式,不是 if 语句。这意味着 if 结构本身可以产生一个值。 基础用法 和 Go 一样,Rust 的 if 条件不需要括号 (),但执行体必须用大括号 {}。 1let number = 3; 2if number < 5 { 3 println!("condition was true"); 4} else { 5 println!("condition was false"); 6} 作为表达式赋值 这是 Go 做不到的。因为 if 是表达式,我们可以把它放在 let 语句的右边。这完全替代了 Java/C++ 中的三元运算符 ? :。 ...

2024-06-15 · 2 min · 307 words · 老墨