python迭代器生成器

「Python系列」Python迭代器与生成器 在 Python 中,迭代器模式常用于实现容器类的遍历操作,如列表、元组、字典、集合等。它们允许你逐个访问集合中的元素,而不需要事先知道集合的大小或将其全部加载到内存中。Python生成器(Generator)是一种特殊的迭代器,它允许你逐个产生(yield)值,而不是一次性生成整个列表或其他数据结构。生成器在处理大数据集时特别有用,因为它们只在需要时生成数据,从而节省内存。关键字来返回一个值,并记住生成器的当前状态,以便下次调用时从该状态继续执行。表达式的值,直到没有更多的值可以返回为止。 阅读详情

iterator

lis = [1,2,3,4,5]
tup = (1,2,3,4,5)
dic = {'a':1,'b':2,'c':3,'d':4,'e':5}


iter_lis = iter(lis)
iter_tup = iter(tup)
iter_dic = iter(dic)

print(iter_lis)
print(iter_tup)
print(iter_dic)

for i in range(5):
    print(next(iter_lis))
    print(next(iter_tup))
    print(next(iter_dic))
<list_iterator object at 0x794782a8e230>
<tuple_iterator object at 0x794782a8c8e0>
<dict_keyiterator object at 0x794782ab3560>
1
1
a
2
2
b
3
3
c
4
4
d
5
5
e

Generator

import os
import psutil

def show_memory_info(hint):
  pid = os.getpid()
  p = psutil.Process(pid)

  info = p.memory_full_info()
  memory = info.uss / 1024. / 1024
  print(f"[{time.ctime()}] {hint} memory used: {memory:.2f} MB")
#test_iterator,test_generator
import time

def test_iterator():
  show_memory_info("initing iterator")
  list_1 = [i for i in range(100000000)]
  show_memory_info("after iterator initiated")
  print(sum(list_1))
  show_memory_info("after sum called")

def test_generator():
  show_memory_info("initing generator")
  list_2 = (i for i in range(100000000))
  show_memory_info("after generator initiated")
  print(sum(list_2))
  show_memory_info("after sum called")

%time test_iterator()
%time test_generator()
[Tue Aug 27 09:24:13 2024] initing iterator memory used: 190.07 MB
[Tue Aug 27 09:24:23 2024] after iterator initiated memory used: 3984.98 MB
4999999950000000
[Tue Aug 27 09:24:24 2024] after sum called memory used: 3984.98 MB
CPU times: user 6.02 s, sys: 6.4 s, total: 12.4 s
Wall time: 12.5 s
[Tue Aug 27 09:24:26 2024] initing generator memory used: 211.91 MB
[Tue Aug 27 09:24:26 2024] after generator initiated memory used: 211.91 MB
4999999950000000
[Tue Aug 27 09:24:35 2024] after sum called memory used: 209.95 MB
CPU times: user 7.75 s, sys: 8.37 ms, total: 7.76 s
Wall time: 9.38 s

它还真的是一个Generator

list_2 = (i for i in range(100000000))
type(list_2)
generator

生成器 yield

def generator(k):
    i = 1
    while True:
        yield i ** k
        i += 1

gen_1 = generator(1)
gen_3 = generator(3)
print(gen_1)
print(gen_3)

def get_sum(n):
    sum_1, sum_3 = 0, 0
    for i in range(n):
        next_1 = next(gen_1)
        next_3 = next(gen_3)
        print('next_1 = {}, next_3 = {}'.format(next_1, next_3))
        sum_1 += next_1
        sum_3 += next_3
    print(sum_1 * sum_1, sum_3)

get_sum(8)

<generator object generator at 0x794782ac3ae0>
<generator object generator at 0x794782ac3b50>
next_1 = 1, next_3 = 1
next_1 = 2, next_3 = 8
next_1 = 3, next_3 = 27
next_1 = 4, next_3 = 64
next_1 = 5, next_3 = 125
next_1 = 6, next_3 = 216
next_1 = 7, next_3 = 343
next_1 = 8, next_3 = 512
1296 1296

生成器Generator的应用

def index_normal(L, target):
    result = []
    for i, num in enumerate(L):
        if num == target:
            result.append(i)
    return result

print(index_normal([1, 6, 2, 4, 5, 2, 8, 6, 3, 2], 2))

