码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器和生成器

时间:2019-09-28 12:50:37      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:==   closed   splay   nbsp   不可   python   generator   固定   执行   

迭代器示例:(循环底层就是使用迭代器)
特点:节省内存 惰性执行 不可逆向迭代
技术图片
str1 = "alex"
iterable = iter(str1)   #iter函数可以将一个可迭代数据变成迭代器
# print(iterable.__dir__()) #迭代器里面有__iter__ 和 __next__方法
# print(len(iterable))    # 迭代器里没有len方法
print(iterable.__sizeof__())  # 内存中固定占据32个字节
print(iterable.__next__())
print(iterable.__next__())
print(iterable.__next__())
print(iterable.__next__())
# print(iterable.__next__())   #迭代器没有元素时会报错
View Code

生成器示例

技术图片
def generator():    # 创建一个迭代器
    print("yiled之前")
    yield 1
    yield 2
    yield 8
    print(yield之后)
a = generator()
print(a.__sizeof__())  #固定占据96个字节
print(a.__next__())   # 执行时找到yield就停止
# print(a.__next__())   #第二个yield没有找到,报错
View Code

生成器的send方法

技术图片
def generator():    # 创建一个生成器
    print("=====")
    a = yield 1111
    print(a)
    print("=====")
    b = yield 2222
    print(b)
    print("=====")
    c = yield 3333
    print(c)
    print(=====)
    yield 4444
a = generator()

print(a.__next__())
print(a.send(我是a))  # send方法相当于__next__ 但是会给上一个yield赋值断点赋值
print(a.send(我是b))
print(a.send(我是c))
View Code

迭代器与生成器的区别:

   迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string、list、
dict、tuple 等这类容器对象,使用 for 循环遍历是很方便的。在后台 for 语句对容器对象调用 iter()函数,iter()
是 python 的内置函数。iter()会返回一个定义了 next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()
也是 python 的内置函数。在没有后续元素时,next()会抛出一个 StopIteration 异常。


   生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数
据的时候使用 yield 语句。每次 next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置
和所有的数据值)


区别:生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且
生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当
发生器终结时,还会自动抛出 StopIteration 异常。

 

迭代器和生成器

标签:==   closed   splay   nbsp   不可   python   generator   固定   执行   

原文地址:https://www.cnblogs.com/dedadiao/p/11602436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!