Python生成器与迭代器详情 - 网站

Python生成器与迭代器详情

分类:python · 发布时间:2023-02-23 12:35 · 阅读:8851

这篇文章主要介绍了Python生成器与迭代器,现在可以通过生成器来直接创建一个列表,是由于内存的限制,表的容量肯定是有限的,果我们需要一个包含几百个元素的列表,是每次访问的时候只访问其中的几个,剩下的元素不使用就很浪费内存空间,下面来了解具体内容

1、生成器

现在可以通过生成器来直接创建一个列表,但是由于内存的限制,列表的容量肯定是有限的,如果我们需要一个包含几百个元素的列表,但是每次访问的时候只访问其中的几个,那剩下的元素不使用就很浪费内存空间。

这个时候生成器(Generator)就起到了作用,他是按照某种算法不断生成新的数据,直到满足某一个指定的条件结束

得到生成式的方式有如下几种:

通过列表生成式来得到生成器,示例代码如下:

 g = (x for x in range(10))  # 将列表生成列的[]改变成为() # 打印其类型 print(type(g))  #  # 调用其元素 print(g.__next__())  # 0 print(g.__next__())  # 1 print(g.__next__())  # 2 print(g.__next__())  # 3 print(g.__next__())  # 4 # 使用.__next__的方式调用 print(next(g))  # 5 print(next(g))  # 6 print(next(g))  # 7 print(next(g))  # 8 print(next(g))  # 9 # 使用next()的方法调用 print(next(g))  # 当数据调用不到时会报出错误 StopIteration 

需要多少调用多少,不调用的不会生成,也就不会占用内存空间,可以使用循环结构来按照需要来调用

 g = (x for x in range(10))  # 将列表生成列的[]改变成为() skip = True  # 判断条件 count = 0  # 调用次数 while skip: count += 1  # 循环一次+1 print(next(g)) if count > 9: break  # 跳出循环 

使用函数借助yield关键字来完成一个生成器,生成斐波那契数列的前20个数,示例代码如下:

 def fun(length): a, b = 0, 1 for _ in range(length): a, b = b, a + b yield a fib = fun(20) print(type(fib))  #   # 打印类型 count = 0 while count <20: # 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 print(next(fib), "", end="" ) count +=1 < pre>

流程如下:

在执行过程中,遇到yield关键字就会暂停执行,下次调用则继续从上次暂停的位置继续执行,因为是一个循环语句,所有会直接跳到for语句

如果在调用yield,需要给它传值,就要使用.send()方法了。

示例代码如下:

 def fun(num): n = 0 for i in range(num + 1): n += i ret = yield n print(f"这是+到{ret}的第{i + 1} 次") g = fun(3) print(g.send(None)) print(g.send('3')) print(g.send('3')) print(g.send('3')) ''' ---输出结果--- 0 这是+到 3 的第 1 次 1 这是+到 3 的第 2 次 3 这是+到 3 的第 3 次 6 ''' 

send的加入可以使生成器更加灵活,但是需要注意的是第一次调用生成器的send()方法时,参数只能为None,否则会抛出异常。当然也可以在调用send()方法之前先调用一次next()方法,目的是让生成器先进入yield表达式。

2、迭代器与可迭代的生成器

可迭代的对象有生成器、元组、列表、集合、字典和字符串等

通过collectionsIterable函数结合isinstance(object, classinfo)来判断一个对象时不是可迭代的对象

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。很生成器也是迭代器。

可以被next ()函数调用并不断返回下一个值的对象称为迭代器: Iterator ,可以使用isinstance()判断一个对象是否是Iterator对象:

注意:可迭代的不一定是生成器,但是生成器一定第可迭代的。

把元组、列表、集合、字典和字符串等Iterable变成Iterator可以使用iter()函数

IterableIterator****的区别是Iterable是可以作为for循环对象的统称;而Iterator对象需要被next()函数调用才不断返回下一个数据,直到没有数据时抛出StopIteration错误,而在这之前是不会知道其长度的,所以Iterator的计算是惰性的,只有next()函数叫他才会返回结果,Iterator甚至可以表示一个无限大的数据流,例如全体自然数。

 from collections.abc import Iterable, Iterator a = [1, 2, 3] b = {1, 2, 3} c = (1, 2, 3) d = "123" e = 123 f = (x for x in range(5)) # 打印数据类型 print(type(a))  #  print(type(b))  #  print(type(c))  #  print(type(d))  #  print(type(e))  #  print(type(f))  #  print("-" * 20) # 打印是否为可迭代对象 print(isinstance(a, Iterable))  # True print(isinstance(b, Iterable))  # True print(isinstance(c, Iterable))  # True print(isinstance(d, Iterable))  # True print(isinstance(e, Iterable))  # False print(isinstance(f, Iterable))  # True print("-" * 20) # 除了字符串都是可迭代对象 # 打印是否是迭代器 print(isinstance(a, Iterator))  # False print(isinstance(b, Iterator))  # False print(isinstance(c, Iterator))  # False print(isinstance(d, Iterator))  # False print(isinstance(f, Iterator))  # True # 只有f(生成器)是迭代器 print("-" * 20) # 通过iter()将可迭代转换为迭代器 print(isinstance(iter(a), Iterator))  # True print(isinstance(iter(b), Iterator))  # True print(isinstance(iter(c), Iterator))  # True print(isinstance(iter(d), Iterator))  # True 

到此这篇关于Python生成器与迭代器详情的文章就介绍到这了,更多相关Python生成器与迭代器内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!

标签:
Python 生成器 迭代器

相关文章

Python轻松管理与操作文件的技巧分享

在日常开发中,我们经常会遇到需要对文件进行操作的场景,如读写文件、文件夹操作等。本文将为大家介绍一些 Python 中处理文件的实用技巧,让你的工作更高效

pytorch实现梯度下降和反向传播图文详细讲解

这篇文章主要介绍了pytorch实现梯度下降和反向传播,反向传播的目的是计算成本函数C对网络中任意w或b的偏导数。一旦我们有了这些偏导数,我们将通过一些常数α的乘积和该数量相对于成本函数的偏导数来更新网络中的权重和偏差

深入理解pytorch库的dockerfile

这篇文章主要介绍了pytorch库的dockerfile,主要包括dockerfile命令,使用指令的注意点及存在的一些问题,本文给大家介绍的非常详细,需要的朋友可以参考下

Selenium多窗口切换解决方案

本文主要介绍了Selenium多窗口切换解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Python自动化办公之定时发送邮件的实现

python中的schedule模块可以使我们方便简单的使用定时任务,即在特定的时间自动的执行一些任务的功能,本文将用这一模块实现邮件自动发送,需要的可以参考一下

返回分类 返回首页