一,可迭代与迭代器
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.装饰器示例
详细内容于