pythonジェネレータ学習
2119 ワード
廖雪峰のpythonチュートリアル学習ジェネレータでは、次のコードがあります.
出力内容は次のとおりです.
generator関数は、next()を呼び出すたびに実行され、yield文が返され、再実行されると前回返されたyield文から実行されます.forループはnext()関数を呼び出すことであり,これを理解すれば上記のコードを理解できる.さらにscrapyフレームワーク爬虫類ではyield関数によく遭遇しますが、
次のように呼び出されます.
def odd():
print('step 1')
yield 1
print('step 2')
yield (3)
print('step 3')
yield (5)
if __name__ == "__main__":
o = odd()
for index in o:
print(index)
出力内容は次のとおりです.
step 1
1
step 2
3
step 3
5
generator関数は、next()を呼び出すたびに実行され、yield文が返され、再実行されると前回返されたyield文から実行されます.forループはnext()関数を呼び出すことであり,これを理解すれば上記のコードを理解できる.さらにscrapyフレームワーク爬虫類ではyield関数によく遭遇しますが、
def start_requests(self):
self.log('------' + __name__ + ' start requests ------')
if self.task_running is False:
return
apps = appinfo_mq.query_star_ids(self.market, self.country, self.start_id,
self.start_index, self.keyword_count - self.start_index)
header = CommentsSpider.headers
# apps = ['548984223'] #
if apps is not None:
log_file = open(self.log_path, 'a')
for app in apps:
app = app.replace('id', '')
log_file.write(str(app) + '---')
self.page_index[str(app)] = 1
self.is_first[str(app)] = True
new_url = CommentsSpider.url.format(app, 1)
yield Request(new_url, headers=header, meta={'app_id': app})
log_file.close()
else:
yield None
次のように呼び出されます.
for req in self.start_requests():
if req is not None:
self.crawler.engine.crawl(req, spider=self)
self.no_keyword = False
else:
self.task_running = False
self.no_keyword = True
timer.check_keyword_recover(self.request_action)
break
start_requests() generator, Request() ,
self.crawler.engine ,
Request() scrapy 。 generator,
generator 。