博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迭代器,生成器
阅读量:4606 次
发布时间:2019-06-09

本文共 2225 字,大约阅读时间需要 7 分钟。

1生成器是特殊的迭代器,

2爹带起有个特点是能调用next和iter方法。(py2和py3中略有不同,py2的方法名是__iter__和next(),而py3中的方法名是__iter__和__next__)

3含有iter方法的是可迭代对象,并且该iter方法会返回iter和next方法均具备的迭代器。list就是是可迭代对象,但是list等并不是迭代器,因为他没有内置next方法

4 for xxx in list ,这里有一个隐式转化,会先将list转为迭代器

 

 

>>> L = [x * x for x in range(10)]

>>> L

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> g = (x * x for x in range(10))

>>> g

<generator object <genexpr> at 0x104feab40>

 

也就是说[x for x in range(10)]是列表,(x for x in range(10))是生成器

生成器有两种实现方式:一种是上述这个,一种是有yield语句的函数

 

特别的[x for x in range(10) if x>5]结果是[6,7,8,9]

 

可迭代对象和迭代器:

可迭代对象内包含__iter__方法,该方法返回迭代器。

而迭代器是包含next方法和__iter__方法,__iter_方法返回其自身(经测试不包含__iter__不行)

可迭代对象:

class Iterable_:

   def __iter__(self):

       print ("haha")

       return iter([1, 2, 3]) 

for i in Iterable_(): 

    print "iterable:" + str(i)

 

#输出

haha

iterable:1

iterable:2

iterable:3

迭代器是:

class Iterator_:

   def __init__(self, s, e): 

       self.current = s 

       self.end = e 

   def __iter__(self):

       return self

   def next(self):

       if self.current < self.end:

           self.index = self.current

           self.current += 1

           return self.index

       else:

           raise StopIteration

it = Iterator_(5, 8)

for i in it: 

    print "iterator:" + str(i)

#never print

for i in it: 

    print "second iterator:" + str(i)

#print again

it = Iterator_(5, 8)

for i in it: 

    print "second iterator:" + str(i)

#输出

iterator:5

iterator:6

iterator:7

second iterator:5

second iterator:6

second iterator:7

 总结一下:迭代器和生成器均含有iter()和next(),其中iter方法是返回其自身。二者的区别是迭代器需要我们手动创建类,类中要实现iert和next方法,迭代器就是该类的对象。而生成器就要简单一些,不必实现以上二者方法,只需要将一个函数的return改为yield,那么该函数返回的将是一个生成器,或者可以用生成式生成。而可迭代对象是只含有iter(),并且这个iter的功能是返回一个迭代器

 

 

生成器在python2,python3中的区别,原因未知:

在python2中,定义生成器的函数中,不能return某个值,包括None值也不行,比如return 1,return None,只可以单独一个return,后面不接任何返回值

而在python3中却没有这方面的避讳,但是没什么意义,因为在用for循环的时候,无法拿到我们定义的返回值,除非,我们捕获StopIteration异常

1 def fib(max): 2     n= 0 3     b=1 4     while n < max: 5         yield b 6         n = n + 1 7     return 'done' 8 for i in fib(3): 9     print (i)10 11 """输出结果:12 113 114 115 """16 #除非我们捕获异常:17 g = fib(3)18 while True:19     try:20         x = next(g)21         print(x)22     except StopIteration as e:23         print('Generator return value:', e.value)24         break25 26 """输出结果:27 128 129 130 Generator return value: done31 """

 

转载于:https://www.cnblogs.com/saolv/p/8436954.html

你可能感兴趣的文章
JavaScript面试题
查看>>
[转帖]架构师眼中的高并发架构
查看>>
ios的一些开源资源
查看>>
HTTP 错误 500.21 - Internal Server Error 解决方案
查看>>
Bucks sign Sanders to $44 million extension
查看>>
【PHP】Windows下配置用mail()发送邮件
查看>>
Nhibernate和EF的区别
查看>>
基于java spring框架开发部标1078视频监控平台精华文章索引
查看>>
人类简史
查看>>
java 设计模式学习
查看>>
【Python使用】使用pip安装卸载Python包(含离线安装Python包)未完成???
查看>>
一语道破项目管理知识体系五大过程组
查看>>
C# 备份、还原、拷贝远程文件夹
查看>>
在windows环境下运行compass文件出现的错误提示解决方案
查看>>
CSS常用样式--font
查看>>
恩如氏--蜗牛精华补水蚕丝面膜
查看>>
大工具-收藏
查看>>
codevs3027 线段覆盖 2
查看>>
markdown
查看>>
【leetcode】107-Binary Tree Level Order Traversal II
查看>>