生成器和迭代器

迭代器

定义

迭代器是一个实现了选代协议的对象,它可以让我们遍历一个容器中的所有元素,而不需要知道容器的内部结构,迭代器可以被用于遍历列表、元组、字典、集合等容器类型。

工作原理

__iter__():方法返回迭代器对象本身,有__iter__()方法的是一个可迭代对象。
__next__():返回容器中的下一个元素,直到容器中的所有元素都被遍历完毕后,再调用 next()方法就会抛出Stoplteration异常,表示迭代已结束。
__next__()方法的是迭代器

其他方法

# 返回iterator(迭代器)
print([1,2].__iter__())
print(iter([1,2,3]))

iter_l = [1,2,3,4,5]
iter_l = [1,2,3,4,5].__iter__()
# __length_hint__:获取的是迭代器元素的长度
print(iter_l.__length_hint__())
# __setstate__:根据索引指定索引位置
iter_l.__setstate__(3)
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())

输出结果:
在这里插入图片描述
最后因为所有元素元素都被遍历,所以报错

迭代器的创建:

  # 创建一个返回数字的迭代器,初始值为1,逐步递增1,并输出结果
class MyNum:
    def __iter__(self):   # 可迭代对象
        self.num = 1
        return self
    def __next__(self):
        n = self.num
        self.num += 1
        return n
mynum = MyNum()
 # 获取迭代器对象
myiter = iter(mynum)
 # myiter = mynum.__iter__()获取迭代器对象的迭代器
print(next(myiter))
print(next(myiter))
print(next(myiter))

生成器

定义

是Python中一种特殊的迭代器,它是一个能按需生成值的轻量级对象。

yield

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
生成器是一个返回迭代器的函数,只能用于迭代操作

创建生成器

'''创建一个生成器'''
 # 第一种方法:元组推导式
gen = (x*x for x in range(4))
List = [x*x for x in range(4)] # 以[]的为列表
print(gen)
print(List)
print()
 # 第二种方法:生成器函数
def gen2():
    for i in range(5):
        yield i   # yield表示暂停程序,可以使用next函数和sent函数唤醒程序
gen_2 = gen2()
print(gen_2)
print(next(gen_2))
print(next(gen_2))
print(gen_2.send(8))

用生成器模拟银行存款机

# 定义一个模拟银行取款机的函数
def bank_account():
    # 最初金额
    balance = 500
    while True:
        # 使用send函数传入amount的值
        amount = (yield balance)
        if amount is not None:
            # 模拟存款,balance增加
            if amount >= 0:
                balance += amount
                print(f"存款后,金额为{balance}")
            # 模拟取款,balance减少
            else:
                # 取款金额大于本金,无法取出
                if balance < -amount:
                    print(f"金额不足,无法取出")
                # 取款金额小于本金,可以取出
                elif balance >= amount:
                    balance += amount
                    print(f"取款后,金额为{balance}")
        else:
            print("没有存取款金额")
 # 创建生成器实例
account = bank_account()
 # 初始化生成器,执行到第一个yield语句
next(account)
 # 使用send方法传入account的值
 # 存入600元
account.send(600)
 # 取出200元
account.send(-200)
 # 再取出1000元
account.send(-1000)

生成器与迭代器的创建区别

1.生成器使用def定义函数创建,只要有yield关键字就是生成器
2.迭代器使用class来创建,需要同时包含__iter__()__next__()两个方法才能使迭代器

闭包

定义

在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数。

条件

1.在一个外部函数里定义一个内部函数
2.内部函数运用了外部函数的临时变量
3.外部函数的返回值是内部函数的引用

创建闭包

def outer(logo):
    def inner(msg):
        print(f"{logo}-{msg}-{logo}")
    return inner
n1 = outer("吃饭")
n1("睡觉")
n1("打游戏")
 # 输出结果:
 # 吃饭-睡觉-吃饭
 # 吃饭-打游戏-吃饭

用闭包实现银行取款功能

