迭代器

Python核心编程的四大神兽

ε祈祈猫儿з 提交于 2020-01-02 01:08:50
本文将主要分为4大部分,分别介绍Python核心编程中的迭代器、生成器 、闭包以及装饰器。 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: def lifang_ls(): """求1-10所用整数的立方数-列表方式实现""" ls = [] for i in range(1,11): result = i ** 3 ls.append(result) print(ls) if __name__ == '__main__': lifang_ls() 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: def lifang_generate(): """求1

Python—迭代对象、迭代器、生成器

守給你的承諾、 提交于 2020-01-01 16:03:15
原文转载自 liuzhijun , 原文地址: https://foofish.net/iterators-vs-generators.html 本文源自 RQ 作者的一篇博文,原文是 Iterables vs. Iterators vs. Generators ,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网友指正。 在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水,我将用一篇文章试图将这些概念以及它们之间的关系捋清楚。 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用 in , not in 关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有: list, deque, .... set, frozensets, .... dict, defaultdict, OrderedDict, Counter, .... tuple,

Java中的集合迭代器

痞子三分冷 提交于 2020-01-01 15:56:25
集合的迭代器 任何集合都有迭代器。 任何集合类,都必须能以某种方式存取元素,否则这个集合容器就没有任何意义。 迭代器,也是一种模式(也叫迭代器模式)。在java中它是一个对象,其目的是遍历并选中其中的每个元素,而使用者(客户端)无需知道里面的具体细节。迭代器要足够的“轻量”——创建迭代器的代价小。所以看迭代器的源代码就会发现,里面会有很多要求: iterator方法返回一个Iterator,Iterator返回序列的头元素。 next方法获取下一个元素 hasNext检查还有元素 remove删除迭代器新返回的元素 下面是迭代器的基本使用 public class UsingIterator { public static void main(String[] args) { List<String> names = Arrays.asList("marson", "shine", "summer", "zhu"); Iterator<String> it = names.iterator(); while(it.hasNext()){ String s = it.next(); print(s); } for (String s : names){ print(s); } System.out.println(); it = names.iterator(); for (int

【Java基础】【15Colletion集合】

大兔子大兔子 提交于 2020-01-01 15:54:00
15.01_集合框架(对象数组的概述和使用) A:案例演示 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息。 Student[] arr = new Student[5]; //存储学生对象 arr[0] = new Student("张三", 23); arr[1] = new Student("李四", 24); arr[2] = new Student("王五", 25); arr[3] = new Student("赵六", 26); arr[4] = new Student("马哥", 20); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } B:画图演示 把学生数组的案例画图讲解 数组和集合存储引用数据类型,存的都是地址值 15.02_集合框架(集合的由来及集合继承体系图) A:集合的由来 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 B:数组和集合的区别 区别1 : 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值 集合只能存储引用数据类型(对象

Java8 ArrayList源码分析

孤街浪徒 提交于 2020-01-01 14:57:46
java.util.ArrayList 是最常用的工具类之一, 它是一个线程不安全的动态数组. 本文将对JDK 1.8.0中ArrayList实现源码进行简要分析. ArrayList 底层采用 Object[] 来存储, 每次添加元素前都会检查数组是否有足够空间容纳新的元素. 若数组空间不足则会进行扩容操作, 即创建一个容量更大的数组 并将已有的元素复制到新数组中. 默认情况下新数组的容量是当前容量的1.5倍. ArrayList使用 Arrays.copyOf 和 System.arraycopy 调用原生(native)方法进行数组复制, 以提高效率. addAll , removeAll 等方法中通常使用 c.toArray 方法来获取容器中所有元素. ArrayList提供了 iterator() 和 listIterator() 两种迭代器, 前者只能向后移动, 而后者可以双向移动. iterator() 只能删除上一个访问的元素, 而 listIterator() 还可以在游标位置添加元素. 两种迭代器都采用fail-fast机制, 即使用 modCount 记录结构性改变(添加删除元素等)的次数, 迭代器在移动前会检查 modCount 是否发生改变. 若 modCount 改变, 则抛出异常中止迭代. 该方法是为了防止其它线程修改容器造成迭代结果不一致.

黑马程序员C++教程从0到1入门--STL标准库

丶灬走出姿态 提交于 2019-12-31 10:59:13
黑马程序员C++教程从0到1入门--STL标准库 STL 组件 STL基本结构 STL 组件 STL 是 C++ 标准程序库的核心。STL 内的所有组件都由模板构成,其元素可以是任意型别。程序员通过选用恰当的群集类别调用其成员函数和算法中的数据即可。 STL 组件主要包括容器,迭代器、算法和仿函数。 容器 容器即用来存储并管理某类对象的集合。例如鱼缸是用来盛放金鱼的容器。 在 STL 中,容器又分为序列式容器和关联式容器两大类,而迭代器的功能主要是遍历容器内全部或部分元素的对象。迭代器可划分为 5 种类属,这 5 种类属归属两种类型:双向迭代器和随机存取迭代器。 每一种容器都有其优点和缺点。为满足程序的各种需求,STL 准备了多种容器类型,容器可以是 arrays 或是 linked lists,或者每个元素有特别的键值。 迭代器 迭代器用于在一个对象群集的元素上进行遍历动作。对象群集可能是容器,也可能是容器的一部分。 迭代器的主要用途是为容器提供一组很小的公共接口。利用这个接口,某项操作可以行进至群集内的下一个元素。 每种容器都提供了各自的迭代器。迭代器了解该容器的内部结构,所以能够正确行进。迭代器的接口和一般指针类似。 算法 算法用来处理群集内的元素,可以出于不同目的搜寻、排序、修改、使用那些元素。所有容器的迭代器都提供一致的接口,通过迭代器的协助,算法程序可以用于任意容器。

c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

纵饮孤独 提交于 2019-12-30 04:26:26
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素 2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数 3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同) set模板原型://Key为元素(键值)类型 1 template < class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) > 从原型可以看出,可以看出比较函数对象及内存分配器采用的是默认参数,因此如果未指定,它们将采用系统默认方式。 set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容器set成员函数:clear()--清除所有元素 c++ stl容器set成员函数:count()--返回某个值元素的个数 c++ stl容器set成员函数:empty()--如果集合为空,返回true c++ stl容器set成员函数:end()-

C++ set容器简单用法

半城伤御伤魂 提交于 2019-12-30 04:23:39
set是关联容器,类似于集合,里面的元素不会重复,而且呈现为有序性 常用操作: using namespace std; set<int>:s; 1.元素插入:s.insert() 2.中序遍历:类似vector遍历(用迭代器) set<int>::reverse_iterator rit=s.begin(); while(rit!=s.end()) {   printf("%d",*rit++); } 3.反向遍历:利用反向迭代器reverse_iterator。 set<int>::reverse_iterator rit; for(rit=s.rbegin();rit!=s.rend();rit++) 4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。 set<int> s; s.erase(2); //删除键值为2的元素 s.clear(); 5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。 set<int> s; set<int>::iterator it; it=s.find(5); //查找键值为5的元素 if(it!=s.end()) //找到 cout<<*it<<endl; else //未找到 cout<<"未找到"; C++成员函数: c++ stl容器set成员函数:begin()-

set--常见成员函数及基本用法

左心房为你撑大大i 提交于 2019-12-30 04:21:55
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。 set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。 c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素 2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数 3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同) set模板原型://Key为元素(键值)类型 1 template < class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) > 从原型可以看出,可以看出比较函数对象及内存分配器采用的是默认参数,因此如果未指定,它们将采用系统默认方式。 set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容器set成员函数:clear()--清除所有元素 c++

自学Java之day13_Collection、泛型

老子叫甜甜 提交于 2019-12-30 00:16:52
Collection集合 集合概述 集合 :集合是java中提供的一种容器,可以用来存储多个数据 集合和数组的区别 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储 。 集合框架 JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。 集合按照其存储结构可以分为两大类,分别是单列集合 java.util.Collection 和双列集合 java.util.Map。 Collection: 单列集合类的根接口 用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List 和 java.util.Set 。其中, List 的特点是元素有序、元素可重复。 Set 的特点是元素无序,而且不可重复。 List 接口的主要实现类有 java.util.ArrayList 和 java.util.LinkedList , Set 接口 的主要实现类有 java.util.HashSet 和 java.util.TreeSet 。从上面的描述可以看出JDK中提供了丰富的集合类库,为了便于初学者进行系统地学习