[2, 5, 9]
def index_generator(L, target):
    for i, num in enumerate(L):
        if num == target:
            yield i

print(list(index_generator([1, 6, 2, 4, 5, 2, 8, 6, 3, 2], 2)))

[2, 5, 9]
## 算法题

def is_subsequence(a, b):
    b = iter(b)
    return all(i in b for i in a)

print(is_subsequence([1, 3, 5], [1, 2, 3, 4, 5]))
print(is_subsequence([1, 4, 3], [1, 2, 3, 4, 5]))

True
False
def is_subsequence(a, b):
    b = iter(b)
    print(b)

    gen = (i for i in a)
    print(gen)

    for i in gen:
        print(i)
    # (i in b ) 判断i是否在b中
    gen = ((i in b) for i in a)
    print(gen)

    for i in gen:
        print(i)

    return all(((i in b) for i in a))

print(is_subsequence([1, 3, 5], [1, 2, 3, 4, 5]))
#print(is_subsequence([1, 4, 3], [1, 2, 3, 4, 5]))

<list_iterator object at 0x7878b7331030>
<generator object is_subsequence.<locals>.<genexpr> at 0x7878b733c4a0>
1
3
5
<generator object is_subsequence.<locals>.<genexpr> at 0x7878b733c510>
True
True
True
False

潜行游戏设计:核心机制与关卡设计解析 潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。 阅读详情

相关推荐

用AnythingLLM搭建私人RAG知识库:从入门到实战调优指南

大型语言模型虽然知识渊博,但无法触达私有文档中的具体内容,这正是检索增强生成(RAG)技术的核心价值所在。RAG通过先将文档切块并向量化,再在提问时检索最相关的片段拼接给模型,让AI基于指定资料精准回答,无需昂贵的模型微调。这种架构不仅让知识更新即时生效,还大幅降低了私有化部署的门槛。在实际工程中,RAG的落地需要合理选择嵌入模型、设计分块策略并调优检索参数,才能避免答非所问。对于个人或小团队,使用开源工具搭建本地知识库是最省心的路径,其中AnythingLLM以其开箱即用的特性,成为连接向量检索与模型推理

weixin_29062671的博客 229

python迭代器和生成器

帮助大家深入了解迭代器与生成器

qq_52758588的博客 1万+

存内计算路线再获加持,清华存内芯片登Science

通过这种方法,可以比较有效的控制二氧化铪忆阻层中的微观变化,以及内部的温度和电场,使得器件具有非常优异的电学特性,而且可以在工厂里大规模生产,推动了高性能忆阻器阵列的诞生。团队搭建了全硬件构成的完整存算一体系统,如下图7所示,在系统里集成了多个忆阻器阵列,并在该系统上高效运行了卷积神经网络算法,成功验证了图像识别功能,证明了存算一体架构全硬件实现的可行性,并且成功实现了以更小的功耗和更低的硬件成本完成复杂的计算[6]。根据测试,在一般神经网络中权重更新的最后阶段,调整步长非常接近0,如图9(C)所示,

PXX12345678的博客 1555

【Python迭代器探秘】:揭秘迭代器与生成器的魔法,掌握高效循环的艺术

定义了一个 my_generator() 函数,它使用 while True 循环不断返回 yield 所产生的值,并在 yield 语句中使用变量 val 来接收 send() 方法所发送的值。与 next() 方法不同,send() 方法可以在生成器中接收一个值,并且该值会成为生成器中 yield 的表达式的结果。Python内置了很多支持迭代器模式的对象,同时也提供了一些常用的内置迭代器函数,包括map()、filter()、zip()和reversed()等。() 方法,即可满足迭代协议。

书山有路勤为径,学海无涯苦作舟。 3809

混合开关电容DCDC变换器技术解析与工程应用指南

在电源设计领域,传统DCDC变换器在高降压比或高升压比场景下,往往面临占空比过窄、开关应力大、效率偏低等瓶颈。开关电容变换器虽能实现固定比例的电压变换,却受限于调节能力。混合开关电容DCDC变换器通过“开关电容网络粗调变比+电感式DCDC细调输出”的策略,兼顾高效率、高功率密度与宽调压范围。本文梳理了其典型拓扑(如2:1/4:1 SC+Buck)、关键对比、控制策略(含软充电)及工程应用中的常见问题,帮助电源工程师在服务器供电、快充、车载电源等场景下快速选型与调试。

