迭代器iter()和生成器yield

0.共同点:

都只能单向,从第一个元素进行访问,一直往后

1.迭代器

可以通过列表、元组等创建迭代器

iter()   创建
next()或者for循环   访问

创建

a = [1,2,3,4,5]
it = iter(a)

访问

#方法一:
while True:
    try:
        # 获得下一个值:
        x = next(it)
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

#方法二:
for i in it:
	print(i)

创建一个类,带有next方法
self.a 相当于记录了迭代的位置

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
 
    def __next__(self):
        if self.a <= 10:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
    print(x)

2.生成器

创建

# 方法一 : [] ——> ()
f = [x for x in range(5)]
	# f 是一个列表
g = (x for x in range(5))
	# g 是一个生成器


# 方法二: yield关键字


生成器的功能之一就是 节省内存,用的时候才产生,对比:

# 普通方法:
def test1(num):
	n = 0 
	a = []
	while n<num :
		a.append(n)
		n += 1

# yield关键字
def test2(num):
	n = 0 
	while n<num :
		yield n
		n += 1

yield后的生成器可以视作一个迭代器,因而,访问方法类似

def test(num):
    n = 0
    while True:
        if n>num:
            return
        yield n
        n += 1
       
ans = test(5)

 
while True:
    try:
        print(next(ans), end=" ")
    except StopIteration:
        break
上一篇:js重难点


下一篇:对gererator函数的认识