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

devtools/2024/10/17 15:28:09/

一、可迭代对象(Iterable)

可迭代对象是指可以被for循环遍历的对象,或者具有__iter__()方法的对象。可迭代对象允许你获取其迭代器。常见的可迭代对象包括列表(list)、元组(tuple)、字典(dict)和集合(set)。

from collections.abc import Iterable, Iterator, Generatori = 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))
# False True True True True True

二、迭代器(Iterator)

迭代器是一个具有__iter__()__next__()方法的对象。通过__iter__()方法,迭代器返回其自身的引用。__next__()方法用于获取迭代器的下一个元素。当没有更多元素时,__next__()方法将引发StopIteration异常。

自定义迭代器类MyDatas类实现了__iter____next__方法,使其成为一个迭代器。

from collections.abc import Iterable, Iterator,class 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(5)print(isinstance(md, Iterable), isinstance(md, Iterator))#True True

三、生成器(Generator)

生成器是一种特殊的迭代器,它使用yield语句来产生一系列值。生成器在函数中使用yield表达式时创建,每次调用next()时执行到yield表达式,返回一个值,并在下一次调用时从该点继续执行。

生成器的优点:

  • 可迭代大型数据集:即使数据集太大不适合一次性加载到内存中

Python中列表和生成器表达式的内存大小

__sizeof__() 方法返回一个对象所占用的内存量,以字节为单位。

列表的内存占用不仅包括存储列表对象本身的内存,还包括存储列表中每个元素的内存。

生成器对象通常占用较少的内存,因为它们是按需生成值的。

l0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
print(l0.__sizeof__())  # 200
print(l0[15])  # 16
#
t0 = (i for i in range(1, 1000000000))
print(t0.__sizeof__())  # 184
print(isinstance(t0, Iterable), isinstance(t0, Iterator), isinstance(t0, Generator))   #True True True
print(next(t0), next(t0))  #1 2

my_datas函数是一个生成器,使用yield语句产生值。

from collections.abc import Iterable, Iterator, Generatordef my_datas():yield 1yield 2yield 3yield 10yield 20yield 30return 100r = my_datas()print(type(r))#<class 'generator'>while True:try:print(next(r))except StopIteration as e:print("取完了", e)  # 1  2  3  10  20  30  取完了 100break

四、装饰器(Decorator)

装饰器是一种设计模式,用于修改或增强函数、方法或类的行为,而不需要改变其本身的代码

使用@cost_time语法将cost_time装饰器应用于my_sort1my_sort2函数,以测量它们执行所需的时间。

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(10000)]
datas2 = datas.copy()@cost_time
def my_sort1():datas.sort(reverse=True)# print(datas)@cost_time
def my_sort2():datas3 = sorted(datas2, reverse=True)# print(datas3)# my_sort1 = cost_time(my_sort1)
my_sort1()# my_sort2 = cost_time(my_sort2)
my_sort2()


http://www.ppmy.cn/devtools/98762.html

相关文章

主流短视频评论采集python爬虫(含一二级评论内容)

声明 仅用于学习交流&#xff0c;不用于其他用途 正文 随着主流短视频评论采集更新需要登录&#xff0c;由于不懈的努力&#xff0c;攻破这一难点&#xff0c;不需要登录采集作品所有评论信息 话不多说上代码看效果&#xff1a; 输入作品id: 这样就拿到评论信息了&#xff…

ASPICE与ISO 26262在汽车软件开发中的关键角色与差异

ASPICE和ISO26262都是针对汽车行业的软件开发过程标准&#xff0c;但它们的重点和关注点有所不同。以下是它们各自的重点&#xff1a; ASPICE&#xff08;Automotive Software Process Improvement and Capability dEtermination&#xff09;的重点&#xff1a; 质量保证&…

Socket实现TCP

参考1 客户端 //客户端 #include<iostream> #include<winsock.h> #pragma comment(lib,"ws2_32.lib") using namespace std; void initialization(); int main() {//定义长度变量int send_len 0;int recv_len 0;//定义发送缓冲区和接受缓冲区char se…

虚幻5|AI视力系统,听力系统,预测系统(3)预测系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;2&#xff09;听力系统-CSDN博客 一&#xff0c;添加一个AI预感感官配置 1.选中我们的AIPerception,右侧细节添加一个AI预感感官配置&#xff0c;然后我们把所有感官的年龄都调成5&#xff0c;是所有 2…

对话框 Ref或者dom都拿不到详解

https://www.cnblogs.com/trampeagle/p/15146668.html element-UI 组件 dialog 中 ref 获取不到的问题解决方案_el-dialog ref获取不到-CSDN博客

《通义千问AI落地—中》:前端实现

一、前言 本文源自微博客且已获授权,请尊重版权. 书接上文&#xff0c;上文中&#xff0c;我们介绍了通义千问AI落地的后端接口。那么&#xff0c;接下来我们将继续介绍前端如何调用接口以及最后的效果&#xff1b;首先看效果&#xff1a; 上述就是落地到本微博客以后的页面效果…

Pandas.str

Pandas 的 .str 是字符串操作方法&#xff0c;它是 Pandas 中 Series 对象的一部分&#xff0c;提供了对序列中的每个字符串元素进行操作的能力。以下是一些常用的 .str 方法&#xff1a; str.len()&#xff1a;返回字符串的长度。str.lower()&#xff1a;将所有大写字母转换为…

如何使用Cesium加载WeServer发布的地图服务

前段时间有客户向我们提出了更新一下Cesium加载WeServer发布的地图服务的教程&#xff0c;这里为大家更新一下&#xff0c;更新后的Cesium版本号为1.120。 准备工作 在开始之前&#xff0c;需要先准备离线数据发布软件、离线卫星影像与高程示例数据、Cesium开源三维地球源码和…