Python进阶内容--迭代器和生成器

news2025/7/16 5:38:48

什么是迭代器

在 Python 中,迭代器(Iterator)是一个访问集合元素的对象,它能够实现遍历集合的所有元素,而无需了解集合底层结构和细节。Python 中所有可迭代的对象(如 列表、元组、字符串、字典、集合等)都可以通过内置函数 iter() 获取对应的迭代器,然后使用内置函数 next() 逐个获取元素。当集合中的所有元素被遍历完成后,再次使用 next() 函数会抛出 StopIteration 异常。

什么是可迭代对象

在 Python 中,可迭代对象(Iterable)是指可以被迭代的对象,也就是包含多个元素并且支持使用 for 循环语句进行遍历的对象。Python 中许多内置的数据类型都属于可迭代对象,包括列表、元组、字符串、字典、集合等。

我们可以使用isinstance()方法和collections.abc中的Iterable类型来检查一个东西是否为可迭代对象。
例:

from collections.abc import Iterable
a = {1:"1",2:[1,2,3]}
print(isinstance(a,Iterable))
True

返回值为True

python内置类型中自带的迭代器

python中有很多内置类型就是可迭代对象,可迭代对象就说明这个东西可以通过iter()方法变为迭代器,举一个列表的例子。

a = [1,2,3]

a这个列表就是一个可迭代对象,我们先通过instance()方法检查这个列表是否为可迭代对象。

print(isinstance(a,Iterable))
True
for i in a:
	print(i)

在这里插入图片描述
这里其实就用到了可迭代对象的特性

注意:python在进行for 语句遍历循环的时候,会隐式的把需要遍历的对象转换成迭代器,并不断调用迭代器中的__next__()魔法函数,把迭代器中的对象一个一个的返回出来。

自定义可迭代器

class Iterable(object):
    def __init__(self):
        pass
    
    def __iter__(self):
        return self
    
    def __next__(self):
        pass
    
if __name__ == '__main__':
    i = Iterable()
        

这个是自定义迭代器的一个基本模板,除了初始化方法__init__()之外还有__iter__、next__两个魔法方法,这两个方法前者负责返回自身,所以它的返回值必须是self,而__next()方法负责迭代器主要的业务逻辑,需要根据不同的情况编写。

这里举一个经典的斐波那契额数列的例子:

class Fib:
    def __init__(self):
        self.prev,self.cur = 0,1

    def __iter__(self):
        return self

    def __next__(self):
        self.cur,self.prev = self.cur + self.prev,self.cur
        return self.cur


def fib():
    cur,prev = 1,0
    while 1:
        yield cur
        cur,prev = cur + prev,prev

if __name__ == '__main__':
    fib = Fib()
    for i in range(10):
        print(next(fib))

这段代码中的带yield的fib()函数是生成器函数

什么是生成器

生成器(Generator)是一种特殊的迭代器,它使用 yield 语句来产生值。与普通的迭代器相比,生成器更加简洁、高效,能够在遍历元素的同时动态生成新的元素,而不会像列表解析那样一次性占用大量内存空间。

def my_generator():
    yield 1
    yield 2
    yield 3
    yield 4

for item in my_generator():
    print(item) # 依次输出 1, 2, 3, 4

控制台会依次输出 1, 2, 3, 4

在这里插入图片描述

构建生成器的两种方式

上述代码是构建生成器的两种方式之一,也就是用函数来构建。

  • 生成器函数
    函数用yield返回值,这种函数叫生成器函数。函数被调用时会返回一个生成器对象。
def my_generator():
    yield 1
    yield 2
    yield 3
    yield 4

# for item in my_generator():
#     print(item) # 依次输出 1, 2, 3, 4
print(my_generator())
<generator object my_generator at 0x0000018F46583C10>

当打印这个执行函数时,控制台会返回这个信息,这个信息说明该函数返回的是一个generator (也就是生成器)对象。

生成器对象可以在当他被遍历的时候,自动调用__iter__()方法和__next__()方法,而且生成器是用一种懒加载的模式生成值,所以不需要担心生成器生成的值会一次性写入内存中,它会一个一个的写入内存。

  • 生成器表达式
g = (i for i in range(5))

用类似这样的表达式就能生成一个生成器,现在g就是一个迭代器,同时也是生成器。

