Python进阶----生成器@.@
来源:互联网 发布:淘宝怎么修改送货地址 编辑:程序博客网 时间:2024/06/17 19:31
生成器
""" 可迭代对象(Iterable): Python中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象迭代器(Iterator)任意对象,只要定义了next(Python2) 或者__next__方法,它就是一个迭代器 迭代对象具有两个特殊的成员方法__iter__()和__next__(),这两个方法便是支持迭代器协议所需要实现的方法。其中__iter__()方法返回迭代器对象本身,__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常迭代(Iteration)它就是从某个地方(比如一个列表)取出一个元素的过程。当我们使用一个循环来遍历某个东西时,这个过程本身就叫迭代。 生成器(Generator) 生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。 """#迭代器我们可以自己实现迭代器协议创建迭代器对象,要实现迭代器协议也就是要在类中实现__iter__()和__next__()方法。class ListIterator(object):def __init__(self,data):self.__data =dataself.__count= 0def __iter__(self):return selfdef __next__(self):if self.__count < len(self.__data):val = self.__data[self.__count]self.__count +=1return valelse:raise StopIterationa = ListIterator([1,2,3,4,5])for i in a:print(i)a = ListIterator([1,2,3,4,5])#内部的工作原理应该是这样的while True:try:#print('test')i = a.__next__()print('this is a :',i)print(i,end='-')except StopIteration:break#可迭代对象是实现了__iter__()方法的对象,__iter__()可以返回一个迭代器对象。#迭代器对象是实现了__next__()方法的对象,其中他的__iter__()返回的是迭代器对象本身a = ListIterator([1,2,3,4,5])[i for i in a][i for i in a]print("\n生成器的多次迭代:")class ListIteratorable(object):def __init__(self,data):self.__data =datadef __iter__(self):print("call iterable __iter__()")return ListIterator(self.__data)a = ListIteratorable([1,2,4,5,6])b = a.__iter__()print(a)print(b)def generator_function():for i in range(1,10):yield ifor item in generator_function():print(item)#生成器最佳应用场景是:你不想同一时间将所有计算出来的大量结果集分配到内存当中,特别是结果集里还包含循环。def fibon(n):a=b=1for i in range(n):yield aa,b=b,a+bfor x in fibon(1):print(x)"""my_string = "Yasoob"next(my_string)iter。它将根据一个可迭代对象返回一个迭代器对象。"""my_string = "Yasoob"my_iter = iter(my_string)print(next(my_iter))def odd(): n=1 while True: yield n n+=2odd_num = odd()count = 0for o in odd_num: if count >=5: break print(o) count +=1print("生成器的send()")def gen():value = 0while True:receive = yield valueif receive == 'e':breakvalue = 'got : %s' % receiveg=gen()print(next(g))#print(g.send(None))print(g.send('aaa'))"""可以通过generator.send(arg)来传入参数,这是协程模型。通过g.send(None)或者next(g)可以启动生成器函数,并执行到第一个yield语句结束的位置。此时,执行完了yield语句,但是没有给receive赋值。yield value会输出初始值0注意:在启动生成器函数时只能send(None),如果试图输入其它的值都会得到错误提示信息。通过g.send(‘aaa’),会传入aaa,并赋值给receive,然后计算出value的值,并回到while头部,执行yield value语句有停止。此时yield value会输出”got: aaa”,然后挂起。"""
阅读全文
0 0
- Python进阶----生成器@.@
- Python 进阶_生成器 & 生成器表达式
- Python 进阶_生成器 & 生成器表达式
- Python 进阶_生成器 & 生成器表达式
- Python 进阶 —— 迭代器与生成器
- <Python进阶读书笔记>之(二) 生成器
- Python进阶之迭代器和生成器
- python进阶之生成器与yield
- python学习-面向对象进阶之生成器(十一)
- python基础-生成器进阶(send、from)、各种推导式、生成器表达式
- Python 生成器
- Python生成器
- python生成器
- python 生成器
- python生成器
- python生成器
- python生成器
- python生成器
- keras 多分类一些函数参数设置
- 姚期智:中国金融科技发展的真正挑战是什么?如何解决? 本文作者:温晓桦2017-09-17 18:31 导语:“在金融科技里面,计算机科学的用途已经从台后走到了台中,对核心金融体系的运作上产生一定的
- android NFC通信初探
- 电子护照OCR识别并支持读取功能
- 购物车
- Python进阶----生成器@.@
- Java虚拟机详解——JVM常见问题总结
- VMware 12.5 pro下载+激活密钥 转载 2016年11月28日 00:06:02 270300 热门虚拟机软件VMware Workstation Pro现已更新至v12.5.2。12.0
- 一个菜鸟处理关于ajax向后台传值的问题
- 有很多if-else,该如何优化?
- 大端和小端格式的区别,以及二维数组和指针数组的学习总结。
- WebSocket学习(一)——webSocket简介
- hdu 6216 A Cubic number and A Cubic Number
- 用MR实现Join逻辑的两种方法