微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python迭代器和生成器

前言

迭代器和生成器都是对可迭代的对象进行操作。

迭代器

  • 迭代是Python最强大的功能之一,是访问集合元素的一种方式。

  • 迭代器是一个可以记住遍历的位置的对象。

  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

  • 迭代器有两个基本的方法:iter() 和 next()。

迭代器的优点:

  1. 可节省内存空间

  2. 会从容器里面挨个取值,直到取完为止

迭代器的缺点

  1. 对迭代对象的取值不够灵活,只能从下一个开始

  2. 无法判断迭代器的长度

示例

list = [1,2,3,4]
nums = iter(list)
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums))
print(next(nums))

list = [1,4]
nums = iter(list)
for i in nums:
    print(i)

list = [1,4]
nums = iter(list)
while True:
    try:
        print(next(nums))
    except stopiteration:
        break

生成

生成器的优缺点

生成器本质上是迭代器,所以继承迭代器的所有优缺点。

生成器对比普通循环

import sys
#查看占用内存大小
mylist = [i for i in range(10000000)]
print(type(mylist))
print('列表占用内存大小:',sys.getsizeof(mylist),'字节')
mygen = (i for i in range(10000000))
print(mygen)
print('生成器占用内存大小:',sys.getsizeof(mygen),'字节')


内存大小一目了然,内存数据相差万倍。所以采用生成器能有效优化数据占用量,尤其在读取大量的日志文件能有效避免内存溢出的错误

示例

第一种方法很简单,只要把一个列表生成式的[]改成(),就创建一个生成器(generator)。

ls = [x*x for x in range(10)]
print(type(ls))
print(ls)

ls2 = (x*x for x in range(10))
print(ls2)
for i in ls2:
    print(i,end=',')


第二种方法函数使用yield关键字,则它就是一个生成器。
yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。

def a(x):
    for i in range(x): 
        yield i*i
s = a(5)
print(s)
for i in s:
    print(i)

#生成器创建斐波那契数列
def fb(n):
    a,b = 0,1
    for i in range(n):
        yield b
        a,b = b,a+b

f = fb(10)
for i in f:
    print(i,')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