from collections.abc import Iterable 
g = (i for i in range(5))
print(isinstance(g,Iterable))  # 返回值为True
print(iter(g))  # <generator object <genexpr> at 0x00000125451E3C10>

注意:生成器也可以是一个可迭代对象,因此我们可以遍历它:

for i in g:
    print(i)

在这里插入图片描述

yield与return的区别

  • 包含 return 的方法会以 return 关键字为最终返回,每次执行都返回相同的结果
  • 而包含yield方法的生成器每次执行时遇到 yield 就返回 yield 后的结果,但内部会保留上次执行的状态,下次继续迭代时,会继续执行 yield 之后的代码,直到再次遇到 yield 后返回

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

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

相关文章

NumPy 基础知识 :1~5

原文&#xff1a;Numpy Essentials 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 一、NumPy 简介 “我宁愿使用通用语言进行数学运算&#xff0c;也不愿尝试使用数学语言进行通用编程。” – John D Cook 在过去的十年中&#xff0c;Python 已成为科学计算中最受欢迎…

(C语言版)力扣(LeetCode)面试题 17.04. 消失的数字5种解法

消失的数字题目介绍第一种解法&#xff1a;按位异或第二种解法&#xff1a;公式运算第三种解法&#xff1a;临时数组第四种解法&#xff1a;相加再相减第五种解法&#xff1a;快排加二分查找结语题目介绍 该题目取自力扣&#xff08;LeetCode&#xff09;面试题 17.04. 消失的…

Direct3D 12——灯光——光照模型的概述

将之前所述的所有光照内容都结合起来&#xff0c;即表面反射的光量相当于环境反射光、漫反射光以及 镜面反射光的光量总和。 1.环境光Ca&#xff1a;模拟经表面反射的间接光量。 2.漫反射光Cd&#xff1a;对进入介质内部&#xff0c;又经过表面下吸收而最终散射岀表面的光进行…

盐边县高堰沟灌区综合信息化管理系统及平台建设-案例分享

项目背景 盐边县南部降雨逐年减少&#xff0c;可用水源有限&#xff0c;部分村庄的水源取自仅20亩的山坪塘&#xff0c;常常因降雨量小而蓄不满水&#xff0c;出现“人争水、地缺水”的现象&#xff0c;且支渠及以下渠系基本为土渠&#xff0c;渗漏损失严重。为解决不同程度的工…

解决魔兽世界wow中鼠标莫名其妙消失或自动跳回屏幕中间等类似问题整理

魔兽世界已经离开中国大陆~~&#xff0c;最近在玩xxx&#xff0c;咳咳&#xff0c;突然发现一个远古问题&#xff0c;一直以为是自己的鼠标问题&#xff0c;但这么多年换了这么多台电脑&#xff0c;这个问题也一直存在&#xff0c;今天突发奇想查了一下&#xff0c;结果竟然有答…

能聊天、会学习,远不是GPT的终局

自然语言处理&#xff08;NLP&#xff09;技术的发展和运用&#xff0c;使得计算机性能增长速度一举跃过摩尔定律瓶颈&#xff0c;将AI拱入属于它的高光时代。而象征技术融合的ChatGPT一夜爆红&#xff0c;仿佛给整个商业社会带来了一次“技术革命”。 微软、谷歌、百度、华为…

C++ 23 实用工具(二)绑定工具

C 23 实用工具&#xff08;二&#xff09;绑定工具 Adaptors for Functions std::bind、std::bind_front、std::bind_back和std::function这四个函数非常适合一起使用。 其中&#xff0c;std::bind、std::bind_front和std::bind_back可以让您即时创建新的函数对象&#xff0c…

一文! 解决镜像法,电轴法在电磁场中的应用

目录 镜像法原理 例题 模型一&#xff1a;无限大导体平面 一些理解 模型二&#xff1a;球面镜像 情况一&#xff1a;球壳接地 同样的几点思考&#xff1a; 情况二&#xff1a;球壳不接地 球壳不接地&#xff0c;但是点电荷放置在内部 镜像法在双层介质中的作用 电轴法…

C++017-C++指针及其应用

文章目录C017-C指针及其应用C指针及其应用CSP-J目标1. 指针1.指针变量的定义、赋值2.指针的引用与运算2. 基于指针的数组访问3. 指针与字符串4. 结构体与指针在练习&#xff1a;总结C017-C指针及其应用 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.c…

