yield

可迭代对象,生成器,迭代器

大城市里の小女人 提交于 2020-02-26 02:33:11
可迭代对象 str,tuple,dict,list,set,bytes都为可迭代对象 range的结果是一个 range 对象,是一个可迭代对象 可迭代对象的本质: 在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据。 那么也就是说, 一个具备了_ _iter _ _方法的对象,就是一个可迭代对象。 迭代器 python中只要实现了 __iter__ 和 __next__ 方法的对象都可以称之为迭代器, _ _iter _ _() 方法返回一个特殊的迭代器对象,迭代器的 _ _ iter _ _() 返回⾃身, 这个迭代器对象实现了 _ _next _ _() 方法返回下一个值并通过 StopIteration 异常标识迭代的完成。 迭代器是一个带状态的对象,可以记录迭代的位置。 str / bytes / list / tuple / dict / set ⾃身不是迭代器,他 们⾃身不具备 _ _next _ _() , 但是具有 _ _iter _ _() , _ _iter _ _() ⽅法 ⽤来把⾃身转换成⼀个迭代器 In [ 1 ] : s = 'asdfghh' #字符串为可迭代对象 In [ 2 ] : si = s . __iter__ ( ) #调用__iter__()方法返回一个迭代器 In [ 3

Lua的协程和协程库详解

无人久伴 提交于 2020-02-24 03:14:06
转: https://www.cnblogs.com/zrtqsk/p/4374360.html 我们首先介绍一下什么是协程、然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法。 一、协程是什么?   (1)线程   首先复习一下多线程。我们都知道线程——Thread。每一个线程都代表一个执行序列。   当我们在程序中创建多线程的时候,看起来,同一时刻多个线程是同时执行的,不过实质上多个线程是并发的,因为只有一个CPU,所以实质上同一个时刻只有一个线程在执行。   在一个时间片内执行哪个线程是不确定的,我们可以控制线程的优先级,不过真正的线程调度由CPU的调度决定。   (2)协程   那什么是协程呢?协程跟线程都代表一个执行序列。不同的是,协程把线程中不确定的地方尽可能的去掉,执行序列间的切换不再由CPU隐藏的进行,而是由程序显式的进行。   所以,使用协程实现并发,需要多个协程彼此协作。 二、resume和yeild的协作。   resume和yeild的协作是Lua协程的核心。这边用一幅图描述一下,有一个大体的印象。对照下面的coroutine库的详细解释和最后的代码,应该可以搞清楚协程的概念了。   注:这是在非首次resume协程的情况下,resume和yield的互相调用的情况。如果是首次resume协程

ruby 学习精简笔记

时光毁灭记忆、已成空白 提交于 2020-02-18 07:02:47
============================================================================ 1、控制器中的方法可以相互调用吗 2、控制方法中定义的@变量是不是实例变量,它貌似只能在控制器方法对应的view中应用,不能被其他view使用 3、text_field等的传值方式,表单的传值方式 4、activeRecord的关系映射 ============================================================================ ruby中的代码每个语句放在单独的行数,不需要在每个句子的末尾加上分号 ruby的变量不需要预先声明,可以在使用的时候直接赋值,根据赋值的类型确定变量类型 ruby字符串中含有表达式或者变量用#{表达式},如果是全局变量或实例变量则可以不用花括号 $greeting="helllo" @name="prudence" puts "#$greeting,#@name" 方法以def...end的形式表示 ruby方法所返回的值,是最后一个被求值的表达式的值,可以省略return. ruby使用一种命名惯例来区分名称的用途:名称的第一个字符显示这个名称如何使用, 局部变量、方法参数和方法名称都必须使用小写或者下划线,全局变量都用美元符号($)为前缀;

Python进阶06 循环对象

▼魔方 西西 提交于 2020-02-16 09:56:43
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念。 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标准形式。 什么是循环对象 循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在python 3x中), 这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出StopIteration错误。 当一个循环结构(比如for)调用循环对象时,它就会每次循环的时候调用next()方法,直到StopIteration出现,for循环接收到,就知道循环已经结束,停止调用next()。 假设我们有一个test.txt的文件: 1234 abcd efg 我们运行一下python命令行: >>>f = open('test.txt') >>>f.next() >>>f.next() ... 不断输入f.next(),直到最后出现StopIteration open()返回的实际上是一个循环对象,包含有next()方法。而该next()方法每次返回的就是新的一行的内容,到达文件结尾时举出StopIteration。这样,我们相当于手工进行了循环。

python笔记18(复习)

点点圈 提交于 2020-02-14 23:32:32
今日内容 复习 内容详细 1.Python入门 1.1 环境的搭建 mac系统上搭建python环境。 环境变量的作用:方便在命令行(终端)执行可执行程序,将可执行程序所在的目录添加到环境变量,那么以后无需再输入路径。 1.2 变量命名 变量 name = 'alex' 全局变量 NAME = "oldboy" 函数 def func_list(): pass 常量 不允许修改的值,Python中执行约定。 1.3 运算符 v = 1 or 2 v = 0 or 2 v = 1 and 2 v = 0 and 2 val = v if v else 666 val = v or 666 # 源码 is和==的区别? 1.4 数据类型 int 整型 其他进制转换十进制 int('0b11011',base=2) int / long 除法 bool 0 None 空 str,字符串类型,一般用于内存中做数据操作。 v = 'alex' # unicode编码存储在内存。 bytes,字节类型,一般用于数据存储和网络传输。 v = 'alex'.encode('utf-8') # 将字符串转换成字节(由unicode编码转换为utf-8编码) v = 'alex'.encode('gbk') # 将字符串转换成字节(由unicode编码转换为gbk编码) list tuple dict

