Python入门教学之迭代器和生成器

迭代器
在Python如果一个对象可被循环(遍历)该对象中每一个元素的过程叫做迭代。例如 ,字典、字符串、列表、元祖、集合等。他们可被迭代的原因是,都有一个共同的内置函数__iter__。通过执行内置对象的__next__函数,可以依次打印该对象的所有元素。例如 有一个列表,该列表存储了1-100的数值,但是我们只想打印前50的个元素。
 
 
 
flag=True
l=[x for x in range(1,101)]
 
 
 
l_iter = l.__iter__()
while flag:
    try:
      item=l_iter.__next__()
      if item==51:
          flag=False
          break
      else:
          print(item)
 
 
 
    except:
        break
 
在While循环中迭代器将一直循环执行__next__()函数,但迭代器本身并不知道它要迭代多少个元素。当执行到最后元素时,还会继续执行__next__()函数,但此时没有元素可被迭代了,由于迭代器找不到可被迭代元素,将会报错。因此我们在使用while循环时,配合异常捕获代码 try except一起使用,当迭代过程中出现异常,将会自动停止下一次循环。
 
生成器:
ASP站长网假设我们 有个需求,除第一个 和第二个元素外,其他元素依次为前两个元素之和。
 
我们可以这样写
 
def fib1(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b
        n=n+1
    return 'done'
 
a=fib1(5)
print(a)
 
输出结果
 
1
1
2
3
5
done
 
推导过程如图
 
 
 
用另外一种方法
 
def fib2(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n=n+1
    return 'done'
 
调用该函数
 
1 a=fib2(5)
2 print(a)
 
输出结果 1 <generator object fib at 0x0000000002800518>
 
此时我们发现,不能像之前那样直接显示结果,此时定义的fib并不是一个简单的函数,而是被改造成了生成器。如果想知道生成的结果可以依次执行__next__函数,但每次只返回一个结果,当没有更多的元素可以被迭代时将会抛出异常。

dawei

【声明】:九江站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。