python基础之迭代器与生成器
作者:非晚非晚 发布时间:2022-02-20 07:07:54
目录
1. 迭代器
1.1 迭代器的使用
1.2 创建类的迭代器
2. 生成器
2.1 生成器的使用
2.2 生成器表达式
总结
1. 迭代器
1.1 迭代器的使用
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。字符串,列表或元组对象都可用于创建迭代器。
iter(iterable)
:用于返回可迭代对象的一个迭代器。next(iterator)
: 从迭代器iterator中获取下一条记录。如果无法获取下 一条记录,则触发StopIteration异常
iter和next使用举例
lst = [1,2,3,4]
it = iter(lst) #创建迭代器对象
print(it) # <list_iterator object at 0x7fb8e443ed30>
print(next(it)) # 1
print(next(it)) # 2
for循环使用举例:
lst = [1,2,3,4]
it = iter(lst) #创建迭代器对象
for x in it:
print(x, end=" ") # 1 2 3 4
也可以使用next替代上例:
import sys # 引入 sys 模块
lst = [1, 2, 3, 4]
it = iter(lst) # 创建迭代器对象
while True:
try:
print(next(it))
except StopIteration:
sys.exit()
输出:
1
2
3
4
1.2 创建类的迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 10: #迭代次数,要不然for循环会一直执行
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter: #这里也可以直接用对象,因为它的类已经定义iter和next。
print(x,end = " ") # 1 2 3 4 5 6 7 8 9 10
2. 生成器
2.1 生成器的使用
在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
生成器的简单使用举例:
def func(n):
yield n*2
f = func(5)
print(f) # <generator object func at 0x7f36613ad308>
print(next(f)) # 10,迭代器的值
print(next(f)) # 报错!!!因为这个函数只返回了一个迭代器
便于理解,可以把yield当做return操作,不同的是,yield后面的代码会在下一次调用函数的时候继续执行。所以遇到yield操作时,首先需要先返回迭代器的值,而不会立马执行yield后面的代码,等到下一次调用函数的时候,会继续执行上一次没有完成的操作。显然,使用生成器比迭代器简单,而且性能是一样高效的,我们再来举一个例子进行说明。
def fib(n):
pre,curr = 0,1
while n > 0:
n-=1
yield curr
pre,curr = curr,curr+pre
print("I am a generator!")
for i in fib(5):
print(i)
print("-----------------------")
输出:
1
-----------------------
I am a generator!
1
-----------------------
I am a generator!
2
-----------------------
I am a generator!
3
-----------------------
I am a generator!
5
-----------------------
I am a generator!
使用for循环操作时,遍历了5次,最后一次会调用StopIteration,所以会输出5次"I am a generator!"。但是如果使用next则会不同,因为它不会自动调用下一次的函数,如下例所示:
def func(n):
yield n*2
print("I am a generator!")
f = func(5)
print(f) # <generator object func at 0x7f36613ad308>
print(next(f)) # 10,迭代器的值
输出结果为:
<generator object func at 0x7fd74460b308>
10
可以看到,因为没有继续调用函数,而不会执行yield后面的程序!
2.2 生成器表达式
生成器表达式与列表推导式很像,唯一的区别就是一个使用综括号一个使用小括号,生成器表达式返回生成器对象,而列表推导式返回列表对象。
g = (i*2 for i in range(10))
print(type(g)) # <class 'generator'>
for i in g:
print(i,end=" ") # 0 2 4 6 8 10 12 14 16 18
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
来源:https://blog.csdn.net/QLeelq/article/details/121597427
猜你喜欢
- 一、成员 1.1 变量实例变量,属于对象,每个对象中各自维护自己的数据。类变量,属于类,可以被所有对象共享,一般用于给对象提供公共
- 有关JS中字符串的相关文章,现在网上大概不计其数了。这里我不想再就这个问题做过多的论述,只是对几种方式的实现在各种浏览器中的执行效率进行对比
- <?php/*======================================事务处理==================
- 摘要:将英文单词首字母变成大写是一个古老的话题,很常用,也很简单。不过如何用更简单的方式批量完成这个工作,则有很多学问,不想来看看吗!将英文
- 原因我们在安装第三方库时,通常使用pip或pycharm的图形界面(右下角Python版本 -> 解释器设置 -> 加号)安装在
- '''数据集:伪造数据集(两个高斯分布混合)数据集长度:1000--------------------------
- 1. 设置fomat格式,如下: # 取前5个字符,跳过4个字符华,再取3个字符 format = '5s 4x 3s' 2
- 如何制作一个小巧的购物车?主程序如下:cartkit.aspClass CartKitSub CreateCart()&
- 本文实例讲述了PHP编程文件处理类SplFileObject和SplFileInfo用法。分享给大家供大家参考,具体如下:php对于大文件的
- 你不可能随时备份数据,但你的数据丢失时,或者数据库目录中的文件损坏时, 你只能恢复已经备份的文件,而在这之后的插入或更新的数据,就无能为力了
- 一、计数排序计数排序(Counting sort)是一种稳定的排序算法算法的步骤如下:找出待排序的数组中最大和最小的元素统计数组中每个值为i
- ASP结合ADO对数据库方便快捷的访问、结合XML、COM/ActiveX等其它技术 实现服务器多层结构的功能使它在今天还有着顽强的生命力。
- Anaconda 是一个旗舰版的python安装包, 因为普通的python没有库, 如果需要安装一些重要的库, 要经常一个一个下载,会非常
- 1、应该将 CSS 放置于结构的上方(一般放置于 head 元素内)。CSS 是解释型语言,Firefox 和 IE 在等待 CSS 传输完
- 一.安装python进入python官网,点击依次点击红色选中部分,开始下载。。。下载完成后,打开安装包,如下有两个选项,一个是立即安装,另
- 前言本文主要给大家介绍了关于python计算时间差(返回天数)的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧方法
- 强大的group by 代码如下:select stdname, isnull(sum( case stdsubject whe
- 本文介绍了一些JavaScript常用到得表单验证函数,方便大家使用。 判断是否为整数,是则返回true,否则返回falsefun
- DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear
- 本文实例讲述了Python实现截屏的函数。分享给大家供大家参考。具体如下:1.可指定保存目录.2.截屏图片名字以时间为文件名3.截屏图片存为