yield

python函数-迭代器&生成器

只谈情不闲聊 提交于 2019-12-27 03:45:11
python函数-迭代器&生成器 一、迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议:     ① 协议内容:内部实现__iter__方法     ② 验证方法:dir()方法。通过dir()方法查看是否含有__iter__方法     ③ __iter__方法的作用:可迭代的数据类型执行__iter__方法后会生成一个迭代器对象 print([1,2].__iter__()) 结果 <list_iterator object at 0x1024784a8> 2 迭代器协议   1 引出 ''' dir([1,2].__iter__())是列表迭代器中实现的所有方法,dir([1,2])是列表中实现的所有方法,都是以列表的形式返回给我们的,为了看的更清楚,我们分别把他们转换成集合, 然后取差集。 '''#实现的所有方法 print(dir([1,2].__iter__())) print(dir([1,2]))#取差集 print(set(dir([1,2].__iter__()))-set(dir([1,2]))) 结果: {'__length_hint__', '__next__', '__setstate__'}   我们看到在列表迭代器中多了三个方法,那么这三个方法都分别做了什么事呢? iter_l = [1,2

列表生成式,生成器和迭代器

ぐ巨炮叔叔 提交于 2019-12-27 03:43:43
1.列表生成式 语法:[条件表达式 for i in iterable] a=list(range(10)) b=[i+1 for i in a] #这种形式就是列表生成式 print(b) 用列表生成式可以简化代码,等价于下面的几种方法: 1 #方法一 2 a=list(range(10)) 3 b=[] 4 for i in a: 5 b.append(i+1) 6 7 print(b) 8 9 #方法二 10 a=list(range(10)) 11 for index,i in enumerate(a): 12 a[index]+=1 13 print(a) 14 15 #方法三 16 a=list(range(10)) 17 a=map(lambda a:a+1,a) #返回的是一个内存地址,想要调用需要用for循环 18 for i in a: 19 print(i) 2.生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中

【python基础】迭代器和生成器函数

左心房为你撑大大i 提交于 2019-12-27 03:29:55
1、迭代器协议: 1、迭代器协议是指:对象必须提供一个 __next__() 方法,执行该方法要么返回迭代中的下一项,要么就引起一个 StopIteration 异常,以终止迭代(只能往后走不能往前退) 2、可迭代对象: 实现了迭代器协议的对象 (如何实现:对象内部定义了一个__iter__()方法) 3、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。 注意: iter.ls__next__() #__next__() ---->next() __next__() 是迭代器内置函数,而next() 是python内置函数,两者效果相同 字符串、列表、元组、字典、集合等 都不是可迭代对象,但是能够被for循环, for循环其实就是先把它们转化为可迭代对象( li.__iter__()或者iter(li) ),然后进行__next__()方法一个个取出 >>> a = iter([1,2,3,4,5]) >>> a <list_iterator object at 0x101402630> >>> a.__next__() 1 >>> a.__next__() 2 >>> a.__next__() 3 >>> a.__next__() 4 >>> a.__next__() 5 >>> a._

迭代器和生成器

房东的猫 提交于 2019-12-27 03:22:15
一、什么是迭代器 迭代指的是一个重复的过程,每一次重复都是基于上一次的结果而来的 # 这里的循环也是一个迭代,每次基于上一次的结果而取值 li = 'hello' i = 0 while i < len(li): print(li[i]) i += 1 迭代器指的是迭代取值的工具,该工具的特点是可以不依赖于索引取值 二、为何要用迭代器   为了找出一种通用的、可以不依赖于索引的迭代取值方式 三、如何使用迭代器 可迭代的对象: 但凡内置有 __iter__ 方法的对象都称之为可迭代的对象    如:str、list、tuple、dict、set、文件对象 迭代器对象: 既内置有 __iter__方法,又内置有 __next__ 方法    如:文件对象 关于 __iter__ 方法:   调用可迭代对象的 __iter__ 会的到一个迭代器对象   调用迭代器对象的 __iter__ 会的到迭代器本身 可迭代对象可以转化为迭代器对象:调用可迭代对象内置的 __iter__ 方法会有一个返回值,该返回值就是对应的迭代器对象 dic = {'x':1, 'y':2, 'z':3} iter_dic = dic.__iter__() print(iter_dic) res1 = iter_dic.__next__() print(res1) res2 = iter_dic.__next__

生成器和迭代器

怎甘沉沦 提交于 2019-12-27 03:20:48
迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 1.可迭代对象 有 __iter__ 方法的对象,都是可迭代对象,有以下6种 可迭代的对象:Python内置str、list、tuple、dict、set、file都是可迭代对象 "zx".__iter__() ["zx"].__iter__() {"zx":"wl"}.__iter__() ("zx",).__iter__() {"z","x"}.__iter__() with open("prize.txt","r") as file: file.__iter__() 2.迭代器对象 1.可迭代的对象执行 __iter__ 方法得到的返回值是迭代器对象。2.迭代器对象指的是即内置有 __iter__ 又内置有 __next__ 方法的对象 list=[1,2,3,4,5,6] zx=list.__iter__() while True: try: print(zx.__next__()) except: break 文件类型是迭代器对象 open('a.txt')._

