迭代器

迭代器,生成器,装饰器

断了今生、忘了曾经 提交于 2020-03-03 02:02:25
1.1迭代器 1.2生成器 1.3装饰器 迭代器 1. 迭代器定义 迭代是Python最强大的功能之一,是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组对象都可用于创建迭代器: 2.可迭代对象 : 在Python世界里,一切皆对象。对象根据定义的维度,又可以分为各种不同的类型,比如:文件对象,字符串对象,列表对象。。。等等。 一句话:“实现了__iter__方法的对象就叫做可迭代对象”,__iter__方法的作用就是返回一个迭代器对象。 直观理解就是能用for循环进行迭代的对象就是可迭代对象。比如:字符串,列表,元祖,字典,集合等等,都是可迭代对象。 3.next()与iter(): next()返回迭代器的下一个项目 next语法: next(iterator[,dafault]) iterator – 可迭代对象 default – 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。 4.iter()函数用来生成迭代器 # 迭代器实现斐波那契数列 class Fib ( ) : def __init__ ( self , n )

Python函数-4 迭代器

♀尐吖头ヾ 提交于 2020-03-02 19:38:22
迭代器 在介绍迭代器之前,先说明下迭代的概念: 迭代:通过for循环遍历对象的每一个元素的过程。 Python的for语法功能非常强大,可以遍历任何可迭代的对象。 在Python中,list/tuple/string/dict/set/bytes都是可以迭代的数据类型。 可以通过collections模块的Iterable类型来判断一个对象是否可迭代: from collections import Iterable isinstance('abc', Iterable) # str是否可迭代 True isinstance([1,2,3], Iterable) # list是否可迭代 True isinstance(123, Iterable) # 整数是否可迭代 False 迭代器 迭代器是一种可以被遍历的对象,并且能作用于next()函数。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往后遍历不能回溯,不像列表,你随时可以取后面的数据,也可以返回头取前面的数据。迭代器通常要实现两个基本的方法:iter() 和 next()。 字符串,列表或元组对象,甚至自定义对象都可用于创建迭代器: from collections import Iterable,Iterator print(isinstance([],Iterable)) 是否可迭代

C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield

对着背影说爱祢 提交于 2020-03-02 02:57:58
IEnumerable / IEnumerator 首先,IEnumerable / IEnumerator 接口定义如下: public interface IEnumerable /// 可枚举接口 { IEnumerator GetEnumerator(); } public interface IEnumerator /// 枚举器接口 { object Current { get; } bool MoveNext(); void Reset(); } 注 :Current 没有 set 方法,在 foreach 中不能修改元素 var item 的值。 IEnumerable:声明式的接口,声明实现了该接口的类是可枚举类型; IEnumerator:实现式的接口,IEnumerator 对象说明如何实现一个枚举器; 通过继承 IEnumerable / IEnumerator 接口实现自定义类使用 foreach 语句来遍历自身元素。逻辑关系图: People <-> MyClass 实现 IEnumerable 接口的 GetEnumerator()方法 EnumeratorPeople <-> MyEnumerator 实现 IEnumerator 接口 定义Person类 public class Person {  private string name;

C++基础:(STL)8.1:STL简介

℡╲_俬逩灬. 提交于 2020-03-01 17:31:58
文章目录 0\. 背景 1.STL是什么? 2.STL与C++标准库的关系 3.版本 (***)1\. STL 的组成 2\. 容器分类 3. 迭代器 4\. 适配器分类 5\. 算法分类 6\. 函数对象分类 7\. 分配器 0. 背景 1.STL是什么? STL(Standard Template Library)标准模板库的英文缩写,包含有计算机科学领域常用的基本数据结构和基本算法。 2.STL与C++标准库的关系 3.版本 No. 版本 作者 是否开源 特点 1 HP STL [美]Alexandar Stepanov/[美]Meng Lee 是 第一个实现版本 2 SGI STL [美]Alexandar Stepanov 是 GCC使用版本,源码可读性高 3 STLport [俄]Boris Fomitchev 是 适用于VC++和C++ Builder等多种编译器,跨平台可移植 4 P.J.Plauger STL [美]P.J.Plauger 否 Visual C++使用版本,性能教高 5 Rouge Wave STL Rouge Wave公司 否 Borland C++ 5.0-使用版本 参考:《STL源码剖析》侯捷 (***)1. STL 的组成 STL Components No. Component 部件 作用 1 Container 容器 存储数据 2

学习QT之容器类

断了今生、忘了曾经 提交于 2020-03-01 12:27:17
学习QT之容器类 Qt提供了一组通用的基于模板的容器类。对比C++的标准模板库中的容器类,Qt的这些容器更轻量、更安全并且更容易使用。此外,Qt的容器类在速度、内存消耗和内联(inline)代码等方面进行了优化(较少的内联代码将说件可执行程序的大小)。 存储在Qt容器中的数据必须是可赋值的数据类型,也就是说,这种数据类型必须提供一个默认的构造函数、一个复制构造函数和一个赋值操作运算符。 这样的数据类型包含了通常使用的大多数数据类型,包括基本数据类型(如int和double等)和Qt的一些数据类型(如QString、QDate和QTime等)。不过,Qt的QObject及其他的子类(如QWidget和QDialog等)是不能存储在容器中的,例如: QList list; ,一个可代替的方案是存储QObject及其子类的指针,例如:QList<QToolBar *> list。容器也可以嵌套使用,例如:QHash<QString,QList >; 注意容器类嵌套时后面的 > 之间 一定要加一个空格 ,否则,C++编译器会将两个 > 符号解释为 >> ,导致无法通过编译器编译。 一、QList类、QLinkedList类和QVector类 1、QList类 QList是迄今为止最常用的容器类,它存储给定数据类型T的一列数值。继承自QList类的子类有QItemSelection

