迭代器,生成器, 闭包
1.迭代器
1. 可迭代对象
1. 可迭代对象的定义
- 字面意思:
- 对象:在Python中一切皆对象。就是一个实实在在的值。
- 可迭代:更新迭代,重复的,循环的一个过程,更新迭代每次都有新的内容。
- 可迭代对象: 可以进行循环更新的一个实实在在的值。
- 专业角度:可迭代对象就是内部含有__iter__ 方法的对象。
2. 获取对象的所有方法
str1 = "hello " print(dir(str1)) # 输出结果: [‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘,‘__rmod__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘capitalize‘, ‘casefold‘, ‘center‘, ‘count‘, ‘encode‘, ‘endswith‘, ‘expandtabs‘, ‘find‘, ‘format‘, ‘format_map‘, ‘index‘, ‘isalnum‘, ‘isalpha‘, ‘isdecimal‘, ‘isdigit‘, ‘isidentifier‘,‘islower‘, ‘isnumeric‘, ‘isprintable‘, ‘isspace‘, ‘istitle‘, ‘isupper‘, ‘join‘, ‘ljust‘, ‘lower‘, ‘lstrip‘, ‘maketrans‘, ‘partition‘, ‘replace‘, ‘rfind‘, ‘rindex‘, ‘rjust‘, ‘rpartition‘,‘rsplit‘, ‘rstrip‘, ‘split‘, ‘splitlines‘, ‘startswith‘, ‘strip‘, ‘swapcase‘, ‘title‘, ‘translate‘, ‘upper‘, ‘zfill‘]
判断一个对象是否是可迭代对象
st1 = "hello" print("__iter__" in dir(st1)) # True lis = [11,22,33] print("__iter__" in dir(lis)) # True
3. 可迭代对象的总结:
- 字面意思:可以进行循环更新的一个实实在在的值。
- 专业角度:内部还有__iter__ 方法的对象就是可迭代对象。
- 判断一个对象是不是可迭代对象:
__iter__ in dir(对象);
- 优点:
1. 存储的数据能显示,比较直观。
2. 拥有的方法比较多,操作方便。
- 缺点:
1. 占用内存
2. 不能直接通过for循环吗,不能直接取值(索引,key)
2. 迭代器:
1.迭代器的定义:
- 字面意思: 可更新迭代的工具
- 专业角度:内部还有__iter__方法并且含有__next__ 方法的对象就是迭代器
- 判断是否是迭代器:
‘__iter__‘ and ‘__next__‘ in dir(对象)
2.判断一个对象是否是迭代器
with open("a.txt",mode="w",encoding="utf-8") as f: print(("__iter__"in dir(f)) and ("__next__"in dir(f))) # True
3. 迭代器的取值
4. 可迭代对象如何转换成迭代器
lis = [11,22,] iter(lis)
5.while循环模拟for循环机制
lis = [11,22,33,44,55,66,77,88,99,14,12,15] obj = iter(lis) # 将可迭代对象转化成迭代器 while True: try: print(next(obj)) except StopItertion: break
迭代器的总结:
- 字面意思:可更新迭代的工具
- 专业角度:内部还有__iter__ 方法并且含有__next__方法的对象就是迭代器
优点:
1.节省内存
2. 惰性机制,next一次,取一次值
缺点:
1.速度慢
2.不走回头路
可迭代对象与迭代器的对比
1. 可迭代对象是一个操作方法比较多,比较直观,存储数据相对少(几百万个对象,8G内存是可以承受的)的一个数据集。
2. 当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。
3. 迭代器是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
4. 当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。