yield

Python基础语法 - 列表生成器

妖精的绣舞 提交于 2020-03-24 14:59:59
列表生成式 1. L = [x for x in range(5)] print(L) #[0, 1, 2, 3, 4] 2. L = [x*2 for x in range(5)] print(L)  #[0, 2, 4, 6, 8] 3. def f(n): return n**3 a = [f(x) for x in range(5)] print(a) #[0, 1, 8, 27, 64] 生成器 Python有两种不同的方式提供生成器: 生成器表达式: 定义:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的 [] 改成 () ,就创建了一个generator: g = (x*2 for x in range

python3之迭代器&生成器

China☆狼群 提交于 2020-03-23 07:06:06
1、迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: iter() 生成迭代器和 next() 遍历迭代器元素。 >>> dil = iter(range(10)) #使用iter方法创建一个迭代器 >>> print(type(dil)) #类型为迭代器 <class 'range_iterator'> >>> print(dil) <range_iterator object at 0x7fb9bf466ed0> >>> l1 = [1,2,3,4,5] >>> it = iter(l1) #将列表转换为迭代器 >>> print(type(it)) <class 'list_iterator'> >>> print(it) <list_iterator object at 0x7fb9bf42e9e8> >>> print(next(it)) 1 >>> print(next(it)) 2 >>> print(next(it)) 3 >>> print(next(it)) 4 >>> print(next(it)) 5 >>> print(next(it)) #如果迭代器元素到最后没有了就会报错

python-17

僤鯓⒐⒋嵵緔 提交于 2020-03-17 04:53:59
1 # 列表生成式 2 a = [x*2 for x in range(10)] # 这两个变量必须一致 3 print(a) 4 5 #列表 元组的高级赋值办法 6 b,c = ["123",6] 7 print(b) #123 8 print(c) #6 1 # python的垃圾回收机制 2 #给变量赋值的时候值的内存地址被变量引用 3 #如果值的内存地址没有被任何对象引用的话,python就将该内存进行回收释放 4 5 #生成器额2种创建方式 6 7 #生成器的创建方式一: 8 a = (x*2 for x in range(10)) 9 #print(a) <generator object <genexpr> at 0x0000000001DEA1B0> 目前没有任何值,只是个迭代器 10 11 #生成器的创建方式二: 12 #在函数内部使用yield关键字创建生成器 13 #函数本身不是生成器,但是函数的执行就是生成器 如 test() 就是个生成器 14 15 def test(): 16 print("ok") 17 yield 2 #yield后面的值相当于返回值 18 print("ok2") 19 yield 5 20 21 #生成器中值的遍历next()方法 22 #生成器可以当成迭代器去使用for方法迭代 for i in a: next(i) 23 a

sleep()和yield()有什么区别?

不羁的心 提交于 2020-03-13 00:25:40
sleep() 方法给其他线程运行机会时 不考虑线程的优先级 ,因此会给低优先级的线程以运行的机会; yield() 方法只会给 相同优先级或更高优先级的线程 以运行的机会; 线程执行 sleep() 方法后转入阻塞 ( blocked )状态,而执行 yield() 方法后转入就绪 ( ready )状态; sleep() 方法声明抛出 InterruptedException ,而 yield() 方法没有声明任何异常; sleep() 方法 比 yield() 方法(跟操作系统相关)具有 更好的可移植性 。 来源: oschina 链接: https://my.oschina.net/u/4143249/blog/3192958

ES6 - Generator生成器

谁都会走 提交于 2020-03-11 11:02:34
基本概念 Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个 状态机 ,封装了多个内部状态。 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。 Generator 函数是一个普通函数,但是有两个特征。一是, function 关键字与函数名之间有一个星号;二是,函数体内部使用 yield 表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。 function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); 调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象 下一步,必须调用遍历器对象的 next 方法,使得指针移向下一个状态。也就是说,每次调用 next 方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个 yield 表达式(或 return 语句)为止。换言之,Generator 函数是分段执行的,yield表达式是 暂停

Python3 yield使用总结

送分小仙女□ 提交于 2020-03-10 23:52:01
最近开始学习爬虫框架Scrapy,看大牛写的博客时,发现有段代码不知道如何理解,对,就是它:关键字yield该怎么理解? 在详细查询了文档说明后,得出以下结论: 一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。 yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。 用下面的一段代码就非常好理解了。 若用next()分开执行代码(python2用next(),python3用__next__()), 当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。 所以优点就是利用迭代,减少内存消耗,代码更简洁;

