1、使用yield  i

def my_generator(n):
for i in range(n):
temp = yield i
print(f'我是{temp}') g = my_generator(5) print(next(g)) # 输出0
print(next(g)) # 输出1
print(g.send(100)) # 既把100传进去了,又保留了原来迭代应该输出的2
print(next(g)) # 输出3
print(next(g)) # 输出4 '''
0 #第一次迭代
我是None #第二次迭代
1
我是100 #第三次迭代
2
我是None #第四次迭代
3
我是None #第五次迭代
4
'''

2、改为使用yield

def my_generator(n):
for i in range(n):
temp = yield
print(f'我是{temp}') g = my_generator(5) print(next(g))
print(next(g))
print(g.send(100))
print(next(g))
print(next(g)) '''
None
我是None
None
我是100
None
我是None
None
我是None
None
'''

总结:

yield语句的一般形式
  temp=yield expression (推荐:既可以返回迭代的值,也可以接受send传进去的参数并赋给temp)

  yield expression(也可以使用,只返回迭代的值)

  temp=yield (不推荐,)

  yield (不推荐,)

send(arg)方法总结:

  (1)它的主要作用是,当我需要手动更改生成器里面的某一个值并且使用它,则send发送进去一个数据,然后保存到yield语句的返回值
  (2)send(arg)的返回值就是那个本来应该被迭代出来的那个值。 这样既可以保证我能够传入新的值,原来的应该被迭代出来的值也不会弄丢

3、生成器抛异常

def my_generator():
try:
yield 'a'
yield 'b'
yield 'c'
yield 'd'
yield 'e'
except ValueError:
print('方法内--触发“ValueError"了')
except TypeError:
print('方法内--触发“TypeError"了') g = my_generator()
print(next(g))
print(next(g))
print('-------------------------')
print(g.throw(ValueError))
print('-------------------------')
print(next(g))
print(next(g))
print('-------------------------')
print(g.throw(TypeError))
print('-------------------------')
print(next(g))

4、加上while true

def my_generator():
while True:
try:
yield 'a'
yield 'b'
yield 'c'
yield 'd'
yield 'e'
except ValueError:
print('方法内--触发“ValueError"了')
except TypeError:
print('方法内--触发“TypeError"了') g = my_generator()
print(next(g))
print(next(g))
print('-------------------------')
print(g.throw(ValueError))
print('-------------------------')
print(next(g))
print(next(g))
print('-------------------------')
print(g.throw(TypeError))
print('-------------------------')
print(next(g))

总结:在生成器中抛出异常,这个throw函数会返回下一个要迭代的值或者是StopIteration

生成器的启动和关闭:
启动
第一:直接使用next(g),这会直接开始迭代第一个元素(推荐使用这个启动)
第二:使用g.send(None)进行启动,注意第一次启动的时候只能传入None,如果传入其他具体的指则会报错哦!
关闭
如果一个生成器被中途关闭之后,在此调用next()方法,则会显示错误StopIteration
在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration

-

yield总结的更多相关文章

  1. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

  2. node 异步回调解决方法之yield

    先看如何使用 使用的npm包为genny,npm 安装genny,使用 node -harmony 文件(-harmony 为使用es6属性启动参数) 启动项目 var genny= require( ...

  3. yield生成器及字符串的格式化

    一.生成器 def ran(): print('Hello world') yield 'F1' print('Hey there!') yield 'F2' print('goodbye') yie ...

  4. Python中的生成器与yield

    对于python中的yield有些疑惑,然后在StackOverflow上看到了一篇回答,所以搬运过来了,英文好的直接看原文吧. 可迭代对象 当你创建一个列表的时候,你可以一个接一个地读取其中的项.一 ...

  5. Python yield函数理解

    Python中的yield函数的作用就相当于一个挂起,是不被写入内存的,相当于一个挂起的状态,用的时候迭代,不用的时候就是一个挂起状态,挂起状态会以生成器的状态表现

  6. ecma6 yield

    function * generator(k){ console.log('begin'); var x = yield k; console.log('x:',x); var y = yield x ...

  7. Python yield与实现

    Python yield与实现  yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭 ...

  8. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  9. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  10. GetEnumerator();yield

    GetEnumerator()方法的实质实现: 说明:只要一个集合点出GetEnumerator方法,就获得了迭代器属性,就可以用MoveNext和Current来实现foreach的效果,如上图. ...

随机推荐

  1. ABAP 动态内表 实例展示以及代码Demo

    因根据查询条件展示的报表列数不一定一致,因此采用动态内表的方式进行处理 这里写了一个简单的Demo记录一下 效果如下图: 一般来说通过选择屏幕来控制列的,我这里就简单处理,直接对内表赋予相关值,包括相 ...

  2. laravel 导入导出(实际上还是php代码实现)

    1.导出 public function excel(){        $data=User::all();        $data=json_decode(json_encode($data), ...

  3. pymongo解决查询的时区相差8小时

    背景 最近需要到mongoDB中查询数据,但是发现返回的日期总是和实际时间差8小时.到数据库查询了一下看到时间的确是准确的,只是查询出来的比实际的少了8小时. 通过网上查找资料了解到默认时区是UTC, ...

  4. 遍历List<Map<String,Object>>集合

    import java.util.*; public class HelloWorld { public static void main(String []args) { //定义一个List< ...

  5. SQL优化:distribute by 小数据场景处理数据倾斜

    distribute by rand() distribute by :用来控制map输出结果的分发,即map端如何拆分数据给reduce端. 会根据distribute by 后边定义的列,根据re ...

  6. 树莓派4B的Node-Red编程(一)

    一.树莓派烧写 二.Node-Red 环境搭建 (一)安装Node.js (二)安装Node-Red (三)启动服务:win+R输入CMD:输入Node-red. (四)进入浏览器127.0.0.1: ...

  7. DorisSQL与MySQL函数对照 差异篇

    ## 1.日期函数### 时区.```mysql -> convert_tz(dt,from_tz,to_tz)doris -> CONVERT_TZ(DATETIME dt, VARCH ...

  8. html input 属性

    一:disabled disabled 属性规定应该禁用 input 元素,被禁用的 input 元素,不可编辑,不可复制,不可选择,不能接收焦点,后台也不会接收到传值.设置后文字的颜色会变成灰色.d ...

  9. 不可错过的JS代码优化技巧(持续更新)

    1. 带有多个条件的 if 语句 把多个值放在一个数组中,然后调用数组的 includes 方法. //longhand if (x === 'abc' || x === 'def' || x === ...

  10. bert一些思考

    bert结构 首先是embdding lookup,[batch * seq]-->[batch, seq, hidden] 然后是加个mask embdding和type embdding和p ...