PHP协程入门详解

╄→尐↘猪︶ㄣ 提交于 2020-03-01 03:56:54
概念 咱们知道多进程和多线程是实现并发的有效方式。但多进程的上下文切换资源开销太大;多线程开销相比要小很多,也是现在主流的做法,但其的控制权在内核,从而使用户(程序员)失去了对代码的控制,而且线程的上下文切换也是有一定开销的。 这时为了解决以上问题,"协程"(coroutine)的概念就产生了。你可以将协程理解为更轻量级的线程。这种线程叫做“用户空间线程“。协程,有下面两个特点: 协同。因为是由程序员自己写的调度策略,其通过协作而不是抢占来进行切换 在用户态完成创建,切换和销毁 PHP对协程的支持是在 迭代生成器 的基础上, 增加了可以回送数据给生成器的功能(调用者发送数据给被调用的生成器函数)。 这就把生成器到调用者的单向通信转变为两者之间的双向通信。 迭代器 迭代器的概念这里就不赘述了。下面看看我们自己实现的一个迭代器。 class MyIterator implements Iterator { private $var = array(); public function __construct($array) { if (is_array($array)) { $this->var = $array; } } public function rewind() { // 第一次迭代时候会执行(或调用该方法的时候),后面的迭代将不会执行。 echo "rewinding\n"

php的迭代器

笑着哭i 提交于 2020-03-01 03:26:50
PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT ,否则就是ZEND_ITER_PLAIN_OBJECT. 对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach. 而对于ZEND_ITER_OBJECT的类对象, 则会通过调用对象实现的Iterator接口相关函数来进行foreach。 /** * @author 简明现代魔法 http://www.nowamagic.net */ class MyIterator implements Iterator { private $var = array(); public function __construct($array) { if (is_array($array)) { $this->var = $array; } } public function rewind() { echo "倒回第一个元素\n"; reset($this->var); } public function current() { $var = current($this->var); echo "当前元素: $var\n"; return

php-SPL库迭代器类

本小妞迷上赌 提交于 2020-03-01 03:02:33
SPL提供了多个迭代器类,分别提供了迭代访问、过滤数据、缓存结果、控制分页等功能。,因为php总是在不断壮大,我尽可能列出SPL中所有的迭代类。下面其中一些迭代器类是需要php5.4,另外一些如SearhIteratoer类在最新的php版本中已经去除 1.ArrayIteratoer 从PHP数组创建一个迭代器,当其和IteratorAggregate类一起使用时,免去了直接实现Iterator接口的方法的工作。 <示例> $b = array( 'name'=> 'mengzhi', 'age' => '12', 'city'=> 'shanghai' ); $a = new ArrayIterator($b); $a->append(array( 'home' => 'china', 'work' => 'developer' )); $c = $a->getArrayCopy(); print_r($a); print_r($c); /**output ArrayIterator Object ( [storage:ArrayIterator:private] => Array ( [name] => mengzhi [age] => 12 [city] => shanghai [0] => Array ( [home] => china [work] =>

Python开发【第五篇】:Python基础之迭代器、生成器

橙三吉。 提交于 2020-02-29 22:48:40
迭代器 一、迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 优点: 提供一种统一的、不依赖于索引的迭代方式 惰性计算,节省内存 缺点: 无法获取长度(只有在next完毕才知道到底有几个值) 一次性的,只能往后走,不能往前退 1、为何要有迭代器? 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 2、什么是可迭代对象? 可迭代对象指的是内置有 iter 方法的对象,即obj. iter ,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ 3、什么是迭代器对象? 可迭代对象执行obj. iter ()得到的结果就是迭代器对象 而迭代器对象指的是即内置有 iter 又内置有 next 方法的对象 文件类型是迭代器对象 open('a.txt').__iter__() open('a.txt').__next__() 二、迭代器对象的使用 dic={'a':1,'b':2,'c':3}

C# yield简单迭代

心已入冬 提交于 2020-02-29 13:20:35
在我们使用foreach的时候其实每一个集合都是实现是IEnumerable接口的 , 如果没有实现你循环肯定是行不通的, 那么假如没有实现我们自己怎么实现呢,这个是yield是最好的帮助: public static IEnumerable<int> Power(int number, int exponent) { yield return 3; yield return 5; yield return 8; } static void Main(string[] args) { var result = Power(2, 8); foreach (int i in result) { Console.Write("{0} ", i); } Console.ReadKey(); } 结构肯定是 3 5 8 注意: yield的返回类型一定要是IEnumerable, 通过 foreach 语句或 LINQ 查询来使用迭代器方法。 foreach 循环的每次迭代都会调用迭代器方法。 迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。 当下次调用迭代器函数时执行从该位置重新启动。 可以使用 yield break 语句来终止迭代。 他的好处就是不需要我们在手动去实现迭代, 简便代码, 如此而已