Python3迭代器和生成器

迭代器

迭代是Python最强大的功能之一,是访问元素集合的一种方法。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能向前不会后退。

迭代器有两个基本方法,iter()和next()。

字符串,列表,或元组对象都可以用于创建迭代器。

 

 

迭代器对象可以使用常规语句for进行遍历:

 

 

 

使用next()函数:

#next.py
import syslist = [1,2,3,4]
it = iter(list)while True:try:print(next(it))except StopIteration:sys.exit()

运行结果:

robot@ubuntu:~/wangqinghe/python/20190827$ python3.5 next.py

1

2

3

4

 

创建一个迭代器:

把一个类作为一个迭代器使用需要在类中实现两个方法__iter__()与__next__().

类都是由一个构造函数,Python的构造函数为__init__(),它会在对象初始化的时候执行。

__iter__方法返回一个特殊的迭代器对象,这个迭代器对象实现了__next__()方法通过StopIteration异常标识迭代的完成。

__next__()方法会返回下一个迭代器对象。

 

#iter.py
class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):x = self.aself.a += 1return xmyclass = MyNumbers()
myiter = iter(myclass)print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

运行结果:

robot@ubuntu:~/wangqinghe/python/20190827$ python3.5 iter.py

1

2

3

4

5

6

 

StopIteration

StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__方法种我们可以设置在完成指定循环次数后触发StopIteration异常来结束迭代。

 

在20次迭代后停止执行:

#stop.py
class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):if self.a <= 20:x = self.aself.a += 1return xelse:raise StopIterationmyclass = MyNumbers()
myiter = iter(myclass)for x in myiter:print(x)

运行结果:

robot@ubuntu:~/wangqinghe/python/20190827$ python3.5 stop.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

 

生成器:

在Python中,使用了yield的函数被称为生成器(generator)。

跟普通函数不同,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行过程中,每次遇到yield时函数会暂停并保持当前所有运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

#yield.py
import sysdef fibonacci(n):a,b,counter = 0,1,0while True:if(counter > n):return yield aa,b = b,a+bcounter += 1
f = fibonacci(10)while True:try:print(next(f),end=" ")except StopIteration:sys.exit()

运行结果:

robot@ubuntu:~/wangqinghe/python/20190827$ python3 yield.py

0 1 1 2 3 5 8 13 21 34 55

 

什么时候需要用到yield

一个函数f,返回一个list,这个list是动态计算出来的,并且这个list会很大,这个时候我们希望每次调用这个函数并使用迭代器进行循环的时候,一个一个的得到每个list的值,而不是直接得到一个list来节省内存,这个时候yield就很有用。

 

转载于:https://www.cnblogs.com/wanghao-boke/p/11419965.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pythton3实例

计算1-100之和 #add.py n 0 sum 0 for n in range(0,101):sum n print(sum) 实现99乘法法则 #mul.py i 1 while i < 9:j 1while j < i:mut j*iprint("%d * %d %d"%(j,i,mut),end" ")j 1print(" ")i 1 运算结果: robotubuntu:~/wa…

Python3函数

函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复使用率。 定义一个函数 可以定义一个由自己想要功能的函数&#xff0c;以下是简单规则&#xff1a; l 函数代码块是以def关…

epoll函数

epoll是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率&#xff0c;因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合&#xff0…

epoll事件模型

事件模型 EPOLL事件有两种模型&#xff1a; Edge Triggered (ET) 边缘触发只有数据到来才触发&#xff0c;不管缓存区中是否还有数据。 Level Triggered (LT) 水平触发只要有数据都会触发。 思考如下步骤&#xff1a; 假定我们已经把一个用来从管道中读取数据的文件描述符(RFD)…

epoll反应堆模型代码

libevent函数库核心思想 /*** epoll_loop.c ***/ #include<stdio.h> #include<sys/epoll.h> #include<sys/socket.h> #include<arpa/inet.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #include<string.h> #in…

UDP广播

广播是在局域网之间的一对多的通信方式&#xff0c;使用的udp协议 /*** client.c ***/ #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h>#define SERVER_PORT 8000 #define MAXLINE…

UDP组播

多播(组播) 组播组可以是永久的也可以是临时的。组播组地址中&#xff0c;有一部分由官方分配的&#xff0c;称为永久组播组。永久组播组保持不变的是它的ip地址&#xff0c;组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的&#xff0c;甚至可以为零。那些没…

Python3数据结构

