代码如下:

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递归小疑惑的更多相关文章

  1. 12岁的少年教你用Python做小游戏

    首页 资讯 文章 频道 资源 小组 相亲 登录 注册       首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...

  2. 批量下载网站图片的Python实用小工具(下)

    引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...

  3. python 递归深度优先搜索与广度优先搜索算法模拟实现

    一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件2.找出这一次和上一次关系3.假设当前 ...

  4. python递归列出目录及其子目录下所有文件

    python递归列出目录及其子目录下所有文件 一.前言 函数的递归,简单来说,就是函数内部调用自己 先举个小例子,求阶乘 def factorial(n): if n == 0: return 1 e ...

  5. python 递归,深度优先搜索与广度优先搜索算法模拟实现

    一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件 2.找出这一次和上一次关系 3.假设 ...

  6. 30个有关Python的小技巧,给程序员的 30 个基本 Python 贴士与技巧

    30个有关Python的小技巧 2013/07/04 · Python, 开发 · 4 评论 · Python 分享到: 66 本文由 伯乐在线 - Kevin Sun 翻译.未经许可,禁止转载!英文 ...

  7. 一个python爬虫小程序

    起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...

  8. 用Python递归解决阿拉伯数字转为中文财务数字格式的问题(2)--打开思路的一种方法

    几天前自己写了个将阿拉伯数字转为中文财务数字的程序.用的递归,不幸的是它是树形递归. 虽然实际过程中不太可能出现金额数字大到让Python递归栈溢出,但是始终是一块心病,这玩意终究在理论上是受限制的. ...

  9. Python 知识小tips

    python进制转换函数: 二进制转换成十进制:v = "0b1111011"    # int(v,2) 十进制转换成二进制:v = 18                   # ...

随机推荐

  1. 使用MJExtension中要注意的地方

    MJExtension git地址  https://github.com/CoderMJLee/MJExtension#JSON_Model Model contains model-array[模 ...

  2. PostgreSQL Replication之第十三章 使用PL/Proxy扩展(1)

    在这里添加一个slave,真的有一个很好的可扩展性的策略,这基本上足以满足大多数现代应用程序.使用一台服务器的情况下,许多应用程序就会完美地运行,您可能想添加以副本以给基础设施增加一些安全,但在许多情 ...

  3. win32 listbox

    real-time refresh: the scrollbar will jump when the listbox refresh change color: how to change the ...

  4. poj1703 Find them, Catch them 并查集

    poj(1703) Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26992   ...

  5. ACM之Java速成(1)

    这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner cin = new Sc ...

  6. Java基础(43):Java中的Object类与其方法(转)

    Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...

  7. javascript 异常处理和事件处理

    异常捕获 1.异常:当javascript引擎执行JS代码时,发生了错误,导致程序停止运行. 2.异常抛出:当异常产生,并且将这个异常生成一个错误信息 3.异常捕获: try{发生异常的代码块:}ca ...

  8. demo15 AlertDialog

    Dialog dialog = new AlertDialog.Builder(this).setTitle("对话框").setMessage("this is msg ...

  9. mysql 行锁

    在电子商务里,经常会出现库存数量少,购买的人又特别多,大并发情况下如何确保商品数量不会被多次购买. 其实很简单,利用事务+for update就可以解决. 我们都知道for update实际上是共享锁 ...

  10. php session memcache

    ini_set("session.save_handler", "memcache"); ini_set("session.save_path&quo ...