鱼C论坛

 找回密码
 立即注册
查看: 1525|回复: 3

[已解决]yield到底啥意思,查了好久没弄懂。

[复制链接]
发表于 2017-10-26 21:06:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 1258187869 于 2017-10-26 21:12 编辑

yield到底啥意思,查了好久没弄懂。  感觉像return
但是好像又不是 到底啥意思
比如这段代码
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from autopjt.items import AutopjtItem


  4. class AutospdSpider(scrapy.Spider):
  5.     name = 'autospd'
  6.     allowed_domains = ['dangdang.com']
  7.     start_urls = ['http://category.dangdang.com/cp01.03.32.00.00.00.html']

  8.     def parse(self, response):
  9.         item = AutopjtItem()

  10.         item["name"] = response.xpath('//a[@dd_name="单品标题"]/@title').extract()
  11.         item["price"] = response.xpath('//span[@class="search_now_price"]/text()').extract()
  12.         print(item)

  13.         yield item
  14.         for i in range(2, 76):
  15.             url = "http://category.dangdang.com/pg"+str(i)+"-cp01.03.32.00.00.00.html"
  16.             yield Request(url, callback=self.parse)
复制代码
最佳答案
2017-10-26 22:20:05
1.yield和return都是函数的返回语句,但return返回的是值,yield返回的是生成器。
2.return返回后,函数就完成了历史使命,不在内存中保留了,而yield可以有多个,执行到一个yield返回主程序,再next时,重新回到函数中继续执行,到下一个yield。
对比一下:
  1. def a():
  2.     return 1
  3.     return 2
  4.     return 3
复制代码
  1. >>> a()
  2. 1
复制代码

后面的return 2, return 3是没有用的。

  1. def b():
  2.     yield 1
  3.     yield 2
  4.     yield 3
复制代码
  1. >>> b()
  2. <generator object b at 0x00000142D9168DB0>
复制代码

返回生成器,无法直接看到结果。
可以这样调用:
  1. >>> c = b()
  2. >>> next(c)
  3. 1
  4. >>> next(c)
  5. 2
  6. >>> next(c)
  7. 3
  8. >>> next(c)
  9. Traceback (most recent call last):
  10.   File "<pyshell#29>", line 1, in <module>
  11.     next(c)
  12. StopIteration
复制代码

当然用for循环更方便:
  1. >>> for i in b():
  2.         print(i)

  3.        
  4. 1
  5. 2
  6. 3
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-26 22:20:05 | 显示全部楼层    本楼为最佳答案   
1.yield和return都是函数的返回语句,但return返回的是值,yield返回的是生成器。
2.return返回后,函数就完成了历史使命,不在内存中保留了,而yield可以有多个,执行到一个yield返回主程序,再next时,重新回到函数中继续执行,到下一个yield。
对比一下:
  1. def a():
  2.     return 1
  3.     return 2
  4.     return 3
复制代码
  1. >>> a()
  2. 1
复制代码

后面的return 2, return 3是没有用的。

  1. def b():
  2.     yield 1
  3.     yield 2
  4.     yield 3
复制代码
  1. >>> b()
  2. <generator object b at 0x00000142D9168DB0>
复制代码

返回生成器,无法直接看到结果。
可以这样调用:
  1. >>> c = b()
  2. >>> next(c)
  3. 1
  4. >>> next(c)
  5. 2
  6. >>> next(c)
  7. 3
  8. >>> next(c)
  9. Traceback (most recent call last):
  10.   File "<pyshell#29>", line 1, in <module>
  11.     next(c)
  12. StopIteration
复制代码

当然用for循环更方便:
  1. >>> for i in b():
  2.         print(i)

  3.        
  4. 1
  5. 2
  6. 3
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-27 10:40:16 | 显示全部楼层
反正我理解这个就是跑步的时候有计时器,return等于按下计时器的终止键,返回最终结果。大家都跑完了。而yield 等于是记次键(第一个跑完后),返回当前结果,然后下一次yield继续返回一次。直到所有人都跑完,返回StopIteration。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-27 17:38:24 | 显示全部楼层
大概可以理解为 yield 可以迭代返回
而return只返回一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 06:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表