Python3.4学习 从yield开始

现在在学习Python的3.4,遇到了协程的慨念和yield from语法,大为疑惑,所以写了这篇博客,首先会写yieldyield fromcoroutinegevent,最后就是利用asynaio开发的一系列库了。

2015年08月06日23:52:54了,就写这么多吧,以后持续更新。

不知道CSDN的markdown能不能换css样式。。。

关键词 yield

在Python 2.7的时候就接触过yield关键词:

def foo(m):
  n = 0
  while n <= m:
    yield n
    n += 1

如果在终端输入(Python 3.4):

>>>for i in foo(5):
...  print(i)
...
0
1
2
3
4
5

之前就知道ListDict类型的对象可以用for ... in ...的语法,现在用yield关键词后生成的对象也可以这样用了。随便百度一下就知道用yield装饰的对象变为了Generator类型。

方法nextsend

伴随着yield一定会有nextsend这两个方法。本质上说,这两个方法没有什么区别。

  • next 返回Generator的下一个值,然后Generator挂起,此时就需要send方法来继续唤醒Generator
  • send 如果对于一个Generator对象g,调用g.send(None)(传入None型),那么效果和调用next(g)一样;如果调用g.send(Value)(传入具体的值),就相当于yield返回的值。

写敲出下面的代码,命名为test.py

import itertools
def g():
  print(‘--start--‘)
  for i in itertools.count():
    print(‘--yielding %i--‘ % i)
    try:
      ans = yield i
    except GeneratorExit:
      print(‘--closing--‘)
      raise
    except Exception as e:
      print(‘--yield raised %r‘ % e)
    else:
      print(‘--yield returned %s--‘ % ans)

然后在终端输入:

>>>from test import *
>>>it = g()
>>>next(it)
--start--
--yielding 0--
0
>>>it.send(100)
--yield returned 100--
--yielding 1--
1
>>>it.send(1000)
--yield returned 1000--
--yielding 2--
2
>>>next(it)
--yield returned None--
--yielding 3--
3

来分析一下代码:

  1. next(it)第一次执行该条语句得到it的下一个值0,然后it挂起,等待终端的指令
  2. 然后输入it.send(100),上文已说该方法和next()没什么区别,相当于执行了test.py中的yield i,只不过返回的是传入的参数的值。因为执行了yield i语句,所以继续执行下面的语句print(‘--yield returned %s--‘ % ans)
  3. 同上一步一样
  4. 此时重新执行next(it),相当于从上一步的yield i后面开始执行,因为执行yield i的时候,直接退出了g,所以ans并没用被赋值。

Any values that the iterator yields are passed directly to the caller.

PEP 0380 – Syntax for Delegating to a Subgenerator

所以只能这样解释了,那为什么用send就可以赋值呢?说明这两个方法还是有些不一样?

未完待续

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 22:02:44

Python3.4学习 从yield开始的相关文章

python3.x学习笔记2018-02-02更新

前言:python3.x部分学习笔记,有意交流学习者可加wechat:YWNlODAyMzU5MTEzMTQ=.如果笔记内容有错,请指出来. *** 对数据类型的操作 可变数据类型:列表,集合,字典 列表: ``` li=['a','b'] 增: li.insert(2,'c') #在序号2位置上插入'c' li.append('d') #在列表末尾添加'd' li.extend(li2) #在列表li后面添加li2 删: li.remove('c') del li[2] li.pop(3) 改

Python3爬虫学习

学了几天python3,发现目前学到的与爬虫还是关系不大,所以现在准备爬虫和语言同步学习. 2016.8.9晚 先从最简单的开始,爬取指定url的所有内容: #encoding:UTF-8 import urllib.request url = "http://www.selflink.cn/selflink" data = urllib.request.urlopen(url).read() data = data.decode('UTF-8') print(data) #encod

python3.X学习笔记(week1)老男孩20160114

学习背景: 我在西藏拉萨出差已经连续将近2个月了,实时想到会精通一门编程语言并编写出自己想要的程序是我多年的梦想,一定找时间实现,回想高中时,自己对编程的兴趣十分浓厚,父母给自己购买了学习机插卡式的,只能敲basic代码,同时学校有计算机课,经常和老师讨论编程问题,时光一晃20多年过去了,编程放下了,但是我的梦想没有放下,正好看到老男孩在51cto网站上开设网络培训PYTHON语言学习班,我犹豫了怕在高原坚持不下来,后来想早报名早学习,不能再耽误下去了,我毅然报了名,花了5000多money,自

python3.x学习小记

当已掌握一门高级编程语言后,学习一门编程语言上手较快,所以本文重在小小摘一些细节性较强的东西. 一. 先体验一下编写的差异在哪: 到这里,大概知道三点,一是用换行来区分代码块,二是各种变量信手拈来,不用定义,三是多了冒号少了分号 二.正文 [简介] Python是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1 Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型

python3 爬虫学习-根据关键词爬取百度百科内容

小白编了好久才写出来,记录一下免得之后再用的时候都忘了还得重新学~ 学习爬虫最开始是学习了慕课上的python课程,然后学习了慕课和网易云上的爬虫教程.这两个自己去查一下就好了~ 开始还比较费劲,毕竟熟悉需要时间么,而且python也不太熟悉. 关于python版本:我一开始看很多资料说python2比较好,因为很多库还不支持3,但是使用到现在为止觉得还是pythin3比较好用,因为编码什么的问题,觉得2还是没有3方便.而且在网上找到的2中的一些资料稍微改一下也还是可以用. 好了,开始说爬百度百

python3.5学习第二章(1)标准库,bytes

一.输出python库的路径: 1.sys标准库 import sysprint(sys.path) 结果: 'E:\\python练习\\python35学习\\Day2', 'E:\\python练习\\python35学习', 'D:\\Python\\Lib', 'F:\\pjproject-2.7\\tests\\pjsua', 'C:\\Users\\ASUS\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C

python3自动化学习04

概要:迭代器.yield生成器.装饰器.递归函数.简单的算法(二分查找,二维数组).正则表达式基础 一.迭代器 迭代器是访问集合元素的一种方式,迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束. 迭代器只能往前不能后退.迭代器的一大优点就是不要求事先准备好整个迭代的过程中所有的元素,迭代器仅仅是在迭代到某个元素才计算该元素,而在这之前或之后,元素可以不存在或者销毁,这个特点使它特别适用于遍历一些巨大或无限的集合. 特点: 1.访问者不需要关心迭代器内部的结构,仅仅需要通过 __n

【python3的学习之路八】高级特性

切片 举出一个list的例子 L = list(range(100)) 如何取前三个元素? L[0:3] # 从索引0开始取,直到索引3为止,但不包括索引3.即索引0,1,2,正好是3个元素. L[:3] #如果第一个索引是0,还可以省略 其他情况 L[-10:] # 后10个元素 L[:10:2] # 前10个数,每俩个取一个 L[::5] # 所有数,每5个取一个 L[:] # 不变 截取一部分的字符串并与其他字符串拼接 var1 = 'Hello World!' print ("拼接字符串

Python3 Selenium学习

https://ke.qq.com/course/310732 一直计划着系统地看看Python3,这两天不用加班了,在网上下了些资源,自己演练一番. Python3标识符保留字,直接命令行中可以查看当前版本的保留字 我用的是PyCharm,保留字截图不全面,复制如下: PyDev console: starting.Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win