python 高级进阶—可迭代,迭代器,生成器,装饰器

一,可迭代与迭代器

1.什么是可迭代

可迭代对象是指一种可以被迭代的对象,也就是说这种对象可以通过迭代器进行遍历

2.可迭代的类型有哪些?

|-----------------|-----------------------------------|
| 列表(list) | 如 [1, 2, 3] |
| **元组(tuple) | 如 (1, 2, 3) |
| **字符串(str) | 如 "abc" |
| **集合(set) | 如 {1, 2, 3} |
| **字典(dict) | 如 {"a": 1, "b": 2}(字典的迭代默认是遍历键) |

3.如何实现可迭代?

复制代码
#在类中 定义该函数,该类的实例就有了可迭代性
def __iter__(self):  
       return self

例如:

复制代码
class MyDatas:
  
   def __iter__(self):  # 定义该函数,该类的实例就有了可迭代性
        return self

md = MyDatas()

print(isinstance(md, Iterable))

利用 isinstance 方法,获取md 是否是可迭代的 Iterable 类的一个实例

结果返回 True 该实例具有可迭代性

4.如何定义一个迭代器

复制代码
# 定义该函数,该类的实例就有了迭代器的性质
def __next__(self):  

例如:

复制代码
class MyDatas:
  
   def __next__(self):  # 定义该函数,该类的实例就有了迭代器的性质

        return self

md = MyDatas()

print(isinstance(md, Iterator))

5.迭代器与可迭代

迭代器一定是可迭代的,可以通过两种方法取值:

for 循环遍历

next()查询

二,生成器

生成器是 Python 中的一种特殊类型的迭代器,用于简化可迭代对象的创建和管理。生成器通过 yield 语句生成值,每次调用 next() 函数时,生成器会从上次 yield 的位置继续执行,并返回下一个值。

1.生成器的写法

1,元组推导式

复制代码
# t0 = (i for i in range(1000))
# print(t0.__sizeof__())


# 返回结果是生成器

2.在函数中使用yield

复制代码
def my_data():
    yield 1
    yield 2
    yield 3
    yield 4

    return 10

m = my_data()

2.取值方式

生成器就是迭代器,更具有可迭代性

所以: 生成器也可以通过for 循环遍历,也可以使用next()取值

3.生成器的优缺点

1.优点:

占用内存少,节省空间

复制代码
# l0 = [i for i in range(1000)]
# print(l0.__sizeof__())

# t0 = (i for i in range(1000))
# print(t0.__sizeof__())

利用 sizeof() 返回占用的空间大小

可以得到 生成器始终占用184 空间,小到0大到无穷无尽,始终是184空间大小

这是因为生成器存储的不是具体的值,而是数据的规则

2.缺点

缺点:不能使用下标来找某个值,因为它没有具体存储这些值

每次找都必须从第一个值开始往后找

3.如何返回函数的return值

复制代码
# 结合try 和 next 可以将真实的函数返回值 以e返回出来
# while True:
#     try:
#         print(next(m))
#     except StopIteration as e:
#         print(f'取完了',e)
#         break

三,装饰器

1.闭包

闭包三要素:

1.外层函数嵌套内层函数

2.外层函数将内层函数返回

3.内层函数可以访问外层函数的局部变量

2.装饰器

装饰器:在不改变原有函数的结构和实现的前提下,对函数添加新的功能

3.装饰器示例

详细内容于

闭着眼就能学会的装饰器-CSDN博客

相关推荐
程序员正茂5 分钟前
Win11使用自定义训练集训练ncnn模型
python·yolo·图像识别·移动端·ncnn
zwd200511 分钟前
Manim 画布尺寸与像素换算详解:frame_width、frame_height、pixel_width 和画质参数(0.21.0 实测)
python·分辨率·manim·数学动画·frame_width·manim教程
唐钰小宝B18 分钟前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
最强小杰35 分钟前
Claude Opus 4.8 调用报 529 怎么办?并发限制触发过载——退避策略与降级方案完整指南
运维·网络·python·ai
databook1 小时前
MinMax vs Standard vs Robust:三种特征缩放怎么选
python·机器学习·数据分析
在世修行1 小时前
智学文枢:实体模型层
python·orm·sqlalchemy
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
熊猫钓鱼>_>1 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
张张123y1 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
CCblandy1 小时前
一致性哈希到底省了多少搬迁?本机实测 3 轮:取模 6→7 搬 85.8%,V=128 只搬 14.3%,虚拟节点太少会被倾斜骗
后端·python·云原生·性能优化·架构