免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Python yield
最近访问板块 发新帖
查看: 2363 | 回复: 5
打印 上一主题 下一主题

yield [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-30 14:27 |只看该作者 |倒序浏览
def a():
    print("begin")
    yield 3
    print("end")
    yield 30


b=a()

print(a().__next__())
print(a().__next__())
print('##################')
print(b.__next__())
print(b.__next__())


结果:
begin
3
begin
3
##################
begin
3
end
30


问题:
不明白为什么直接调用a()不好用。

个人理解:
a()也是个函数,只不过比较特殊,是一个生成器函数,通过看IBM关于yield的文章,了解到a(),返回的是一个迭代器对象,那这个对象我直接调用next()方法和我把a()给一个变量b再掉用b.next()有什么不一样吗?

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
2 [报告]
发表于 2015-10-30 19:40 |只看该作者
重复两次 => [ 生成迭代器对象 + 调用next()方法次 ]


print(a().__next__())
print(a().__next__())



生成迭代器对象 + 调用next()方法

b = a()
print(b.__next__())
print(b.__next__())

这也是为何如此的原因

评分

参与人数 1可用积分 +6 收起 理由
MMMIX + 6 赞一个!

查看全部评分

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
3 [报告]
发表于 2015-10-30 19:54 |只看该作者

# print(a().__next__()) 每次执行这个生成一个迭代器对象 + 用next()方法
tmp = a()               # 生成一个新的迭代器对象
print(tmp.__next__())   # 调用next()方法

# begin
# 3


# print(a().__next__()) 生成一个迭代器对象 + 调用next()方法
# 你可以在这里停下,来看看

tmp = a()   # 但是你 再度生成一个新的迭代器对象
print(tmp.__next__())   # 调用next()方法

# begin
# 3

这也是为何如此的原因

b = a() # # 只生成一个迭代器
print(b.__next__())

# begin
# 3

# 调用next()方法不创造一个新的
print(b.__next__())

# end
# 30

论坛徽章:
0
4 [报告]
发表于 2015-11-01 14:53 |只看该作者
回复 3# substr函数

首先 谢谢你的讲解。你帮我更进一层了解原因。但是我对“对象”这个基本概念感觉好像理解不好,我觉得,我真正没看到这个迭代器的原因是,我理解不了对象,(虽然相关文章我看了很多,也能说的有依有据)。


我之前的理解:
如果我现在把a()看成是个类,我就能理解了。我可以a()当做一个抽象的东西,它没有实例,只是在描述一个类事物。所以b=a()等于是有了一个实例,并且可以调用next()方法。


现在的理解:
a()虽然不是一个类,但是它返回一个可迭代的对象,但是这个对象是抽象的,并没有指定哪个对象可以迭代,好像一个工厂一样。当b=a()之后,等于是a()生产了b。并调用自己的迭代方法next。

不知道是不是应该这样理解。

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
5 [报告]
发表于 2015-11-02 13:13 |只看该作者
回复 4# n04045430

是了
a().__next__()

等于是 返回一个 匿名的 可迭代对象
anonymous = a()
anonymous.__next__()
   

论坛徽章:
0
6 [报告]
发表于 2015-11-02 16:49 |只看该作者
谢谢你的帮助,我问题比较多,希望多多帮助 回复 5# substr函数


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP