生成器和迭代器

news2024/10/19 3:05:08

迭代器

定义

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

工作原理

__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()

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

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

相关文章

《15分钟轻松学Go》教程目录

在AI快速发展的时代&#xff0c;学习Go语言依然很有用。Go语言擅长处理高并发任务&#xff0c;也就是说可以同时处理很多请求&#xff0c;这对于需要快速响应的AI服务非常重要。另外&#xff0c;Go适合用来处理和传输大量数据&#xff0c;非常适合机器学习模型的数据预处理。 …

leetcode动态规划(一)-理论基础

本节主要参考&#xff1a;代码随想录 题目分类 动态规划释义 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来…

WinX86内核02-驱动程序

把昨天的程序改用 c++ 编译,改成 .cpp ,发现编译报错 原因是名称粉碎,因此可以直接 extern “C”声明一下这个函数 或者用 头文件(推荐) 因为 在头文件中 可以把 头文件一起包含进去 #pragma once extern "C" { #include <Ntddk.h> ​ /*驱动入口函…

一文搞懂模型倍率怎么计算的,以及模型分组倍率原理!

&#x1f4cd; 已知&#xff1a; ① 输入token&#xff1a;又名 提示、Input token 数 ② 输出token&#xff1a;又名 补全、Output token 数 &#x1f4cd; 基准价格【最初 gpt3.5 的价格&#xff0c;所以倍率越大&#xff0c;越聪明越贵&#xff0c;倍率越小越省钱越笨】 on…

秋招面试题记录

嵌入式软件开发 网上搜集的题目 1.Static关键词的作用&#xff1f; static 关键字有三个主要作用&#xff1a; 局部变量&#xff1a;在函数内部&#xff0c;static 局部变量只初始化一次&#xff0c;且在函数调用结束后仍然保留其值。全局变量/函数&#xff1a;在文件内部&a…

产品自问:前台和中后台

产品自问&#xff1a;前台和中后台 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 前台和中后台通常根据以下几个方面进行区分&#xff1a; 一、功能定位 前台&#xff1a;主要面向外部…

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

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

【Linux】Anaconda下载安装配置Pytorch安装配置(保姆级)

目录 Anaconda下载 Anaconda安装 conda init conda --v Conda 配置 conda 环境创建 conda info --envs conda list Pytorch安装配置 检验安装情况 检验是否可以使用GPU Anaconda下载 可以通过两种途径完成Anaconda安装包的下载 途径一&#xff1a;本地windows下…

了解静态存储方式和动态存储方式的区别(超详细讲解)快来看

本篇通过一个代码题来考察静态变量和动态变量的区别&#xff0c;主要考察静态变量的值。 在前2章我们讲了变量可以分为全局变量和局部变量&#xff0c;而我们的变量&#xff0c;它的存储又有两种不同的方式:静态存储方式与动态存储方式。 自动局部变量:auto 静态局部变量:stati…

emwin的异常显示和父子坐标问题(瞎写的,别看 -- 2)

文章目录 4&#xff0c;想显示成 最后的demo 仿真器中 1&#xff0c;格子状显示 把下面这句注释掉&#xff0c;就可能会这么显示 WM_SetCreateFlags(WM_CF_MEMDEV);2&#xff0c;显示一副灰度图 很有可能你是这么写的 也就是 hMemDev GUI_MEMDEV_CreateFixed(0, 0, 200, …

Redis-02 单线程与高性能

Redis是单线程吗&#xff1f; Redis不是只有一个线程&#xff0c;通常所说Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能&#xff0c;比如持久化、异步删除、集群数…

BGP(边界网关协议)

1、网络AS&#xff08;自治系统&#xff09; 边界网关协议BGP&#xff08;Border Gateway Protocol&#xff09;是一种实现自治系统AS&#xff08;Autonomous System&#xff09;之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。 AS是指在一个实体管辖下的拥有…

【c++并发编程】线程池实现

参考https://shanhai.huawei.com/#/page-forum/post-details?postId43796 完整代码 #include <iostream> #include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_variable> #include <functi…

牛企查:性价比很高的企业综合查询小程序

很多人都会有查询企业信息的需求&#xff1a; 入职公司前查询企业的基本信息&#xff1b; 只是需要简单便捷查询到企业的信用代码注册地址等基础信息&#xff1b; 做企业调查&#xff0c;分析时需要用到企业的一些数据&#xff1b; 研究一些单项数据的时候&#xff0c;需要…

拟声 0.37.0 | 拟物风格,超级优美,功能丰富

拟声是一款功能丰富的音视频播放器&#xff0c;支持多种音频来源&#xff0c;并具备独特的歌词弹幕、音源转换、跨设备共享与控制等功能。其创新的LRC歌词编解码器和新拟物风格的UI设计为用户提供了一个全新的视听体验。 大小&#xff1a;36M 百度网盘&#xff1a;https://pan…

代码审计-Python Flask

1.Jinjia2模版注入 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug &#xff0c;模板引擎则使用 Jinja2。jinja2是Flask作者开发的一个模板系统&#xff0c;起初是仿django模板的一个模板引擎&#xff0c;为Flask提供模板支持&#xff0c;由于…

ubuntu下安装mysql遇到的问题

ubuntu下安装mysql sudo apt install -y mysql-server 出现问题 ……by process 3455 解决 安装 启动 systemctl status mysql.service sudo mysql -u root -p 如何修改密码 与datagrip的连接 查看IP ifconfig 若没安装 参考 Windows10的DataGrip2024.1.4连接ubuntu22.04中的M…

27.第二阶段x86游戏实战2-遍历周围NPC跳出递归循环

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01;0 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

公开课 | 2024清华大模型公开课 第6课 大模型前沿架构 Part 2(长文本、Scaling Law)

本文由readlecture.cn转录总结专注于音、视频转录与总结&#xff0c;2小时视频&#xff0c;5分钟阅读&#xff0c;加速内容学习与传播。 大纲 引言 介绍长文本和Scaling Law的研究方向 强调大型语言模型在日常生活中的应用 长文本处理 长文本的定义和例子 《哈利波特》系列书…

KubeSphere安装mysql8.4.0

背景 KubeSphere 是在 Kubernetes 之上构建的以应用为中心的多租户容器平台,完全开源,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。KubeSphere 提供了运维友好的向导式操作界面&#xff0c;帮助企业快速构建一个强大和功能丰富的容器云平台。 安装组件前提&am…