python递归小疑惑
代码如下:
def crawlAndGet(keyword, n):
if n>0:
jsondata = os.system('scrapy crawl beijing -a store_dir="./webserver/img" -a keyword="'+keyword+'"')
if jsondata is not None and jsondata != 0:
return jsondata
else:
return crawlAndGet(keyword,n-1)
if n<=0:
return [{'data':'null'}] def checkCompany(keyword = None):
conn = MySQLdb.connect(host="localhost", user="root", passwd="", db='qixin', port=3306, charset="utf8")
cursor = conn.cursor()
sql="select identify_id,name,ctype,owner,capital,date_found,address,date_from,date_to,scope,reg_auth,date_check,reg_status from qx_company where name = '"+keyword+"'"
cursor.execute(sql)
row = cursor.fetchone()
if row is None:
return crawlAndGet(keyword, 10)
else:
obj = [{'identify_id': row[0].encode("utf-8")},{'name': row[1].encode("utf-8")}, {'ctype': row[2].encode("utf-8")}, {'owner': row[3].encode("utf-8")},
{'capital': row[4].encode("utf-8")}, {'date_found': row[5].encode("utf-8")}, {'address': row[6].encode("utf-8")},
{'date_from': row[7].encode("utf-8")}, {'date_to': row[8].encode("utf-8")}, {'scope': row[9].encode("utf-8")}, {'reg_auth': row[10].encode("utf-8")},
{'date_check': row[11].encode("utf-8")}, {'reg_status': row[12].encode("utf-8")}]
return json.dumps(obj)
cursor.close() if __name__ == '__main__':
print checkCompany('北京正元商贸有限公司')
在执行checkCompany里的递归函数crawlAndGet是,本以为jsondata有值的时候就会return,发现其实他并没有return直到n<=0时。原因其实时,return jsondata只是代表crawlAndGet(keyword, n-i)执行完了,还要继续往下走。
为了测试这个原理,修改成如下代码:
def crawlAndGet(keyword):
jsondata = os.system('scrapy crawl beijing -a store_dir="./webserver/img" -a keyword="'+keyword+'"')
if jsondata is not None and jsondata != 0:
return jsondata
else :
return None def checkCompany(keyword = None):
conn = MySQLdb.connect(host="localhost", user="root", passwd="", db='qixin', port=3306, charset="utf8")
cursor = conn.cursor()
sql="select identify_id,name,ctype,owner,capital,date_found,address,date_from,date_to,scope,reg_auth,date_check,reg_status from qx_company where name = '"+keyword+"'"
cursor.execute(sql)
row = cursor.fetchone()
if row is None:
data = crawlAndGet(keyword)
if data is None:
data1 = crawlAndGet(keyword)
else:
return data
if data1 is None:
data2 = crawlAndGet(keyword)
else:
return data1
if data2 is None:
data3 = crawlAndGet(keyword)
else:
return data3
if data3 is None:
data4 = crawlAndGet(keyword)
else:
return data4
else:
obj = [{'identify_id': row[0].encode("utf-8")},{'name': row[1].encode("utf-8")}]
return json.dumps(obj)
cursor.close() if __name__ == '__main__':
print checkCompany('北京正元商贸有限公司')
发现即使data1,data2有return数据了,他还是会直接执行到return data4之后才返回,奇怪。
python递归小疑惑的更多相关文章
- 12岁的少年教你用Python做小游戏
首页 资讯 文章 频道 资源 小组 相亲 登录 注册 首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...
- 批量下载网站图片的Python实用小工具(下)
引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...
- python 递归深度优先搜索与广度优先搜索算法模拟实现
一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件2.找出这一次和上一次关系3.假设当前 ...
- python递归列出目录及其子目录下所有文件
python递归列出目录及其子目录下所有文件 一.前言 函数的递归,简单来说,就是函数内部调用自己 先举个小例子,求阶乘 def factorial(n): if n == 0: return 1 e ...
- python 递归,深度优先搜索与广度优先搜索算法模拟实现
一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件 2.找出这一次和上一次关系 3.假设 ...
- 30个有关Python的小技巧,给程序员的 30 个基本 Python 贴士与技巧
30个有关Python的小技巧 2013/07/04 · Python, 开发 · 4 评论 · Python 分享到: 66 本文由 伯乐在线 - Kevin Sun 翻译.未经许可,禁止转载!英文 ...
- 一个python爬虫小程序
起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...
- 用Python递归解决阿拉伯数字转为中文财务数字格式的问题(2)--打开思路的一种方法
几天前自己写了个将阿拉伯数字转为中文财务数字的程序.用的递归,不幸的是它是树形递归. 虽然实际过程中不太可能出现金额数字大到让Python递归栈溢出,但是始终是一块心病,这玩意终究在理论上是受限制的. ...
- Python 知识小tips
python进制转换函数: 二进制转换成十进制:v = "0b1111011" # int(v,2) 十进制转换成二进制:v = 18 # ...
随机推荐
- Swift实战-豆瓣电台(七)显示动画
youku观看地址http://v.youku.com/v_show/id_XNzMxODQzNDIw.html 这是一个很酷的动画效果.特别是数据多的时候 知识点 在单元格(Cell)显示方法中设置 ...
- Eclipse插件CheckStyle的安装和使用
转载自:http://www.cnblogs.com/lanxuezaipiao/p/3202169.html CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员 ...
- How to wipe silicon to CPU 如何给CPU正确涂抹硅脂
随 着计算机性能的提升,CPU的功耗也在不断的增大,虽然现在由于改进了工艺使得在功耗方面得到了一定的缓解,但由于近年来显卡性能的不断增强,也开始走上 了CPU功耗性能成正比的老路,功耗依然还是一个值得 ...
- [原创]java WEB学习笔记54:Struts2学习之路---概述,环境的搭建
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- mongodb版本管理
使用gradle. 查找最新版本http://mvnrepository.org/ compile "org.mongeez:mongeez:0.9.6" 配置spring < ...
- fault coverage enhancement
在pseudo-random test中,由于random pattern resistant的特性,fault coverage不是sufficient的, 所以会有一些办法来进行coverage的 ...
- switch结构2016/03/08
Switch 03/08 一.结构 switch(){ case *: ;break;……default: ;brek;} 练习:输入一个日期,判断这一年第几天? Console.Write(&q ...
- vim下正则表达式的非贪婪匹配
贪婪模式是: .* 非贪婪模式是: .\{-}
- 【sinatra】修改默认ip绑定
加入 # 默认的bind是127.0.0.1 set :bind, '0.0.0.0' #0.0.0.0之后你能通过lan访问这个服务器
- top.location.href和localtion.href有什么不同
top.location.href=”url” 在顶层页面打开url(跳出框架) self.location.href=”url” 仅在本页面打开url地址 pare ...