惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
Google Developers Blog
J
Java Code Geeks
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
IT之家
IT之家
博客园_首页
B
Blog RSS Feed
Google DeepMind News
Google DeepMind News
B
Blog
U
Unit 42
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
博客园 - 聂微东
腾讯CDC
A
About on SuperTechFans

老董笔记

尚硅谷机构在哪?尚硅谷培训怎么样?靠谱吗-互联网IT百科 韩顺平介绍,传智讲师,开办泰牛,入尚硅谷等一系列-互联网IT百科 pandas多重索引标准样式(写入excel有空行)-互联网IT百科 cannot join with no overlapping index names-互联网IT百科 pandas多列变多行(即宽表变长表)melt和stack函数-互联网IT百科 pandas多行转多列(长表变宽表)pivot和unstack-互联网IT百科 Index contains duplicate entries, cannot reshape完美解决-互联网IT百科 single positional indexer is out-of-bounds-互联网IT百科 Can only compare identically-labeled Series objects-互联网IT百科 pandas transform用法详解(多个案例)-互联网IT百科 python四舍五入精确实现-互联网IT百科 pandas的groupby使用apply分组排序-互联网IT百科 index 0 is out of bounds for axis 0 with size 0-互联网IT百科 pandas分组过滤filter函数-互联网IT百科 联想Win10系统如何禁用触摸屏关闭触摸-互联网IT百科 groupby分组计算transform转换返回相同长度序列-互联网IT百科 brooks seo教程python教程,brooks seo教程网盘,布鲁seo资源-互联网IT百科 电脑右键文件夹一直转圈电卡死怎么回事-互联网IT百科 施琪嘉的心理成长课(荐)-互联网IT百科 百度SEO公司_SEO推广公司哪家好_SEO外包服务如何选-老董笔记 groupby后agg同1列用多个聚合函数、不同列用不同函数、自定义函数-互联网IT百科 pandas的groupby单列多列分组聚合运算-互联网IT百科 DataFrameGroupBy对象及分组个数、分组大小、组名索引、组数据详解-互联网IT百科 pandas中groupby之Grouper and axis must be same length-互联网IT百科 pandas中groupby的分组原理-互联网IT百科 pandas的groupby的使用详解大全-互联网IT百科 openpyxl单元格自动换行强制换行Alignment(wrapText=True)-互联网IT百科 python教程全套(可就业)-互联网IT百科 联想win10系统CPU显示100%,电脑呼呼响怎么回事-互联网IT百科 如何自制CPU,CPU原理是怎么样的?-互联网IT百科
python生成器send()函数详解-互联网IT百科
2020-05-14 · via 老董笔记

  阅读本文之前请先把此文python生成器定义及yield使用搞清楚:

  通过上面的文章我们知道了如何定义生成器以及如何启动生成器输出其中的元素,但是我们还遗留了一个小问题就是send()函数。本节课简单介绍下:

  学习send()之前先看下面的代码,如下是一个普通的生成器函数,内部yield了2个值。

# -*- coding: utf-8 -*-


def test(num):
    for i in range(num):
        yield i

obj = test(2)
value = next(obj) # 第1次调用
print(value)
value = next(obj) # 第2次调用
print(value)


0
1

  yield的返回值作为生成器的元素在调用时被输出,如果在上面的生成器函数内部把yield i 变成temp = yield i后你觉得会是什么后果?是否能改变生成器的特性呢?另外,temp会有什么结果嘛?实际看一看:

# -*- coding: utf-8 -*-


def test(num):
    for i in range(num):
        temp = yield i
        print('temp:',temp)


obj = test(2)
value = next(obj)  # 第1次调用,执行yield 0后暂停
print(value)

value = next(obj)  # 第2次调用,接着yield 0 往下执行,直到二次循环yield 1
print(value)



0
temp: None
1


  由此可见:

  1、yield i 本身并没有把 i 值赋给temp,因为temp打印出来是None。

  2、生成器函数本身的特性并无变化,生成器函数内部执行到yield后依然会暂停(所以才打印1次temp),第2次调用仍然是从yield后的代码开始执行。(如果不理解请继续翻看本文开头说的那篇文章)。

  但是如何做到让yield i这句话可以有个值返回给temp呢,这就需要send函数。请注意下面的代码中yield i 此时会被当做一个整体被赋值并且传给temp(传的值就是send函数的参数),而并非是yield i把i传值给temp。

# -*- coding: utf-8 -*-


def test(num):
    for i in range(num):
        temp = yield i  # 这句话可以接收值,可以产出值
        print('temp:',temp)


obj = test(2)
value = obj.send(None)
print(value)

value = obj.send('python66')
print(value)


0
temp: python66
1

  第一次调用生成器函数时,不能使用send发送一个非None的值,否则会出错的,在send一个非None值之前必须启动一次生成器。而send(None)就可以做到启动生成器。

  can't send non-None value to a just-started generator

  1、请记住,temp = yield i 这句话可以接收值,可以产出值!分两步从右往左执行。

  2、第一次send(None)时,启动生成器,从生成器函数的第一行代码开始执行,直到第一次执行yield i 后跳出生成器函数。这个过程中,并没有执行到temp被赋值。

  3、再次执行send('python66')时,进入生成器函数,此时,yield i会看做一个整体,像一个中间变量一样被赋值并且传回给temp。即相当于把python66赋值给temp(并不是把i的值赋给temp)。这个过程里yield i 中i的值依然会作为生成器的元素在调用时输出。

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会