weixin_29164185的博客 314

用Scratch实现凯撒密码:图形化编程与古典密码学的趣味结合

字符编码与移位运算是计算机处理文本数据的基础原理之一,它通过将字母映射为数字实现信息转换。在密码学领域,凯撒密码作为最经典的替换密码,直观地展示了基于规则字符替换的加密思想,其核心价值在于通过简单算法揭示加密解密的基本框架。这种原理在编程教育中尤为重要,能够帮助初学者理解循环、变量和字符串处理等核心概念。结合Scratch图形化编程环境,学习者可以通过拖拽积木可视化构建加密算法,将抽象的移位操作转化为交互式游戏。本项目以凯撒密码为例,通过实时密钥调整和动态字母表映射,生动演示加密过程,并自然融入暴力破解和密

weixin_32428571的博客 310

python生成器和迭代器详解

文章目录前言一、迭代器--从一个简单例子入手1.1 实现__iter__成为迭代对象1.2 通过实现__next__方法成为迭代器二、生成器 -- 更加简单的迭代器2.1来个简单例子2.2 生成器函数yeild2.3 生成器推导式参考文献 前言 python中迭代器和生成器比较抽象,尽量做到通俗易懂。 一、迭代器–从一个简单例子入手 首先,创建一个基础类Dogs,并实例化一个对象,该类希望输出我家有多少条狗。此处我相信大家都能理解。 # 首先创建一个类,实例化一个普通的对象。 class Dogs(obje

wulele2的博客 4243

树莓派4B没有serial0或ttyS0,serial0没有映射到ttyS0,serial0和serial1调换映射

环境: 树莓派4B,ubuntu mate20 现象 终端输入ls -l /dev,发现只有serial1->ttyAMA0,没有serial0页没有ttyS0,更没有二者的映射。网上很多方法都是树莓派3B和3B+的,我自己试过,不太适用于4B,下面的方法是4B的,我自己用是成功的。 解决方法 cd /boot/firmware sudo gedit config.txt 注意不是/boot下的config,而是/boot/firmware下的config 打开文件后,找到enable_uart=0

qq_41208487的博客 7891

Python迭代器和生成器

Python迭代器和生成器

岳来的博客 1798

IMU自动校准论文与代码实现A Robust and Easy to Implement Method for IMU Calibration without External Equipments

PART1 摘要 低成本的惯性测量单元会受到系统误差的影响,系统误差由标度因子和轴偏差造成,这会降低位置和姿态估计的精度。 本文提出了一种无需任何外部设备的,鲁棒性强,易于实现的IMU校准方法。 该程序基于多放置方案,再估计传感器偏差的同时,为加速度和陀螺仪三轴的尺度和偏差系数。我们的方法只需要用手移动传感器,并将其放置在一组不同的静态位置(姿态)。 论文描述了一个鲁棒的快速校准协议,...

qq_29313679的博客 5308

Neo4j LLM知识图谱构建器使用教程

是一个开源应用程序,旨在将非结构化数据(如PDF、文档、文本、YouTube视频、网页等)转换为存储在Neo4j中的知识图谱。该项目利用大型语言模型(如OpenAI、Gemini等)从文本中提取节点、关系及其属性,并通过Langchain框架创建结构化的知识图谱。

u013250861的博客 541

Python进阶————迭代器与生成器

Python中的迭代器与生成器的区别与联系

记录学习笔记 2178

以 DeleteRestrictions 与 inlineDelete 为核心的 Fiori Elements 表格删除机制全解

SAP Fiori elements 中删除操作的设计与实现涉及多维度考量。框架默认依据 OData 元数据判断删除能力,通过 DeleteRestrictions 注解实现行级条件控制(deletable-path)。表格支持两种删除模式:工具栏集中删除与响应式表格行内删除,但二者不建议混用。关键约束包括:行内删除仅适用于 Responsive Table,且与多选功能互斥。配置需遵循三层架构:后端能力注解、前端表格形态和运行时交互。设计上强调禁用优于隐藏的可用性原则,并需保持列表页与对象页的删除体验一致

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 153

python 之 迭代器、生成器、装饰器