迭代器与生成器

泪湿孤枕 提交于 2019-12-27 03:18:35
迭代器 我们已经知道,可以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等; 一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。 而生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。 *可以被 next() 函数调用并不断返回下一个值的对象称为迭代器: Iterator 。 生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。 把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数。 这是因为Python的 Iterator 对象表示的是一个数据流,Iterator对象可以被 next() 函数调用并不断返回下一个数据,直到没有数据时抛出 StopIteration 错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以 Iterator

迭代器 生成器

跟風遠走 提交于 2019-12-27 03:16:28
迭代: 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值 1 while True: 2 print('哈') #只是单纯的重复,因此不是迭代 3 4 lists = [1, 2, 3] 5 count = 0 6 while count < len(lists): 7 print(lists[count]) 8 count += 1 迭代的概念 为何要有迭代器: 对于序列类型的数据(列表,元组,字符串),我们可以使用索引的方法迭代取出每个元素,但对于非序列类型(集合,字典,文件类型等)这类没有的索引的数据,我们就无法使用上述方法,因此就要使用迭代器 迭代器协议: 对象必须提供一个next方法,执行该方法的结束是要么返回迭代中的下一项,要么就引起一个Stoplteration异常以终止迭代(只能前进不能后退) 可迭代对象: 内置有__iter__方法的对象,即obj.__iter__() 1 'hello'.__iter__() 2 [1, 2, 3].__iter__() 3 ('a', 'b', 1).__iter__() 4 {'name': 'chen', 'age': 18}.__iter__() 5 {'a', 1}.__iter__() 6 open('test').__iter__() 可迭代对象 迭代器对象: 可迭代对象执行obj.

迭代器

半世苍凉 提交于 2019-12-27 03:13:01
迭代器的概念:从装多个值的容器中一次取出一个值给外界 器:包含了多个值得容器 迭代:循环反馈(一次从容器中取出一个值) 通过迭代器取值的优缺点: 优点:不依赖索引取值 缺点:不能计算长度,不能指定取值(只能从前往后逐一取值) 遍历:被遍历的对象必须是有序容器 案例; ls='asasd' for i in ls: print(i) ls1=[1,2,12] for i in ls1: print(i) ls = [1, 2, 3, 4, 5, 6] i=0 while i <len(ls): print(i) i+=1 st = {1, 2, 3, 4, 5} while i <len(st): print(i) i+=1 dic = {'a': 1, 'b': 2, 'c': 3} for k,v in dic.items(): print(k,v) 可迭代对象 对象:python中的一个对象(装有地址的变量) 可迭代对象:该对象有__iter__()方法,调用该方法返回迭代器对像 可迭代对象有哪些: str | list | tuple | dict | set | range() | file(文件) | 迭代器对象 | enumerate()(枚举对象) 案例 for v in 'asdfghjkl'.__iter__(): print(v) for v in [1,23,

python菜鸟学习Day12(yield)

家住魔仙堡 提交于 2019-12-26 19:38:44
在python中,带yield的函数称为生成器(generator),python对协程的支持也是通过生成器实现的。 yield 首先将yield当成一个断点标记,中断,return 。当程序执行到yield处,返回yield后边的变量,中断。其他程序获取这个变量,调用生成器的next()函数,程序又回到生成器,接着向下执行。 一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。 def foo ( ) : print ( "starting..." ) while True : res = yield 4 print ( "res:" , res ) g = foo ( ) print ( next ( g ) ) print ( "*" * 20 ) print ( next ( g ) ) 执行结果 starting . . . 4 ** ** **

Python 开源异步并发框架的未来(转)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-26 18:41:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Python 开源异步并发框架的未来 fantix 1.1k 2014年04月16日 发布 推荐 4 推荐 收藏 31 收藏, 8.9k 浏览 呵呵,这个标题有点大,其实只是想从零开始介绍一下异步的基础,以及 Python 开源异步并发框架的发展和互操作性。 另外,这是我在 OSTC 2014 做的一个 20140330-OSTC-分论坛1王川 http://v.youku.com/v_show/id_XNjk2ODI0ODQ4.html ,幻灯片在 这里 ,欢迎拍砖。 开源 Python 是开源的,介绍的这几个框架 Twisted 、 Tornado 、 Gevent 和 tulip 也都是开源的,最后这个演讲是在开源大会弄的,所以标题里肯定少不了开源。另外,我的 gevent3 项目也是开源的——貌似不少同学被我起的极品名字给搞混了,特别说明一下, gevent3 虽然有跟 Gevent 一样的接口外貌,但底层却是 tulip 驱动的(考虑把名字改回 gulip 之类的);请区别于将来会支持 Python 3 的 Gevent 1.1。 非阻塞 先上一段代码。请原谅我用 Python 代码充当伪代码了,但 Python 的语法实在是太简单了,忍不住啊。 import sockets = socket