好程序员分享循环内的回调函数

简介:   好程序员分享循环内的回调函数,问题出现在循环体内的回调函数,用一个很简单的例子举例:  for x in xrange(3):1.  print "requests begin:%s"%x2.

  好程序员分享循环内的回调函数,问题出现在循环体内的回调函数,用一个很简单的例子举例:

  for x in xrange(3):
1.

  print "requests begin:%s"%x


2.

  def callback(respon):


3.

  print x


4.

  print respon.body


5.

  client.fetch("http://httpbin.org/get?x=%s" % x, callback)

  此例子忽略了等待回调函数完成的wait实现(不实现这个会导致作为单个文件运行的时候,还没获得结果就退出了),在tornado.testing中的AsyncTestCase提供了相关功能
  httpbin.org/get这个地址的作用是返回了请求的json对象,形如:
  {
1.

  "args": {


2.

  "x": "0"


3.

  },


4.

  "headers": {


5.

  "Accept-Encoding": "gzip",


6.

  "Connection": "close",


7.

  "Host": "httpbin.org",


8.

  "X-Request-Id": "95df3c15-7ed0-4a6d-830d-fb9629e66515"


9.

  },


10.

  "origin": "192.81.129.91",


11.

  "url": "http://httpbin.org/get?x=0"


12.

  }

  但实际上,由于回调函数特殊的特性:访问闭包内局部变量的当前值。易知,在第一个请求
  http://httpbin.org/get?x=0的url返回时,循环早已结束,此时的x已经为2,因此实际上虽然httpbin.org返回的json告诉我们,get参数里的x为0,但闭包内访问到的x已经是2了
  解决方法我想了两个,一个是利用回调函数构造时的变量空间,在构造函数时即产生这个参数,形如:
  client = AsyncHTTPClient(self.io_loop)
1.

  for x in xrange(3):


2.

  def callback(respon,num=x):


3.

  print x, num


4.

  print respon.body


5.

  if num == 2:


6.

  self.stop()


7.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))

  一种是再包一层闭包(这层闭包也可以放在for外面):
  client = AsyncHTTPClient(self.io_loop)
1.

  for x in xrange(3):


2.

  def wrap(number):


3.

  num = number


4.

  def callback(respon):


5.

  print x, num


6.

  print respon.body


7.

  if num == 2:


8.

  self.stop()


9.

  return callback


10.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))


11.

  #wrap放在for外面:


12.

  client = AsyncHTTPClient(self.io_loop)


13.

  def wrap(number):


14.

  num = number


15.

  def callback(respon):


16.

  print x, num


17.

  print respon.body


18.

  if num == 2:


19.

  self.stop()


20.

  return callback


21.

  for x in xrange(3):


22.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))

  思索了一下,闭包的内存占用问题应当是不可避免的?当循环体的每一项(x)是一个大内存对象时,内存占用等同于不用迭代器用列表进行循环,除了这两种不知道还有没有更优雅的解决方案。。

相关文章
|
存储 安全 API
阿里云oss收费标准新版介绍
阿里云对象存储服务(Object Storage Service,简称OSS)是阿里云提供的一种海量、安全、低成本、高可靠的云存储服务。它适用于各种场景,如网站、移动应用、大数据分析、备份与归档等。OSS提供标准的RESTful API接口,支持多种语言SDK,方便用户进行文件上传、下载、管理和授权等操作。
|
IDE 开发工具
IntelliJ插件开发教程之新建Action
认识Action 在IDE编辑器中可以通过右键打开选项,如下图所示,这里的动作便是Action,同时在顶部的ToolBar也会有相应的Action,如下图所示。可能大家对我这个IDE的UI有点陌生,其实这是2022.3版本的IDEA开启了New UI,NEW UI还是内测中,需要手动开启,设置位置在:Settings->appearance&behavior -> New UI
IntelliJ插件开发教程之新建Action
|
6月前
|
搜索推荐 Android开发 UED
信息检索系统评估指标的层级分析:从单点精确度到整体性能度量
本文深入探讨了信息检索系统(如搜索引擎)的评估机制,从用户行为特征出发,设计了一系列量化指标以衡量搜索结果的相关性和有效性。核心内容包括精确度(Precision)、Precision@K(聚焦前K个结果)、Average Precision@K(考虑位置权重)以及MAP@K(系统整体性能评估)。通过实际案例分析,展示了如何用这些指标评估搜索系统的质量,并强调高质量系统需在多维度上表现优异,以契合用户真实需求和行为模式。文章为优化信息检索系统提供了科学指导框架。
252 7
信息检索系统评估指标的层级分析:从单点精确度到整体性能度量
|
12月前
|
前端开发 应用服务中间件 API
|
存储 人工智能 搜索推荐
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一
本文详细介绍了第十一届泰迪杯数据挖掘挑战赛C题的解决方案,包括爬取泰迪内推平台的招聘与求职信息、构建企业和求职者画像、开发岗位匹配度与求职者满意度模型以及设计招聘求职双向推荐模型的步骤和Python代码实现。
165 2
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一
|
存储 监控 机器人
LangChain 框架
8月更文挑战第15天
|
分布式计算 关系型数据库 Serverless
实时数仓 Hologres产品使用合集之如何将ODPS视图表数据导入到Hologres内表
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
支付系统09----支付宝支付,接入准备,绑定应用,APPID绑定商家中心
支付系统09----支付宝支付,接入准备,绑定应用,APPID绑定商家中心
|
算法 数据处理 数据库
【Cisco Packet Tracer】管理方式,命令,接口trunk,VLAN
文章目录 一、交换机的管理方式: 二、交换机的命令行操作模式 三、命令行 四、交换机接口工作模式 TRUNK access trunk和access的区别 五、VLAN 1.定义 2.特性
|
存储 运维 监控
mysql开启审计日志
mysql开启审计日志
495 0