yield

for-comprehension yield raises type mismatch compiler error

柔情痞子 提交于 2020-05-17 03:42:08
问题 I want to extract from Iterable[Try[Int]] a list of all valid values ( Iterable[Int] ) val test = List( Try(8), Try(throw new RuntimeException("foo")), Try(42), Try(throw new RuntimeException("bar")) ) The following is the way to print all valid values from test : for { n <- test p <- n } println(p) // Output // 8 // 42 However, when I tried to save the valid values to list I have received an error: val nums: Seq[Int] = for { n <- list p <- n // Type mismatch. Required: IterableOnce[Int],

第十章 Scala 容器基础(十三):使用for yield转化集合

核能气质少年 提交于 2020-04-15 17:56:19
【推荐阅读】微服务还能火多久?>>> Problem 你想要对一个原有集合的元素通过某种算法进行处理,然后生成一个新的集合。 Solution 使用for/yield结构外加你的算法就可以从一个原有集合创建一个新的集合。首先我们要有一个集合 scala> val a = Array(1, 2, 3, 4, 5) a: Array[Int] = Array(1, 2, 3, 4, 5) 使用for/yield创建一个集合的拷贝: scala> for(e <- a) yield e res12: Array[Int] = Array(1, 2, 3, 4, 5) 你可以创建一个新的集合,通过对原有集合的每个元素翻倍,也可以把原集合的元素变为1/2 scala> for(e <- a) yield e * 2 res14: Array[Int] = Array(2, 4, 6, 8, 10) scala> for(e <- a) yield e / 2 res16: Array[Int] = Array(0, 1, 1, 2, 2) 把一组字符串转化为大写: scala> for(fruit <- fruits) yield fruit.toUpperCase res17: scala.collection.immutable.Vector[String] = Vector(APPLE

generator函数yield

冷暖自知 提交于 2020-04-07 11:08:07
Generator 函数 yield* 表达式 如果在 generator 函数内部调用另一个 generator 函数,默认情况下是没有效果的。 yield* 后面的 Generator 函数(没有 return 语句时)等同于在 generator 函数内部部署 for...of 循环 // 定义generator函数 function* ickt(){ yield 1; yield 2; } function* demo(){ yield "ljh"; yield "ljh1"; // 直接执行 ickt // ickt();// 无效 // yield ickt();// ['ljh','ljh','ickt'] //返回状态机中的状态 // let i= ickt(); // for(let item of i){ // console.log(item) // yield item; // } // yield*表达式 yield* ickt(); yield "12"; } let d = demo(); console.log([...d]) yield* 后面跟着 个数组,由于数组原生支持遍历器,因此就会遍历数组成员 任何数据结构只要有 Iterator 接口,就可以被 yield* 遍历 // 定义generator函数 function* ickt(){

generator函数应用

梦想的初衷 提交于 2020-04-06 19:34:39
generator 应用 创建状态机,实现状态之间的切换 // // 状态机 // function* toggle() { // while (true) { // yield false; // yield true; // } // } // // 状态机 // let t = toggle(); // // 点击按钮,切换状态 // btn.onclick = () => { // console.log(t.next()) // } // 轮播图;状态:索引值 // function* swiper(num) { // while (true) { // // 根据图片数量,切换状态 // for (let i = 0; i < num; i++) { // yield i; // } // } // } // // 创建轮播图状态机 // let s = swiper(5); // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next())

python基础学习day12 生成器与推导式

老子叫甜甜 提交于 2020-03-26 18:07:01
补充:函数不能改变全局不可变的变量,可变变量仍然可改变。 l1 = [1,2] def a(l1): l1.pop(1) a(l1) print(l1) 生成器 生成器:python社区把生成器与迭代器看成同一种,生成器的本质就是迭代器。唯一的区别是:生成器是我们自己用python代码构建的数据结构,迭代器都是python提供的,或者转化的。 获取生成器的方法: 生成器函数 生成器表达式 python内部提供的。 生成器函数 获取生成器,yield: def func(): print(1) print(3) yield 5 print(func) #<function func at 0x000001A3CCA04438> 仍然是一个函数 ret = func() print(ret) #<generator object func at 0x000002471A631D48> #generator object#生成器对象 def func(): print(3) yield 5 ret = func() print(next(ret)) #3 5 #一个next对一个yield的返回值 def func(): print(3) yield 5 yield 7 print(next(func())) #3 5 yield与return return

生成器和列表(字典、集合)推导式

白昼怎懂夜的黑 提交于 2020-03-26 17:51:56
生成器初始 生成器本质就是迭代器。python社区生成器与迭代器是一种。生成器与迭代器的唯一区别:生成器是我们自己用python代码构建的。 生成器产生方式 生成器函数。 生成器表达式。 python给你提供的一些内置函数,返回一个生成器。 生成器函数。 之前接触的函数: def func(): print(111) return 2 ret = func() print(ret) 执行此函数,遇到return结束函数。 将数字2返回给ret。 生成器函数: 只要函数中出现了yield那么他就不是函数,它是生成器函数 def func(): print(111) print(111) print(111) print(111) print(111) print(111) yield 2,4,5 yield 3 yield 4 yield 5 ret = func() # 生成器对象 print(ret) # <generator object func at 0x0000000001E10F68> ''' 类比 l1 = [2,] [2,3,4,5] obj = iter(l1) ''' 只要函数中出现了yield那么他就不是函数,它是生成器函数。 一个next对应一个yield. print(next(ret)) print(next(ret)) print(next(ret))

python生成器、推导式及匿名函数

非 Y 不嫁゛ 提交于 2020-03-26 17:48:41
生成器初识 生成器本质就是迭代器。python社区中生成器与迭代器是一种概念。生成器与迭代器的唯一区别:迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来的,(比如文件句柄,iter([1,2,3])。生成器是我们自己用python代码构建的工具。 生成器构建方式 生成器函数。 生成器表达式。 python给你提供的一些内置函数,返回一个生成器。 生成器函数。 生成器函数: 只要函数中出现了yield那么他就不是函数,它是生成器函数 def func(): print(111) yield 2,4,5 print(222) yield 3 ret = func() # 生成器对象 print(ret) # <generator object func at 0x0000000001E10F68> # 只要函数中出现了yield那么他就不是函数,它是生成器函数。 # 一个next对应一个yield.next超过yield数量,就会报错,与迭代器一样。 print(next(ret)) print(next(ret)) yiled与return的区别 # return 结束函数,给函数的执行者返回值(多个值通过元组的形式返回)。 # yield 不结束函数,对应着给next返回值(多个值通过元组的形式返回)。 send(了解) def gen(name): print

⽣成器与⽣成器函数与列表推导式

拜拜、爱过 提交于 2020-03-26 17:39:17
1. ⽣成器和⽣成器函数 2. 列表推导式 ⼀. ⽣成器 什么是⽣成器. ⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先, 我们先看⼀个很简单的函数: def func():   print("111")   return 222 ret = func() print(ret) 结果: 111 222 将函数中的return换成yield就是⽣成器 def func():   print("111")   yield 222 ret = func() print(ret) 结果: <generator object func at 0x10567ff68> 运⾏的结果和上⾯不⼀样. 为什么呢. 由于函数中存在了yield. 那么这个函数就是⼀个⽣成器 函数. 这个时候. 我们再执⾏这个函数的时候. 就不再是函数的执⾏了. ⽽是获取这个⽣成器. 如何使⽤呢? 想想迭代器. ⽣成器的本质是迭代器. 所以. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器. def func(): print("111") yield 222 gener = func() # 这个时候函数不会执⾏. ⽽是获取到⽣成器 ret = gener.__next__() #

yield 表达式

守給你的承諾、 提交于 2020-03-25 16:52:25
由于 Generator 函数返回的遍历器对象,只有调用 next 方法才会遍历下一个内部状态,所以其实提供了一种可以暂停执行的函数。 yield 表达式就是暂停标志。 function* gen() { yield 123 + 456; } 上面代码中,yield后面的表达式123 + 456,不会立即求值,只会在next方法将指针移到这一句时,才会求值。  yield && for of function* foo() { yield 1; yield 2; yield 3; yield 4; yield 5; return 6; } for (let v of foo()) { console.log(v); } // 1 2 3 4 5    来源: https://www.cnblogs.com/blogZhao/p/12566271.html

06-生成器

﹥>﹥吖頭↗ 提交于 2020-03-24 20:50:40
如何得到自定义的迭代器 在函数内一旦存在yield关键字,调用函数并不会执行函数体代码 会返回一个生成器对象,生成器即自定义的迭代器 def func(): print('第一次') yield 1 print('第二次') yield 2 print('第三次') yield 3 print('第四次') g=func() print(g) # output:<generator object func at 0x0000029ACCD0E430> # 生成器就是迭代器 g.__iter__() g.__next__() # output:第一次 会触发函数体代码的运行,然后遇到yield停下来,将yield后的值当做本次调用的结果返回 # 示例 def func(): print('第一次') yield 1 print('第二次') yield 2 print('第三次') yield 3 print('第四次') g=func() res1=g.__next__() # output:第一次 print(res1) # output:1 res2=g.__next__() #output:第二次 print(res2) # output:2 res3=g.__next__() # output:第三次 print(res3) # output:3 res4=g.__next