def outer(discount):
    def inner(account):
        nonlocal discount
        if account is not None:
            if account > 0:
                discount+=account
                print(discount)
            else:
                discount+=account
                if discount >= 0:
                    print(discount)
                else:
                    print("金额不足无法取出")
        else:
            print("没有计算金额")
    return inner
n1 = outer(1500)
n1(500)  # 输出:2000
n1(-600)   # 输出:1400
n1(-1500)   # 输出:金额不足无法取出

装饰器

实质上也是一个 闭包函数——函数嵌套。

作用

在不改变原函数的情况下,对已有函数进行额外的功能扩展

条件

装饰器的形成条件(与包的区别):

1.不修改已有函数的源代码
2.不修改已有函数的调用方式
3.给已有函数增加额外的功能

实现装饰器

def decorator(func): # 将函数作为参数,装饰函数
    def inner():
        print("现在睡觉")
        func()
        print("起床了")
    return inner

def sleep():  # 目标函数
    import random
    import time
    print("睡眠中...")
    time.sleep(random.randint(3,8))
fun = decorator(sleep)
fun()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

你们还在用8位单片机吗?

以前做过挺多8位机的&#xff0c;51内核的产品&#xff0c;比如楼层刷卡器用的STC的&#xff0c;还有计量产品&#xff0c;里面也是51内核计量单元等集成的SOC芯片。 类似的太多了&#xff0c;比如TI早期的Zigbee芯片&#xff0c;蓝牙芯片&#xff0c;很多都是8位的51内核。 8位…

leetcode_887_鸡蛋掉落___循序渐进的分析

分析&#xff1a;对于一组[n,k] 在一次尝试中选择了在dep层测试 其可以分为 如果在dep层炸了: 则变成了[dep-1,k-1]读作在dep-1层用k-1个鸡蛋来找鸡蛋的极限所需次数如果在dep层没炸: 则变成了[n-dep,k]读作在n-dep层用k个鸡蛋来找鸡蛋的极限所需次数可以发现这都是子问题的…

【Python爬虫实战】正则:从基础字符匹配到复杂文本处理的全面指南

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、正则表达式 &#xff08;一&#xff09;正则表达式的基本作用 &#xf…

【RabbitMQ】RabbitMQ 7种工作模式简单使用示例