生成器是创建迭代器的一种更简单、更优雅的方式。不需要去写一个完整的类并实现__iter__()和__next__()方法。只需要写一个普通的函数,但是使用 yield关键字而不是return来返回值。

weixin_44929150的博客 1402

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python迭代器与生成器

python中的迭代器与生成器 迭代器: 迭代器就像for循环遍历,但唯一不一样的地方我们进一步探索 首先用for循环遍历一个列表如下: a=[1,2,3,4,5,6] for i in a: print(i) 其结果: 我们在用迭代器进行遍历一个列表如下: a=[1,2,3,4,5,6] b=iter(a) print(next(b)) print(next(b)) # print(n...

asnowdream的博客 1466

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python 迭代器和生成器

Python 迭代器和生成器

tangsiqi130的博客 1271

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

python生成器和迭代器区别

一、生成器 1.1 什么是生成器 generator:一边生成一边计算后面元素的机制,称为生成器,生成器里面保存的是算法,只有需要用到才会计算后面的值 1.2 通过列表生成式创建生成器 我们可以将列表生成式的中括号改成小括号就创建了一个生成器 list = [i for i in range(10)] print(type(list)) # <class 'list'> ...

李俊的博客 3789

Python中生成器和迭代器的区别

Python中生成器和迭代器的区别:

IT晓可程序员之路 4万+

python生成器与迭代器

迭代器用于从集合中取出元素,生成器用于凭空生成元素;iter()方法可以获取一个迭代器(_iter__或如果实现了__iter__方法,对象就是可迭代的;使用iter(a)可判断a是否可迭代,不可迭代会报错(或isinstance(a, abc.iterable) (from collections import abc));可迭代对象与迭代器关系:Python从可迭代的对象中获取迭代器。

weixin_46287157的博客 1664

python生成器和迭代器

                                     Python3迭代器和生成器  很多朋友在初次接触 python 的 迭代器 和 生成器 时,总是不理解 生成器 和 迭代器的作用 和它们之间的关系,今天笔者来详细的讲解一下。 知识点目录: 一、迭代器 1.什么是迭代器 2.举例说明 3.StopIteration 异常的作用 4.举例说明 StopItera...

S1433972007LJ的博客 1658

Python中的迭代器与生成器

它也可以实现,且生成器的主体部分相对于以上两种更简单,并且假设不用for循环进行遍历,每使用一次print(next(num))它只会打印一个,知道运行完毕,这就符合迭代器的特点,事实上生成器的确属于迭代器的一种,形式与函数相似,运行逻辑有别于函数,相较于函数的return直接终止函数的运行,它可以先停在yield这一行,再次调用时,它会从这一行开始重新运行生成器一次,迭代出下一个元素,直到达到要求后才停止。第一个next访问了1,指针指到了2,但没有进行打印,第二个next访问2,并且打印,结果为2。

2401_88753321的博客 1458

Python 生成器和迭代器详解

迭代器 在python中列表(list)、元组(tuple)、字典(dict)、集合(set)这些数据容器都有一个共同的特性,它们都支持使用for循环遍历容器中存储的元素,都是可迭代的也成为迭代器。 迭代时访问集合元素的一种非常强大的方式。迭代器可以记住遍历位置,不会对例如列表这样的数据容器一次性全部生成,而是等到用的时候才会去生成。我们也可以创建一个可迭代的对象:只要此对象含有__iter__方法,那么它就是一个可迭代的对象 如果要自定义实现一个迭代器,则类中必须实现以下两个方法: __next(sel

weixin_47906106的博客 2880

python迭代器与生成器实际用途_python迭代器和生成器

python迭代器和生成器一、迭代器1、什么是迭代器说迭代器之前有个相关的名词需要介绍: 可迭代对象:只要定义了iter()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器。在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器。迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有n...

weixin_35773740的博客 1547

Python之迭代器和生成器

用自己的理解来解释一下迭代器和生成器。在 Python 中,迭代器(Iterator)和生成器(Generator)均用于遍历集合中的元素。二者皆为实现迭代协议的对象。暂无一、二、

weixin_45272371的博客 1246

Python的迭代器和生成器

Python的迭代器和生成器 先说迭代器,对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会

hello_katty的专栏 1611
上一篇: python装饰器
下一篇: python协程coroutine
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值