迭代器,生成器, 闭包

wklken的笔记 2019-12-21

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. 当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。

2.生成器

3.闭包

相关推荐