Python迭代器和生成器定义与用法示例

作者:ccorz 时间:2022-02-15 19:42:13 

本文实例讲述了Python迭代器和生成器定义与用法。分享给大家供大家参考,具体如下:

迭代器 iter()

迭代器是访问集合中元素的一种方式,迭代器 object 从集合中的第一个元素开始访问,直到所有的元素被访问完成.

所以迭代器的特点是:只能往前,不能后退

迭代器的优点:不需要提前准备整个迭代器中的所有元素,仅仅迭代到某个元素时才计算该元素,而之前或者之后,元素可以不存在或者销毁.因为这个特点,迭代器特别适合遍历文件比较大或者无限的集合.

总结下迭代器 iter()的特点吧:

1.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
2.不能随机访问集合中的某个值 ,只能从头到尾依次访问
3.访问到一半时不能往回退
4.便于循环比较大的数据集合,节省内存

**迭代器是用__next__()来取值的,来看个例子吧:


li=[1,2,3,4,56,78]
a=iter(li)
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__()) #取值到最后一个元素787
print(a.__next__())

输出:


1
2
3
4
56
78
#开始报错
Traceback (most recent call last):
File "/Users/shane/PycharmProjects/Py_study/Base/S5/iter_test.py", line 14, in <module>
 print(a.__next__())
StopIteration

生成器generator

一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器

yield是个什么鬼?yield 其实和函数中的 return 一样,一样的是都会返回定义好的值,但不同的是,return 是退出函数,yield 只是暂停函数执行,等待下一次迭代器取值

我们来看个例子:


def func():
 print(111)
 yield 1
 print(222)
 yield 2
 print(333)
 yield 3
ret=func()
r1=ret.__next__()
print(r1) #如果没有 print,只会返回111

out:


111
1

一个典型的生成器的取值方式:


def func():
 print(111)
 yield 1
 print(222)
 yield 2
 print(333)
 yield 3
ret=func()
r1=ret.__next__()
print(r1)
r2=ret.__next__()
print(r2)
r3=ret.__next__()
print(r3)
r4=ret.__next__()  #如果没有 r4就不会报错,因为已经没值可取了
print(r4)

out:


Traceback (most recent call last):
File "/Users/shane/PycharmProjects/Py_study/Base/S5/geno.py", line 21, in <module>
 r4=ret.__next__()
StopIteration
111
1
222
2
333
3

进程已结束,退出代码1

来看一个比较完整一点的生成器和迭代器吧:


def myrange(args):
 start=0
 while True:
   if start > args:
     return
   else:
     yield start
     start+=1
res=myrange(3)
ret=res.__next__()
print(ret)
ret=res.__next__()
print(ret)
ret=res.__next__()
print(ret)
ret=res.__next__()
print(ret)
ret=res.__next__()
print(ret)

希望本文所述对大家Python程序设计有所帮助。

来源:http://www.cnblogs.com/ccorz/p/5580487.html

标签:Python,迭代器,生成器
0
投稿

猜你喜欢

  • Python 计算机视觉编程进阶之OpenCV 图像锐化及边缘检测

    2021-07-31 11:03:29
  • Window下安装JDK1.8+Tomcat9.0.27+Mysql5.7.28的教程图解

    2024-01-26 22:24:12
  • python如何求100以内的素数

    2021-06-20 23:19:06
  • python获取百度热榜链接的实例方法

    2022-10-02 23:10:01
  • mysql第一次安装成功后初始化密码操作步骤

    2024-01-19 22:20:45
  • php中mysql连接方式PDO使用详解

    2023-11-06 02:46:43
  • 求任意自然数内的素数

    2009-10-15 12:21:00
  • Python脚本实现一键自动整理办公文件

    2022-01-02 16:36:03
  • Python从函数参数类型引出元组实例分析

    2022-12-18 01:51:22
  • 深入解析Linux下MySQL数据库的备份与还原

    2024-01-25 14:57:22
  • Python初学者必备的文件读写指南

    2023-03-16 11:44:15
  • python实现定时播放mp3

    2022-01-29 22:25:21
  • 浅谈Python反射 & 单例模式

    2023-10-14 21:16:30
  • PHP7正式版测试,性能惊艳!

    2023-09-12 07:41:43
  • 来看看如何防止采集

    2007-08-19 20:11:00
  • MySQL中order by排序语句的原理解析

    2024-01-24 15:43:23
  • Golang高性能持久化解决方案BoltDB数据库介绍

    2024-01-27 00:13:37
  • python如何写出表白程序

    2023-12-19 17:10:56
  • JS 显示当前日期+星期(静态)

    2007-09-11 13:29:00
  • 也来谈谈”完美”跨域

    2008-12-19 12:34:00
  • asp之家 网络编程 m.aspxhome.com