列表&#xff1a; Python列表是可变的&#xff0c;这是它区别于字符串数组和元组的最重要的特点。列表可以修改&#xff0c;而字符串和元组不能。 以下是Python中列表的描述方法&#xff1a; 方法 描述 list.append(x) 将元素添加到列表结尾 list.extend(L) 通过添加指定列…

sed、awk工具

ed sed意为流编辑器&#xff08;Stream Editor&#xff09;&#xff0c;在Shell脚本和Makefile中作为过滤器使用非常普遍&#xff0c;也就是把前一个程序的输出引入sed的输入&#xff0c;经过一系列编辑命令转换为另一种格式输出。sed和vi都源于早期UNIX的ed工具&#xff0c;所…

C语言正则表达式

POSIX规定了正则表达式的C语言库函数&#xff0c;详见regex(3)。我们已经学习了很多C语言库函数的用法&#xff0c;读者应该具备自己看懂man手册的能力了。本章介绍了正则表达式在grep、sed、awk中的用法&#xff0c;学习要能够举一反三&#xff0c;请读者根据regex(3)自己总结…

makefile通用版本

实际当中程序文件比较大&#xff0c;这时候对文件进行分类&#xff0c;分为头文件、源文件、目标文件、可执行文件。也就是说通常将文件按照文件类型放在不同的目录当中&#xff0c;这个时候的Makefile需要统一管理这些文件&#xff0c;将生产的目标文件放在目标目录下&#xf…

Python3OS文件/方法

Python3OS文件/方法 os模块提供了非常丰富的方法用来处理文件和目录。 方法 描述 os.access(path,mode) 检验权限模式 os.chdir(path) 改变当前工作目录 os.chflags(path,flags) 设置路径的标记为数字标记 os.chmod(path,mode) 更改权限 os.chown(path,uid,gid) 更改…

Python3文件

open()方法 Python open()方法永于打开一个文件&#xff0c;并返回文件对象&#xff0c;并对文件进行处理过程中都需要用到这个方法&#xff0c;如果该文件无法被打开&#xff0c;则抛出OSError 注意&#xff1a;使用open()方法一定要保证关闭文件对象&#xff0c;即调用close(…

Python3输入输出

Python两种输出值的方式&#xff0c;表达式语句和print()函数。 第三种方式是使用文件对象的write()方法&#xff0c;标准输出文件可以用sys.stdout的引用。 如果你希望输出的形式更加多样&#xff0c;可以使用str.fomat()函数来格式化输出值。 如果你希望将输出的值转化成字符…

动态库加载顺序

1.编译目标代码时指定的动态库搜索路径&#xff1b; 2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径&#xff1b; 3.配置文件/etc/ld.so.conf中指定的动态库搜索路径&#xff1b; 4.默认的动态库搜索路径/lib&#xff1b; 5.默认的动态库搜索路径/usr/lib。 转载于:https://ww…

Python3正则表达式

正则表达式是一个特殊的字符序列&#xff0c;他能帮助你方便的检查一个字符串是否与某种模式匹配。re.match函数 re.match尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回一个none。 函数语法&#xff1a; re.match(pat…

C/C++输入

fgets(str,n,stdin) 从键盘输入一行&#xff0c;替代gets()。读取到n-1字节时或换行符时终止&#xff0c;如果是文件的话&#xff0c;读到文件结尾也会停止 getline(cin,str) str的类型必须是string类&#xff0c;它是C特定的字符串类&#xff0c;区别于C的char *数据类型。 ci…

strlen和sizeof的区别

C语言中没有字符串&#xff0c;用的是字符数组来模拟字符串。 C风格的字符串时字符数组然后在末尾加0表示结尾。 在C语言中有strlen和sizeof两个函数求字符数组的长度函数&#xff0c;他们俩的区别就是是否把最后的结束标志也加上去。 strlen是不加的&#xff0c;他表示字符串的…

shell编程练习题

求2个数之和计算1-100的和将一目录下所有的文件的扩展名改为bak编译当前目录下的所有.c文件&#xff1a;打印root可以使用可执行文件数&#xff0c;处理结果: roots bins: 2306打印当前sshd的端口和进程id&#xff0c;处理结果: sshd Port&&pid: 22 5412输出本机创建20…

shell编程题(一)

求2个数之和 #!/bin/bashfunction add {if(( $# < 2 )); thenecho "The arg int correct"elsesum$(($1$2))echo $sumfi }add 1 add 1 2 运行结果&#xff1a; exbotubuntu:~/shareWin/linux/shell$ ./sum.sh 1 2The arg int correct3 $#&#xff1a;相当于C语言…