生成器、迭代器

#列表生成式

#列表生成式
m = [x for x in range(10)]  #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(m)

def add(n):
    return n*2

s = [add(x) for x in range(10)]
print(s) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

生成器:两种创建方式

#方式一:
s = (x for x in range(100)) #生成器取值下面两种方式等价 # m = s.__next__() print(next(s)) # 0 print(next(s)) # 1 #也可以用for循环 for i in s: #生成器就是可以可迭代对象 print(i)
#方式二:yield
def
foo(): yield 1 print(foo()) #<generator object foo at 0x000001A11A30FF10> 生成器对象 for i in foo(): print(i) #打印出一个1

可迭代对象:对象拥有iter方法的

#斐波拉契数列

def fib(max):
    n,before,after = 0,0,1
    while n < max:
        yield before
        before,after = after,after+before
        n = n + 1


print(fib(8)) #<generator object fib at 0x000001DC7CF54888>

m = fib(8)
for i in m:
    print(i)
#打印结果
#0
#1
#1
#2
#3
#5
#8
#13

 生成器都是迭代器,迭代器不一定是生成器

迭代器满足两个条件
1.有iter方法
2.有next方法
l = [1,3,2]
m = iter(l) #<list_iterator object at 0x000002DBDC60D208>  返回一个迭代器对象
print(next(m)) #1
print(next(m)) #3
for 循环内部三件事:
1.调用可迭代对象的iter方法返回一个迭代器对象
2.不断调用迭代器对象的next方法
3.处理StopIteration异常

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。



原文地址:https://www.cnblogs.com/qqxin/p/13022131.html