python-迭代器与生成器的区别

这里涉及几个知识点:迭代器、生成器、yieId

先用个例子看一下迭代器与生成器的区别吧

#L是个list,迭代用for循环即可,L取出来是存放在内存中的,再多次去循环取出都可以>>> L=[x*x for x in range(3)]
>>> for i in L:
	print(i)

0
1
4
>>> for n in L:
	print(n)

0
1
4

#把[]换成了()就成了生成器,只不过它只能循环出一次,因为它不是放在内存中的。它是实时生成数据的。
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
	print (i)

0
1
4#看我再循环一次,它已是空值
>>> for n in mygenerator:
	print(n)

>>>

其实我感觉上最大差的几点有以下:

1、list函数调用直接出结果。而生成器是一个对象

>>> L = [1,2,3,4,5,6]
>>> def xh():
	for i in L:
		print(i)

>>> g=xh()
1
2
3
4
5
6
>>> L1=[6,7,8,9,10]
>>> def generator():
	yield(L1)
	for i in L1:
		print(i)

>>> g=generator()
>>> next(g)
[6, 7, 8, 9, 10]

这里有个yield的对比,大家感受一下

>>> L1=[6,7,8,9,10]
>>> def generator():
	yield(L1) #打印L1的意思
	for i in L1:
		print(i)

>>> g=generator() #这里是一个生成器对象
>>> next(g) #用next打印出来
[6, 7, 8, 9, 10]

#生成器第2个例子
>>> def gen2():
	for i in L1:
		yield(i) #打印i的值
		print(i)

>>> g=gen2()
>>> print(g)
<generator object gen2 at 0x0000000002EAFD00>
>>> for x in g:
	print(x)

6
6
7
7
8
8
9
9
10
10

2、其实想想也挺简单,yield只不过就是个标识,同时打印一次该结果

经典案例:杨辉三角

#将杨辉三角的每一行看成一个list,写一个生成器(generator),不断输出下一行list
def triangel(n):
    L=[1]                                                                 #定义一个list[1]
    while True:
        yield L                                                           #打印出该list
        L=[L[x]+L[x+1] for x in range(len(L)-1)]        #计算下一行中间的值(除去两边的1)
        L.insert(0,1)                                                 #在开头插入1
        L.append(1)                                                 #在结尾添加1
        if len(L)>10:                                                 #仅输出10行

            break

#生成一个generator对象,然后通过for循环迭代输出每一行
a=angel(10)
for i in a:
    print(i)
#结果
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
时间: 2024-08-08 05:36:11

python-迭代器与生成器的区别的相关文章

python 迭代器和生成器的区别

迭代器(iterator)是一个实现了迭代器协议的对象,python的一些内置数据类型(列表,数组,字符串,字典等)都可以通过for语句进行迭代,我们也可以自己创建一个容器,实现了迭代器协议,可以通过for,next方法进行迭代,在迭代的末尾,会引发stopIteration异常. --------------------- 本文来自 xiongjiezk 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xiongjiezk/article/details/511

python迭代器、生成器和yield语句

http://blog.csdn.net/pipisorry/article/details/22107553 一.迭代器(iterator) 迭代器:是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration.任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开. 迭代器对象要求支持迭代

Python: 迭代器与生成器小结

迭代器与生成器的区别: 1. 迭代器由Class对象创建. 生成器由包含yield表达的Function对象或者Generator Expression创建. 2. 迭代器的原理: (1)由Iterable.__iter__()返回Iterator. (2)由Iterator.__next__()返回迭代值, 直到StopIteration. 一般迭代器同时实现__iter__()与__next__(), 在__iter__()返回self, 在__next__()返回迭代值,直到StopIte

Python迭代器和生成器介绍

Python迭代器和生成器介绍 迭代器 迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration. 在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作. 常用的几个内建数据结构tuple.list.set.dict都支持迭代器,字符串也可以使用迭代操作. 你也可以自己实现一个迭代器,如上所述,只

Lesson 023 —— python 迭代器与生成器

Lesson 023 -- python 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 next(). 字符串,列表或元组对象都可用于创建迭代器: >>>list=[1,2,3,4] >>> it = iter(list) # 创建迭代器对象 >>

迭代器和生成器的区别

迭代器和生成器的区别 如果说迭代器是以类为基础的单位产生器,那么生成器(generator)就是以函数为基础的单位产生器.也就是说,迭代器和生成器都是一个值一个值得生产,每迭代一次,只能得到一个值, 所不同的是,迭代器需要在类中定义__iter__和__next__方法,在使用时需要创建迭代器的实例.而生成器是通过一个函数展现的,可以直接调用, 所以从某种意义上来说,生成器在使用上更简洁. 原文地址:https://www.cnblogs.com/effortsing/p/10387398.ht

python中迭代器和生成器的区别

1 #!/usr/bin/python 2 def power(values): 3 for value in values: 4 print "powing %s" % value 5 yield value 6 def add(values): 7 for value in values: 8 if value % 2 == 0: 9 yield value + 3 10 else: 11 yield value + 2 12 elements = [1, 4, 7, 9, 12,

python——迭代器、生成器、装饰器

迭代器 迭代器规则 迭代:重复做一些事很多次,就像在循环中那样. 不仅可以对字典和序列进行迭代,还可以对其他对象进行迭代:只要该对象实现了__iter__方法. __iter__方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象.在调用next方法时,迭代器会返回他的下一个值.如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常. 注意:迭代器规则在3.0中有一些变化.在新的规则中,迭代器对象应

Python 迭代器、生成器和列表解析

迭代器 迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口. Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, 包括用户定义的对象.即迭代器可以迭代不是序列但表现出序列行为的对象, 例如字典的 key , 一个文件的行, 等等.迭代器有以下特性: 提供了可扩展的迭代器接口. 对列表迭代带来了性能上的增强. 在字典迭代中性能提升. 创建真正的迭代接口, 而不是原来的随机对象访问. 与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后

python 迭代器和生成器

迭代器 Iterator是迭代器的意思,它的作用是一次产生一个数据项,直到没有为止.这样在 for 循环中就可以对它进行循环处理了.那么它与一般的序列类型(list, tuple等)有什么区别呢?它一次只返回一个数据项,占用更少的内存.但它需要记住当前的状态,以便返回下一数据项.它是一个有着next()方法的对象.而序列类型则保存了所有的数据项,它们的访问是通过索引进行的. 迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末