迭代器

迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器。

常见的迭代器有 (列表、元祖、字典、字符串、文件 等),通常我们是使用for语句完成迭代

#使用for 迭代字典的例子:>>> links = {"鱼C工作室":"http://www.fishc.com/",
     "鱼C论坛":"http://bbc.fishc.com"}
>>> for each in links:
    print("%s-->%s" %(each,links[each]));

鱼C论坛-->http://bbc.fishc.com
鱼C工作室-->http://www.fishc.com/
>>> 

Python自己提供了两个BIF函数  iter() ,   next()  

  对于一个对象使用iter()函数就得到它的迭代器对象

  调用next()迭代器就会返回下一个值

  迭代结束的标识:Python抛出一个StopIteration异常.

>>> string = "
>>> it = iter(string)
>>> next(it)
'
>>> next(it)
'
>>> next(it)
'
>>> next(it)
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    next(it)
StopIteration
>>> 

iter()对应的魔法方法是__iter__(), next()对应的魔法方法是__next__()

__iter__() 实际上是 return self, next()决定了迭代器的规则

>>> class Fibs:
    def __init__(self,n=10):
        self.a = 0
        self.b = 1
        self.n = n

    def __iter__(self):
        return self

    def __next__(self):
        self.a,self.b = self.b,self.a+self.b
        if self.a>self.n:
            raise StopIteration
        return self.a

>>> fibs = Fibs()
>>> for each in fibs:
    print(each)

1
1
2
3
5
8
>>> fibs = Fibs(100)
>>> for each in fibs:
    print(each)

1
1
2
3
5
8
13
21
34
55
89
>>> 

 生成器

一旦一个函数中有 yield,它就是生成器 , yield相当于return,函数遇到yield就会返回yield后面的值,函数处于暂停状态

生成器是一个特殊的迭代器

协同程序:可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始.

>>> def MyGen():
    print ("生成器被执行!")
    yield 1
    yield 2

>>> myG = MyGen()
>>> next(myG)
生成器被执行!
1
>>> next(myG)
2
>>> next(myG)
Traceback (most recent call last):
  File "<pyshell#69>", line 1, in <module>
    next(myG)
StopIteration
>>> 

生成器推导式的应用.

>>> #列表推导式
>>> # 在列表中加一个for语句
>>> a = [i for i in range(50) if not (i%2) and i%3]
>>> a
[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46]
>>>
>>> #字典推导式
>>> b = {i:i%2==0 for i in range(10)}
>>> b
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
>>>
>>> # 集合推导式
>>> c = {i for i in [1,2,3,2,4,2,4,6,4,7]}
>>> c
{1, 2, 3, 4, 6, 7}
>>> #元组
>>> e = (i for i in range(10))
>>> e
<generator object <genexpr> at 0x02113030>
>>> # 这里的e就是生成器 推导式
>>> next(e)
0
>>> for each in e:
print(each)

1
2
3
4
5
6
7
8
9
>>> # 生成器推导式作为函数的参数时,不用加括号
>>> sum(i for i in range(100) if i%2)
2500
>>>

扩展阅读:解释 yield 和 Generators(生成器)

Python学习笔记010_迭代器_生成器的更多相关文章

  1. python学习笔记四 迭代器,生成器,装饰器(基础篇)

    迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...

  2. python学习笔记之迭代器和函数(第三天)

    一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...

  3. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  4. python 3.x 学习笔记6 ( 迭代器 and 生成器 )

    1.迭代器(Iterator):   可以被next()函数调用并不断返回下一个值的对象,成为迭代器:Iterator  可以直接用于for 循环的对象统称为可迭代对象:Iterable 迭代,顾名思 ...

  5. Python学习之路——迭代器、生成器、算法基础、正则

    一.迭代器: 迭代器是访问集合元素的一种方式. 迭代器对象是从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 另外,迭代 ...

  6. Python学习(三):迭代器、生成器、装饰器、递归、算法、正则

    1.迭代器 迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历 ...

  7. python3学习笔记10(迭代器和生成器)

    参考http://www.runoob.com/python3/python3-iterator-generator.html 迭代器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束 ...

  8. Python学习笔记014——迭代器 Iterator

    1 迭代器的定义 凡是能被next()函数调用并不断返回一个值的对象均称之为迭代器(Iterator) 2 迭代器的说明 Python中的Iterator对象表示的是一个数据流,被函数next()函数 ...

  9. Python学习笔记:迭代器(Iterator)详解

    一.可迭代的对象(Iterable) 1.定义:可以直接用在循环的数据类型,如list,tuple,dict,set,str,还有generator(生成器), 和带yield的函数,这些直接可以用在 ...

随机推荐

  1. How to sort the dictionary by the value field

    // Sort dictionary by the value field List<KeyValuePair<int, int>> redBallsList = redBal ...

  2. .NET Core 2.0迁移技巧之MemoryCache问题修复

    对于传统的.NET Framework项目而言,System.Runtime.Caching命名空间是常用的工具了,其中MemoryCache类则常被用于实现内存缓存. .NET Core 2.0暂时 ...

  3. 关于Java String 类型转换时null的问题(转)

    关于Java String 类型转换时null的问题 开发中经常遇到从集合类List.Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPoi ...

  4. malloc/free 的使用要点

    函数malloc的原型如下: void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存,程序如下: int   *p = (int *)mall ...

  5. tensorflow安装调试总结(持续更新)

    这段时间需要部署tensorflow到linux上,由于堡垒机不能连外网,所以pip.apt-get.wget.git统统不能用,然后就是各种调试了,下面整理了一些遇到的问题和解决方案,供大家参考(C ...

  6. 2015苏州大学ACM-ICPC集训队选拔赛(3)题解

    第三次校赛链接:快戳我 1001 考虑前半组数,我们只需要标记每个数出现的次数,再加上这个数之前的数出现的次数,即为这个数在m次操作中总共需要翻转的次数(即求前缀和),再根据翻转的奇偶性判断最后这个位 ...

  7. cacti监控系统

    cacti 1. cacti安装 IP: 172.25.44.1 环境: Red Hat 6.5 镜像: rhel-server-6.5-x86_64-dvd.iso 火墙: /etc/init.d/ ...

  8. linux下操作mysql

    有关mysql数据库方面的操作,必须首先登录到mysql中. 开启MySQL服务后,使用MySQL命令可以登录.一般使用mysql -uroot -p即可.如果数据库不是本机,则需要加参数,常用参数如 ...

  9. 通过业务系统的重构实践DDD

    最近新接了一个业务系统——社区服务系统,为了快速熟悉和梳理老系统的业务逻辑和代码,同时对老系统代码做一些优化,于是打算花上一个月时间不间断地对老系统服务进行重构.同时,考虑到社区业务的复杂性,想起了之 ...

  10. jsp、freemarker、velocity区别详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt172 在java领域,表现层技术主要有三种:jsp.freemarker.v ...