python中的生成器(二)

摘要:
一.剖析一下生成器对象先看一个简单的例子,我们创建一个生成器函数,然后生成一个生成器对象defgen():print('start..')foriinrange(3):yieldiprint('end...')G=gen()print(type(G))˃˃表示G是一个生成器对象,我们来剖析一下,里面到底有什么print(dir(G))˃˃['__class__',

一. 剖析一下生成器对象

先看一个简单的例子,我们创建一个生成器函数,然后生成一个生成器对象

defgen():
   print('start ..')
   for i in range(3):
      yieldi 
   print('end...')
G=gen()
print(type(G))
>>
<type 'generator'>

表示G是一个生成器对象,我们来剖析一下,里面到底有什么

print(dir(G))

>>['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__',

 '__hash__', '__init__', '__iter__', '__name__', '__new__', '__reduce__', 

 '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 

 '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running',

  'next', 'send', 'throw']

大家注意看有4个很特殊的函数close(),next(),send(),throw(),next()在python中的生成器(一)中已经介绍过了,今天我们就重点来说说send(),throw(),close()函数

1.send()函数

send()用于传递参数,实现与生成器的交互,当程序运行到receive=yield的时候 就会被挂起,等待生成器调用send方法,这个时候外部调用send函数,发送数据变量进来,数据变量就会传递到received

示例代码:

defecho():
   whileTrue:
      received=yield 
      print('Receive:{}'.format(received))

Echo=echo()
next(Echo)
Echo.send('First')
Echo.send('Second')
>>Receive:First
Receive:Second

a).echo函数里面一个死循环,里面有一行关键的代码,receive=yield 这个就是send函数从外部发送过来的入口.

b).外部函数一开始要生成一个生成器对象也就是Echo=echo()

c).然后很关键的一步就是next(Echo),一定要调用一次next函数,让生成器推进到第一条yield表达式那边

d).接下来我们就可以把yield操作和send操作结合起来,可以获取外界所输入的数据,然后用一套流程去进行处理

2.throw()函数

throw主要是向生成器发送一个异常,可以结束系统定义的异常(当然包括自定义的异常)

示例代码:

defgen():
   whileTrue:
      try:
         yield 'First'
         yield 'Second'
      exceptTypeError:
         print('Catch the TypeError')
      exceptValueError:
         print('Catch the ValueError')

G=gen()
print(next(G))
G.throw(ValueError)
print(next(G))
>>First
Catch the ValueError
Second

a).创建生成器对象G

b),执行next(G)并打印结果,我们会得到第一个yield里缓存的结果'First',并且停留在yield 'Second'之前

c).抛出一个异常类ValueError(注意ValueError是类不是字符串),当生成器收到异常直接跳过 yield 'Second'进入except部分,打印出'Catch the TypeError'

d).执行next(G)并打印结果,我们会回到while头部,并且消耗掉第一个yield 'Frist',执行yield 'Second'

3.close()函数

close用于停止生成器,如果停止之后再调用next,就会引发StopIteration错误

示例代码:

defecho():
   whileTrue:
      received=yield 
      print('Receive:{}'.format(received))

try:
   Echo=echo()
   next(Echo)
   Echo.close()
   Echo.send('123')
exceptStopIteration ,e:
   print('Catch the StopIteration')
>>Catch the StopIteration

当生成器对象Echo调用完close()之后,再调用send('123')就会抛出一个异常StopIteration,然后被我们捕捉到了

免责声明:文章转载自《python中的生成器(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇详解centos下vi的用法Java中的字符串及其处理效率下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

从 Android 到 AI 之路

       高煥堂  misoo.tw@qq.com  从 Android 到 AI 之路:Java与Python 携手同行           1.以Python撰写 AI模型框架(Framework) 2.准备Java与Python协同开发环境 3.在Android Studio里撰写Python程序  4.一个基本的AI建模议题:分类的标签设定 5...

python h5py 读取hdf 数据

#Env dependent extension packages #pip install h5py -i https://pypi.tuna.tsinghua.edu.cn/simple #pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple #pip install pandus...

python实现将固定格式的字符串调整为字典的格式,用于爬虫爬取数据时快速添加请求数据

#!/usr/local/bin/python3.7 """ @File : str_replace.py @Time : 2020/06/03 @Author : Mozili """# 输入多行字符串 data = [] str = input('输入要调整的字符串: ') data.append(str) stopwor...

python第一行注释是什么意思?

  很大多时候在开始学习python的时候,知道,#是注释的意思,但是每次写python的第一句都是提示 #!/usr/ ...不知是什么意思? 表示该文件是个.py程序,执行的时候需要python环境来执行。 这是脚本语言共同遵守的规则:当第一行为 #!/path/to/script/interpreter时,指定了用来执行本脚本的解释器。注意:1、必须...

Python三方库PyAutoGUI的使用方法

通过ssh远程执行脚本的时候,需要加上: import os os.environ["DISPLAY"] = ":0" # 注意这行代码需要写在"import pyautogui"之前 import pyautogui 1.安装:sudo pip3 install python3-xlib sudo apt-get install scrot sudo...

Python GUI工具Tkinter以及拖拉工具Page安装

如果使用Tkinter作为Python GUI工具,我们需要安装Tkinter,这个使用conda或者pip即可:  conda install -c anaconda tk  为了提高界面编写效率,可以使用拖拉工具Page: 下载地址:https://sourceforge.net/projects/page/ 安装完成后可能会遇到can't find...