Python 迭代器,生成器,装饰器的一些思考

下面内容是自己的一些理解,不保证正确性

一:迭代器
使用场景: 当对象特别大时,使用迭代器,因为使用迭代器时,不是全部加载到内存中。并且用迭代器时,用完就不存在了。
迭代器代码示例:

import sys
a = [1,2,3,5,88,7,8,9,10,11,12,14]
b = iter(a)

print(next(b))
print(next(b))
print(next(b))
print(next(b))
import sys
a = [1,2,3,5,88,7,8,9,10,11,12,14]
b = iter(a)

while True:
    try:
        print(next(b))
    except StopIteration:
        sys.exit()

使用for循环遍历迭代器:

import sys
a = [1,2,3,5,88,7,8,9,10,11,12,14]
b = iter(a)

for i in b:
    print(i)

定义一个迭代器,必须有 __ iter__的申明:

class MyIter:

    def __init__(self, m):
        self.data = m
        self.length = len(m)
        self.index = -1

    def __iter__(self):
        return self
  
    def __next__(self):
        if self.index < self.length-1:
            self.index += 1
    else:
        raise StopIteration 
    return self.data[self.index]

————————————————
版权声明:本文为CSDN博主「Jairoguo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Jairoguo/article/details/104483824

二: 生成器
列表推导式与生成器表达式的区别在于,生成器表达式更省内存
生成器表达式与列表推导式的写法几乎一摸一样,将列表推导式的[]换成()就是生成器表达式,生成器表达式也有循环模式和筛选模式,多层循环构建。

##列表推倒式
l = [i for i in range(1,11)]
print(l)

##生成器
l = (i for i in range(1,11))
print(l)
for i in l:
    print(i)

1.生成器是一个不断产生值的函数,包含yield语句的函数是一个生成器
2.生成器每次产生一个值后,该函数将被冻结,不在执行未完成的语句,直到被再次唤醒后在从刚才的位置继续执行,产生下一个值,如此循环往复,每次只计算生成一个值
3.yield通常配合for循环使用,为for循环源源不断的每次一个的输出值
生成器就是拿一个,用完就删;列表是全部拿完再处理。

def gen(n):
    for i in range(n):
        yield i ** 2

for i in gen(1000):
    print(i)

你可能感兴趣的:(Python 迭代器,生成器,装饰器的一些思考)