迭代器&生成器

痴心易碎 提交于 2020-02-14 00:25:06
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: iter() 和 next() 。 字符串,列表或元组对象都可用于创建迭代器: ## 单独创建迭代器用法 list = [1,"qiao_2",3,"yan_4"] s=iter(list)  #创建迭代器 print(next(s)) #输出迭代器的下一个元素 print(next(s)) print(next(s)) print(next(s)) for与创建迭代器 list = [1,"qiao_2",3,"yan_4"] it = iter(list) # 创建迭代器对象 for i in it: print (i, end=" ") #不回车输出 也可以使用 next() 函数: import sys  #引入sys模块 list = [1,"qiao_2",3,"yan_4"] s = iter(list)  #创建迭代器 while True: try: print (next(s)) except StopIteration: sys.exit() 生成器 在 Python 中,使用了 yield 的函数被称为生成器(generator)。

Generator

血红的双手。 提交于 2020-02-13 05:00:14
基本概念 Generator函数是ES6提供的一种异步编程解决办法,语法行为与传统函数完全不同。 Generator函数有多种理解角度。语法上,首先可以把它理解成,Generator函数是一个状态机,封装了多个内部状态。 执行Generator函数会返回一个遍历器对象,也就是说,Generator函数除了状态机,还有一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历Generator函数内部的每一个状态。 形式上,Generator函数是一个普通函数,但是有两个特征 function关键字与函数名之间有一个星号。 函数体内部使用yield表达式,定义不同的内部状态。 function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); 上面代码定义了一个Generator函数helloWorldGenerator,它内部有两个yield表达式(hello和world),即该函数有三个状态:hello,world和return语句(语句执行)。 然后,Generator函数的调用方法与普通函数一样,也是在函数名后面加上一堆圆括号。不同的是,提哦啊用Generator函数后,函数并不执行,返回的也不是函数运行结果

ES6最具魔力的特性——生成器

有些话、适合烂在心里 提交于 2020-02-13 04:36:22
ES6生成器(Generators)简介 我们从一个示例开始: function* quips(name) { yield "你好 " + name + "!"; yield "希望你能喜欢这篇介绍ES6的译文"; if (name.startsWith("X")) { yield "你的名字 " + name + " 首字母是X,这很酷!"; } yield "我们下次再见!"; } 这段代码看起来很像一个函数,我们称之为生成器函数,它与普通函数有很多共同点,但是二者有如下区别: 普通函数使用function声明,而生成器函数使用function*声明。 在生成器函数内部,有一种类似return的语法:关键字yield。二者的区别是,普通函数只可以return一次,而生成器函数可以yield多次(当然也可以只yield一次)。在生成器的执行过程中,遇到yield表达式立即暂停,后续可恢复执行状态。 这就是普通函数和生成器函数之间最大的区别,普通函数不能自暂停,生成器函数可以。 生成器做了什么? 当你调用quips()生成器函数时发生了什么? > var iter = quips("jorendorff"); [object Generator] > iter.next() { value: "你好 jorendorff!", done: false } > iter.next()

js-ES6学习笔记-Generator函数

落花浮王杯 提交于 2020-02-13 04:25:14
1、Generator 函数是 ES6 提供的一种异步编程解决方案。形式上,Generator 函数是一个普通函数,但是有两个特征。一是, function 关键字与函数名之间有一个星号;二是,函数体内部使用 yield 语句,定义不同的内部状态。 2、Generator函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用Generator函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象(Iterator Object)。 3、必须调用遍历器对象的next方法,使得指针移向下一个状态。也就是说,每次调用 next 方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个 yield 语句(或 return 语句)为止。换言之,Generator函数是分段执行的, yield 语句是暂停执行的标记,而 next 方法可以恢复执行。 4、总结一下,调用Generator函数,返回一个遍历器对象,代表Generator函数的内部指针。以后,每次调用遍历器对象的 next 方法,就会返回一个有着 value 和 done 两个属性的对象。 value 属性表示当前的内部状态的值,是 yield 语句后面那个表达式的值; done 属性是一个布尔值,表示是否遍历结束。 5、一个函数里面

javascript基础集锦_箭头函数、generator(六)

自古美人都是妖i 提交于 2020-02-13 04:24:23
本系列主要记录javascript中,新手比较容易搞错的地方。 (1)箭头函数    ES6标准新增了一种新的函数:Arrow Function(箭头函数)。   为什么叫Arrow Function?因为它的定义用的就是一个箭头:   x => x * x   上面的箭头函数相当于:   function (x) {    return x * x;   }箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }和return: 注意,需要你的浏览器支持ES6的Arrow Function:   箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。   回顾前面的例子,由于JavaScript函数对this绑定的错误处理,下面的例子无法得到预期结果:   var obj = {   birth: 1990,   getAge: function () {   var b = this.birth; // 1990   var fn = function () {   return new Date().getFullYear() - this.birth; //