Python天天美味(25) - 深入理解yield

∥☆過路亽.° 提交于 2020-03-10 23:11:43
Python天天美味(25) - 深入理解yield - CoderZh - 博客园 Python天天美味(25) - 深入理解yield yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist(alist): for i in alist: yield i + 1 取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项: alist = [ 1 , 2 , 3 , 4 ] for x in addlist(alist): print x, 这的确是yield应用的一个例子,但是,看过limodou的文章《 2.5版yield之学习心得 》,并自己反复体验后,对yield有了一个全新的理解。 1. 包含yield的函数 假如你看到某个函数包含了yield,这意味着这个函数已经是一个Generator,它的执行会和其他普通的函数有很多不同。比如下面的简单的函数: def h(): print ' To be brave ' yield 5 h() 可以看到,调用h()之后,print 语句并没有执行!这就是yield,那么,如何让print 语句执行呢?这就是后面要讨论的问题,通过后面的讨论和学习,就会明白yield的工作原理了

Python天天美味(25) - 深入理解yield

大憨熊 提交于 2020-03-10 23:08:41
Python天天美味(25) - 深入理解yield - CoderZh - 博客园 Python天天美味(25) - 深入理解yield yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist(alist): for i in alist: yield i + 1 取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项: alist = [ 1 , 2 , 3 , 4 ] for x in addlist(alist): print x, 这的确是yield应用的一个例子,但是,看过limodou的文章《 2.5版yield之学习心得 》,并自己反复体验后,对yield有了一个全新的理解。 1. 包含yield的函数 假如你看到某个函数包含了yield,这意味着这个函数已经是一个Generator,它的执行会和其他普通的函数有很多不同。比如下面的简单的函数: def h(): print ' To be brave ' yield 5 h() 可以看到,调用h()之后,print 语句并没有执行!这就是yield,那么,如何让print 语句执行呢?这就是后面要讨论的问题,通过后面的讨论和学习,就会明白yield的工作原理了

生成器(generator)

南楼画角 提交于 2020-03-10 19:44:01
1. 什么是生成器   通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且, 创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后 面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否 可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。 在 Python中,这种一边循环一边计算的机制,称为生成器:generator。 2. 创建生成器方法1 要创建一个生成器,有很多种方法。第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( ) #列表生成式(列表推导式) l = [i for i in range(0,10,2)] print(l) # 生成器 g = (i for i in range(0,10,2)) print(g) 结果为: [0, 2, 4, 6, 8] <generator object <genexpr> at 0x00000000029B2BF8> 创建 L 和 G 的区别仅在于最外层的 [ ] 和 ( ) , L 是一个列表,而 G 是一个生成器。我们可以直接打印 出L的每一个元素,但我们怎么打印出G的每一个元素呢?如果要一个一个打印出来,可以通过 next() 函数 获得生成器的下一个返回值:

05-课堂笔记

半世苍凉 提交于 2020-03-10 05:32:32
复习 '''1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改内部内容,实参会跟着变化 位置实参 - 只能对位置形参赋值 关键字实参 - 可以对所有(不包含可变长位置形参)形参赋值 位置形参 - 必须出现在最前,且必须传值 默认形参 - 出现在位置形参后*前,可以不用传参 可变长位置形参 - 接收所有位置形参、默认形参没有接收完的位置实参 有无默认值关键字形参 - 必须出现在所有位置形参之后,有默认值可以不用传参,没有默认值必须通过关键字实参传值 可变长关键字形参 - 接收所有有名字的关键字形参没有接收完的关键字实参 def fn(a, b=10, *args, c, d=20, e, **kwargs): pass​ 2.函数的嵌套调用 在一个函数的内部调用另一个函数:在函数内部遇到调用其他函数,就进入其他函数内部,全部走完 回到调用其他函数 的入口​3.函数对象 - 直接赋值、可以加()调用、作为其他函数的参、作为函数的返回值、作为容器对象的元素(成员)4.名称空间与作用域 - LEGB:查找顺序LEGB | 加载顺序BGEL 5.函数的嵌套定义 - 闭包 - 函数的嵌套定义:在一个函数内部定义另一个函数,内部的函数就是闭包 - 应用场景: -