目录 1. 简单模式 2. Work Queues(作队列) 3. Publish/Subscribe(发布/订阅) 4. Routing(路由模式) 5. Topics(通配符模式) 6. RPC(RPC通信) 7. Publisher Confirms(发布确认) 7.1Publishing Messages Individually(单独确认) 7.2 Publishing Messages in Batches(批…

【实战篇】用SkyWalking排查线上[xxl-job xxl-rpc remoting error]问题

一、组件简介和问题描述 SkyWalking 简介 Apache SkyWalking 是一个开源的 APM&#xff08;应用性能管理&#xff09;工具&#xff0c;专注于微服务、云原生和容器化环境。它提供了分布式追踪、性能监控和依赖分析等功能&#xff0c;帮助开发者快速定位和解决性能瓶颈和故障。…

Tbox编译注意问题

Tbox是一个强大的开源库&#xff0c;感谢做为ruki的无私奉献。 tbox: 跨平台的c开发库&#xff0c;提供asio、stream、容器、算法、xml/json/plist解析、数据库等常用模块 在使用tbox开源库的数据库模块时&#xff0c;没有使用xmake进行编译&#xff0c;而是使用make编译的。…

Golang | Leetcode Golang题解之第474题一和零

题目&#xff1a; 题解&#xff1a; func findMaxForm(strs []string, m, n int) int {dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for _, s : range strs {zeros : strings.Count(s, "0")ones : len(s) - zerosfor j : m; j > zeros; j--…

数据库血缘工具学习,使用以及分享

一.血缘关系是什么&#xff1f;为什么要分析血缘关系&#xff1f; 首先&#xff0c;什么是血缘关系&#xff1f; 是指在数据的全生命周期中&#xff0c;从数据的产生、处理、加工、融合、流转到最终消亡&#xff0c;数据之间自然形成的一种类似人类血缘的关联关系。 说的再简…

PyTorch 2.5 发布带来一些新特性和改进

官网&#xff1a;https://github.com/pytorch/pytorchGitHub&#xff1a;https://github.com/pytorch/pytorch原文&#xff1a;https://github.com/pytorch/pytorch/releases/tag/v2.5.0 主要亮点 (Highlights)] SDPA CuDNN 后端&#xff1a;为 torch.nn.functional.scaled_d…

Zico 2 靶机 - 详细流程

✨ 准备工作 靶机 && kali 环境要求 机器名网络配置靶机Zico 2NAT 模式攻击机kaliNAT 模式 靶机下载链接&#xff1a;zico2: 1 ~ VulnHub 打开 VMware&#xff0c;将 zico2.ova 拖拽到 VMware 中 设置 虚拟机名称(A) - 存储路径(P)- 导入 若是&#xff0c;…

3DsMax删除FBX 导出的预设

3DsMax删除FBX 导出的预设 文档 https://help.autodesk.com/view/3DSMAX/2025/CHS/?guidGUID-9939F041-5E2D-4AA8-A732-6C2A1DFB5314删除静态FBX 这个预设 使用everything 搜索预设文件的后缀.fbxexportpreset &#xff0c;然后 文件路径 C:\Users\GoodCooking\Documents\3…

C++标准模板库--vector

vector 介绍 vector&#xff08;向量&#xff09;是一种序列容器&#xff0c;表示为可以改变大小的数组。vector中的元素使用连续的存储位置&#xff0c;这意味着也可以使用指向其元素的常规指针偏移量来访问任意元素&#xff0c;且与数组一样高效。但与数组不同的是&#xff…

React01 开发环境搭建

React 开发环境搭建 一、创建 React 项目二、项目精简 一、创建 React 项目 执行下述命令创建 react 项目 blu-react-basis npx create-react-app blu-react-basis项目目录结构如下&#xff1a; 执行下述命令启动项目 npm run start启动效果如下&#xff1a; 二、项目精简 …

51单片机的万年历【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块时钟模块按键蜂鸣器等模块构成。适用于电子万年历、数字时钟万年历等相似项目。 可实现功能: 1、LCD1602实时显示年月日星期和北京时间&#xff0c;具备闰年判断功能 2、按键可设置闹钟时间 3、按键可修改当前时…

案例-登录认证

案例-登录认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。 最终我们…

redo文件误删除后通过逻辑备份进行恢复

问题描述 开发同事让在一个服务器上查找下先前库的备份文件是否存在&#xff0c;如果存在进行下恢复。翻了服务器发现备份文件存在&#xff0c;多愁了一眼竟翻到了该备份文件于2024.6.17日恢复过的日志&#xff0c;赶紧和开发沟通说2024.6.17号已经恢复过了为啥还要恢复&#x…

空间大数据的数据变换与价值提炼

在数字化时代&#xff0c;空间大数据正成为推动社会经济发展的关键因素。空间大数据不仅体量巨大&#xff0c;而且具有高速流转、多样类型和真实性等特点&#xff0c;它们在获取、存储、管理、分析方面超出了传统数据库软件工具的能力范围。地理信息系统&#xff08;GIS&#x…

AWS账号与邮箱的关系解析

在当今数字化时代&#xff0c;云计算服务的普及使得越来越多的企业和个人用户开始使用亚马逊网络服务&#xff08;AWS&#xff09;。作为全球领先的云服务平台&#xff0c;AWS为用户提供了丰富的计算、存储和数据库服务。然而&#xff0c;对于许多新用户来说&#xff0c;关于AW…

openresty通过header_filter_by_lua记录特定的请求头和特定的响应头到日志文件

有时我们希望记录特定的请求头信息和特定的响应头信息,以便能够通过关联请求信息和响应头信息,来实现记录请求和响应的对应关系。这里通过逐步尝试和优化的方式进行尝试。具体包括将需要的请求头和响应头组织到一条日志记录,输出到单独的错误日志文件记录等的配置尝试。 1.…