迭代器,生成器, 闭包

Posted zangyue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器,生成器, 闭包相关的知识,希望对你有一定的参考价值。

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.闭包

以上是关于迭代器,生成器, 闭包的主要内容,如果未能解决你的问题,请参考以下文章

Python核心编程的四大神兽:迭代器生成器闭包以及装饰器

Python核心2(迭代器闭包装饰器生成器)

装饰器生成器迭代器

python装饰器迭代器生成器闭包等等

迭代器,生成器, 闭包

笔记---迭代器,闭包,装饰器