设计师都在用的6个免费设计素材网站~

本期给大家推荐几个设计师都在用的素材网站&#xff0c;免费下载&#xff0c;赶紧收藏起来吧~ 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站&#xff0c;主要是站内素材多&#xff0c;像平面、UI、电商等设计素材都能找到&#xff0c;还…

零售数据可视化|人、货、场、供、财报表分享

有没有零售数据可视化的例子&#xff0c;让大家看看BI零售数据可视化的效果&#xff1f;有&#xff0c;奥威BI零售标准方案提供了数十张BI数据可视化报表&#xff0c;覆盖人、货、场、供、财等核心业务&#xff0c;既可以让大家一次性体验零售数据可视化报表效果&#xff0c;也…

vLive带你走进虚拟直播世界

虚拟直播是什么&#xff1f; 虚拟直播是基于5G实时渲染技术&#xff0c;在绿幕环境下拍摄画面&#xff0c;通过实时抠像、渲染与合成&#xff0c;再推流到直播平台的一种直播技术。尽管这种技术早已被影视工业所采用&#xff0c;但在全民化进程中却是困难重重&#xff0c;面临…

GEE:Gmeans

G-means是一种聚类算法,它是基于K-means算法的改进版本。K-means算法的一个主要缺点是需要事先指定聚类的数量,而G-means算法则可以自动确定聚类的数量。 G-means算法使用了类似于K-means的迭代过程,但在每次迭代时,它会检查每个聚类是否可以继续细分为两个子聚类。这个检…

怎么免费制作logo?logo免费设计在线生成,从此设计不求人

你有没有因为Logo制作而烦恼过&#xff1f;对于很多人来说&#xff0c;logo制作是一项比较大的工程&#xff0c;需要专门的设计师才能完成。但是请人设计费用高还很费时间&#xff0c;还需多次沟通修改。其实&#xff0c;我们可以自己免费制作logo&#xff0c;下面&#xff0c;…

pytorch2.0 起步

参考&#xff1a;https://pytorch.org/get-started/pytorch-2.0/#ask-the-engineers-20-live-qa-series 总览 特性 fastermore pythonicas dynamic as ever torch.compile&#xff0c;部分零件由C迁移到Python,加强torch.compile的新技术有TorchDynamo, AOTAutograd, PrimT…

第十八章 React中的样式模块化处理

在React中组件如何使用本地的样式&#xff0c;而不对其他组件产生影响呢&#xff1f;我们这里需要使用样式的模块化处理&#xff0c;使得组件的样式只在该组件内部起作用。 这里我们通过两个组件应用说明。 定义组件 定义Hello组件与自定义样式 Hello/index.css .title{co…

Win 11 上在VMware 15安装时Ubuntu20.04注意事项(避坑必看)

遇到的问题 https://zhuanlan.zhihu.com/p/141033713 win11不兼容vm–VMware Workstation 与 Device/Credential Guard 不兼容。 https://zhuanlan.zhihu.com/p/428362751 打开控制面板-程序-启用或关闭Windows功能&#xff0c;发现win11没有Hyper-V&#xff0c;别慌&#xf…

算法设计 - 二分法和三分法,洛谷P3382

二分法 二分查找&#xff1a;找目标值位置 二分法是一种适用于特殊场景下的分治算法。 这里的特殊场景指的是&#xff0c;二分法需要作用在一个具有单调性的区间内。 比如&#xff0c;我们熟知的二分查找&#xff0c;就是一种二分法的具体实现&#xff0c;二分查找必须在一…

【云原生】阿里云ACK部署MySQL 数据持久化存储

思路图 一、概述 ACK介绍 阿里云容器服务Kubernetes版(Alibaba Cloud Container Service for Kubernetes,简称容器服务ACK)是全球首批通过Kubernetes一致性认证的服务平台,提供高性能的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理,轻松高效地在云端…

MAE论文阅读《Masked Autoencoders Are Scalable Vision Learners》

文章目录动机方法写作方面参考Paper: https://arxiv.org/pdf/2111.06377.pdf 动机 首先简要介绍下BERT&#xff0c;NLP领域的BERT是基于Transformer架构&#xff0c;并采取无监督预训练的方式去训练模型。它提出的预训练方法在本质上是一种masked autoencoding&#xff0c;也就…