Python迭代器与生成器研究记录

这篇具有很好参考价值的文章主要介绍了Python迭代器与生成器研究记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python迭代器与生成器研究记录

前言

迭代器肯定是可迭代对象,但是可迭代对象不一定是迭代器,生成器一定是迭代器,但是迭代器不一定是生成器
生成器是特殊的迭代器,所以生成器一定是迭代器,迭代器一定是可迭代对象
我们平常接触最多的对象中,字符串,字典,列表,集合,元组和open打开的文件对象等都是可迭代的对象因为他们都有__iter__()方法,可以遍历
需要注意的是,我们平常接触最多的对象中,字符串,字典,列表,集合,元组等都不是迭代器因为他们都没有__next__()方法,但是open打开的文件对象却是一个迭代器对象

可迭代对象

1.只要内部有__iter__()方法的对象就是可迭代对象如 字符串,字典,列表集合,元组,包括open打开的文件对象也都是可迭代对象
2.或者可以这样说,只要可以转换成迭代器的对象就是可迭代对象

这些都是可迭代对象

test_list = [1, 3, 4, 7]
test_list.__iter__()
test_str = "test_str"
test_str.__iter__()
test_dict = {"1":12}
test_dict.__iter__()
test_set = {"1", "4", "898"}
test_set.__iter__()
with open("file_path", "r") as file_obj:
    file_obj.__iter__()

可迭代对象调用__iter__()方法会返回一个迭代器,代码如下

test_list = [1, 3, 4, 7]
print(test_list.__iter__())
print(type(test_list.__iter__()))
# 可迭代对象调用__iter__()方法返回的就是一个迭代器
# <list_iterator object at 0x000001CEB3AD5518>
# <class 'list_iterator'>

迭代器

迭代器就是有__iter__()方法和__next()__方法的对象,所以迭代器肯定是可迭代对象,但是可迭代对象不一定是迭代器
迭代器对象调用__next__()方法每次会拿到迭代器里面的一个值并返回,直到全部拿完会报错StopIteration
迭代器对象调用__iter__()方法返回的是迭代器本身(和没调用一样),可迭代但是非迭代器的对象调用__iter__()方法也是返回的是基于这个对象的迭代器

需要注意的是,我们平常接触最多的对象中,字符串,字典,列表,集合,元组等都不是迭代器因为他们都没有__next__()方法,但是open打开的文件对象却是一个迭代器对象

# 迭代器的一个特征就是有__next__()方法
test_list = [1, 3, 4, 7]
# 可迭代对象调用__iter__()方法返回的就是一个迭代器
list_iterator_obj = test_list.__iter__()

# 迭代器调用_next__()方法每次就会拿出这个迭代器里面的一个值,直到全部拿完会报错
for i in range(5):
    print(list_iterator_obj.__next__())


# 1
# 3
# 4
# 7
# Traceback (most recent call last):
#   File "C:/Users/xxx/Desktop/python_test_dir/test_4.py", line 10, in <module>
#     print(list_iterator_obj.__next__())
# StopIteration

迭代器对象调用__iter__()方法返回的是他自己,和没调用一样

# 迭代器的特征就是有__next__()方法
test_list = [1, 3, 4, 7]
# 可迭代对象调用__iter__()方法返回的就是一个迭代器
list_iterator_obj = test_list.__iter__()

# 迭代器对象调用__iter__()方法返回的是他自己,和没调用一样
list_iterator_obj2 = list_iterator_obj.__iter__()
print(list_iterator_obj2 is list_iterator_obj)      # True


print(list_iterator_obj.__next__())     # 1
print(list_iterator_obj.__next__())     # 3
# 注意这里会返回此迭代器对象直接理解为是 list_iterator_obj = list_iterator_obj (因为是返回自己,所以里面剩余的值状态也是一样的)
list_iterator_obj = list_iterator_obj.__iter__()
print(list_iterator_obj.__next__())     # 4
print(list_iterator_obj.__next__())     # 7


for 循环遍历的本质可以理解成
1,每次调用此对象的__iter__()方法返回这个对象的迭代器版本
2,调用第一步返回的此迭代器版本的__next__()方法拿出里面的一个值
3,循环执行第二步直到所有元素拿完for 循环捕获结束时抛出的StopIteration异常并结束

生成器

生成器可以理解为自己定义的一个迭代器,可以自定义一个生成器,生成器定义有两种方法
1.函数yield关键字返回,含有yield关键字的函数会返回一个生成器对象,对此对象调用__next__()方法会执行此函数对应的yield关键字之前的代码并且返回yield关键字字后的返回值然后截止,下次调用__next__()方法又可以在上次的基础上继续执行
2.生成器表达式(我们以为的"元组推导式"就是生成器表达式,需要注意元组因为是不可变的所以元组没有推导式,类似元组推导式的形式其实是生成器表达式)文章来源地址https://www.toymoban.com/news/detail-752647.html

函数yield关键字生成器

def test():
    print("第一次执行")
    yield 1
    print("第二次执行")
    yield 2
    print("第三次执行")
    yield 3
    print("第四次执行")
    yield 4
    print("最后一次执行")


# test函数返回一个生成器对象
generator_obj = test()

print(generator_obj)  # <generator object test at 0x000001B393528C00>

