当前位置: 首页 > news >正文

python 可迭代,迭代器,生成器,装饰器

一、可迭代对象

        可迭代对象是指可以返回一个迭代器的对象(可迭代对象是指可以被 for 循环遍历的对象)。任何实现了 __iter__() 方法或者 __getitem__() 方法的对象都被认为是可迭代的。常见的可迭代对象包括列表、元组、字符串、字典和集合。

# 可迭代
from collections.abc import Iterable
# 迭代器
from collections.abc import Iteratori = 100
s = "hello"
l = [1, 2, 3]
t = (1, 2, 3)
d = {"name": "qiku"}
set0 = {1, 2, 3}
print(isinstance(i, Iterable), isinstance(s, Iterable), isinstance(l, Iterable), isinstance(t, Iterable),isinstance(d, Iterable),isinstance(set0, Iterable))t0 = (i for i in range(10))
print(isinstance(t0, Iterator), next(t0), next(t0), next(t0))

二、迭代器

        迭代器是一个实现了 __iter__()__next__()【用于获取数据流中的下一个项(每次获取一个) 方法的对象。迭代器不仅是可迭代的,而且它自己可以被用于获取下一个值。所有迭代器都是可迭代的,但不是所有可迭代对象都是迭代器。(迭代器可以被 next() 函数或 for 循环使用)

(for循环与next分开运行,方便观察)

# 可迭代
from collections.abc import Iterable
# 迭代器
from collections.abc import Iteratorclass MyDatas:def __init__(self, n):self.datas = [i for i in range(1, n + 1)]self.current_index = 0def __iter__(self):return selfdef __next__(self):if self.current_index >= len(self.datas):raise IndexErrorelse:current = self.datas[self.current_index]self.current_index += 1return currentmd = MyDatas(6)print(isinstance(md, Iterable), isinstance(md, Iterator))for e in md:print(e)print(next(md))
print(next(md))
print(next(md))
print(next(md))
print(next(md))
print(next(md))
print(next(md))

for循环运行结果: 

next运行结果: 

三、生成器

        生成器是特殊类型的迭代器,用于简化迭代过程(每次迭代时,生成器会返回一个值,并在下一次迭代时从上次停止的地方继续执行)。生成器通过 yield 关键字来生成值,而不是像普通函数那样返回一个值。每次调用生成器的next()方法时,生成器会从上次 yield 语句处继续执行,直到遇到下一个 yield 或者结束。

1.__sizeof__()方法, next()取值

# 可迭代
from collections.abc import Iterable
# 迭代器
from collections.abc import Iterator
# 生成器
from collections.abc import Generatorl0 = [1, 2, 3, 4, 5, 6]
print(l0.__sizeof__())
print(l0[5])t0 = (i for i in range(1, 100))
print(t0.__sizeof__())
print(isinstance(t0, Iterable), isinstance(t0, Iterator), isinstance(t0, Generator))
print(next(t0), next(t0))

 2.yield语句

(for 循环取值,取不到return的返回值) 

def my_datas():yield 1yield 10yield 30return 200r = my_datas()
print(type(r))# 永远无法取到return的200
for i in my_datas():print(i)

 (使用python异常处理可以取到return返回的值)

def my_datas():yield 1yield 10yield 30return 200r = my_datas()
print(type(r))while True:try:print(next(r))except StopIteration as e:print("end", e)break

四、装饰器

        装饰器是一个函数或类,用于在不修改原有代码的情况下添加新功能。装饰器通常用于添加日志记录、性能测试、事务处理等。

(闭包, 三大特性:1.外部函数嵌套内部函数;2.外部函数返回内部函数;3.内部函数可以访问外部函数局部变量)

时间开销:

import random
import time# 装饰器
def cost_time(f):def calc():start = time.time()f()print(f"{f.__name__}开销:{time.time()-start}")return calccost_time(lambda: print("--"))()datas = [random.randint(0, 10000) for i in range(1000)]
datas_copy = datas.copy()@cost_time
def my_fun1():datas.sort(reverse=True)print(datas)# my_fun1 = cost_time(my_fun1)
my_fun1()@cost_time
def my_fun2():new_list = sorted(datas_copy, reverse=True)print(new_list)# my_fun2 = cost_time(my_fun2)
my_fun2()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot+Echarts实现可视化图表(Thymeleaf,Vue3.0两种实现)
  • Json-类型映射使用TypeFactory或者TypeReference
  • 多视点抓取(Multi-View Grasping)
  • STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3)
  • 智慧社区新视界:EasyCVR视频汇聚平台下的数字化治理实践
  • 【Solidity】合约交互基础
  • google浏览器chrome用户数据(拓展程序,书签等)丢失问题
  • 多线程(4)——单例模式、阻塞队列、线程池、定时器
  • ATGM332D-F8N低功耗、小尺寸单北斗多频定位导航模块规格书
  • 金九银十秋招大模型岗位攻略来了,已收offer,非常详细收藏我这一篇就够了
  • 你是如何克服编程学习中的挫折感的?
  • 2024下半年软考全国报名时间汇总,附报名费用!
  • 巡检机器人有哪些功能和应用场景
  • ATECLOUD算法维护模块全新上线
  • raft、pow、pos算法(一)
  • git 常用命令
  • HTTP--网络协议分层,http历史(二)
  • Javascript编码规范
  • Python学习之路13-记分
  • React-redux的原理以及使用
  • RxJS: 简单入门
  • 分享几个不错的工具
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 软件开发学习的5大技巧,你知道吗?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 微服务入门【系列视频课程】
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (06)金属布线——为半导体注入生命的连接
  • (13)Hive调优——动态分区导致的小文件问题
  • (Git) gitignore基础使用
  • (pojstep1.3.1)1017(构造法模拟)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (待修改)PyG安装步骤
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十八)三元表达式和列表解析
  • (转)Linq学习笔记
  • (转)可以带来幸福的一本书
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET NPOI导出Excel详解
  • .net Stream篇(六)
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中创建支持集合初始化器的类型
  • .net通用权限框架B/S (三)--MODEL层(2)
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • [ JavaScript ] JSON方法
  • [ NOI 2001 ] 食物链
  • [ 转载 ] SharePoint 资料