print(generator_obj.__next__())
# 第一次执行
# 1
print(generator_obj.__next__())
# 第二次执行
# 2
print(generator_obj.__next__())
# 第三次执行
# 3
print(generator_obj.__next__())
# 第四次执行
# 4
print(generator_obj.__next__())
# 最后一次执行
# Traceback (most recent call last):
#   File "C:/Users/xxx/Desktop/python_test_dir/test_4.py", line 51, in <module>
#     print(generator_obj.__next__())
# StopIteration

生成器表达式

test_list = [10, 20, 30, 40]
generator_obj = (i for i in test_list)
print(generator_obj) # <generator object <genexpr> at 0x0000029852C98C00>
print(generator_obj.__next__())  # 10
print(generator_obj.__next__())  # 20
print(generator_obj.__next__())  # 30
print(generator_obj.__next__())  # 40
```bash
# obj.__next__()方法 等价于next(obj)
# obj.__iter__()方法 等价于iter(obj)

test_list = [10, 20, 30, 40]
generator_obj = (i for i in test_list)
print(generator_obj) # <generator object <genexpr> at 0x0000029852C98C00>
print(generator_obj.__next__())  # 10
print(generator_obj.__iter__())  # <generator object <genexpr> at 0x0000029852C98C00>
print(next(generator_obj))  # 20
print(iter(generator_obj))  # <generator object <genexpr> at 0x0000029852C98C00>

到了这里,关于Python迭代器与生成器研究记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python小姿势 - ## Python中的迭代器与生成器

    Python中的迭代器与生成器 在Python中,迭代是一个非常重要的概念,迭代器和生成器是迭代的两种最常见的形式。那么,迭代器与生成器有何不同呢? 首先,我们先来了解一下迭代器。 迭代器是一种对象,它可以记住遍历的位置,并在每次访问时返回下一个元素。迭代器只能

    2024年02月04日
    浏览(58)
  • 【Python】Python系列教程-- Python3 迭代器与生成器(二十)

    往期回顾: Python系列教程–Python3介绍(一) Python系列教程–Python3 环境搭建(二) Python系列教程–Python3 VScode(三) Python系列教程–Python3 基础语法(四) Python系列教程–Python3 基本数据类型(五) Python系列教程-- Python3 数据类型转换(六) Python系列教程-- Python3 推导式(

    2024年02月08日
    浏览(68)
  • python之迭代器和生成器

    当谈到Python中的迭代时,迭代器和生成器是两个很常见的概念。在本教程中,我将帮助您理解Python中迭代器和生成器的工作原理及其实现方式。 迭代器 Python中的迭代器是一种特殊的对象,可以用于遍历可迭代对象中的所有元素。所有的迭代器都实现了 __iter__() 和 __next__() 方

    2023年04月18日
    浏览(57)
  • 8 python的迭代器和生成器

    概述         在上一节,我们介绍了Python的模块和包,包括:什么是模块、导入模块、自定义模块、__name__、什么是包、创建包、导入包等内容。在这一节中,我们将介绍Python的迭代器和生成器。在Python中,迭代器是一个非常重要的概念,它使得我们能够遍历一个序列而无

    2024年02月10日
    浏览(41)
  • python中函数,装饰器,迭代器,生成器

    1.函数可以作为参数进行传递 2.函数可以作为返回值进行返回 3.函数名称可以当成变量一样进行赋值操作 作用:在不改变原有函数调用的情况下,给函数增加新的功能          即可以在函数前面增加新的功能,但不改变原来的代码 可迭代的数据类型都会提供迭代器,即可以

    2024年02月07日
    浏览(45)
  • 【python高级用法】迭代器、生成器、装饰器、闭包

    可迭代对象:可以使用for循环来遍历的,可以使用isinstance()来测试。 迭代器:同时实现了__iter__()方法和__next__()方法,可以使用isinstance()方法来测试是否是迭代器对象 使用类实现迭代器 两个类实现一个迭代器 一个类实现迭代器 可迭代对象与迭代器的总结 一个具备了__iter_

    2024年02月03日
    浏览(41)
  • Python教程(26)——Python迭代器和生成器详解

    Python中的迭代器是一种对象,它可以迭代(遍历)一个可迭代对象(比如列表、元组或字符串)的元素。迭代器用于实现迭代器协议,即包含 __iter__() 方法和 __next__() 方法。 迭代器的工作原理是每次调用 __next__() 方法时返回可迭代对象的下一个元素,当没有元素可迭代时,抛

    2024年02月19日
    浏览(45)
  • 【Python 4】列表与元组slice切片 迭代 列表生成式 生成器generator 迭代器Iterator对象

    在Python中,代码不是越多越好,而是越少越好 取一个list或tuple的部分元素是非常常见的操作 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作 L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3 如果第

    2024年02月07日
    浏览(55)
  • python使用迭代生成器yield减少内存占用的方法

    在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中。 其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会用到本文所介绍的迭代生成器yield。 首先我们用一个例子来演示一下迭代

    2024年04月28日
    浏览(31)
  • Python黑魔法:探秘生成器和迭代器的神奇力量

    在Python中,生成器和迭代器是实现惰性计算的两种重要工具,它们可以帮助我们更有效地处理数据,特别是在处理大数据集时,可以显著减少内存的使用。接下来,我们将详细介绍这两种工具。 迭代器是一种特殊的对象,它可以遍历一个集合中的所有元素。任何实现了__ite

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包