代码如下:

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. 实验十五_安装新的int 9中断例程

    安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,    如果松开,就显示满屏幕的“A”:其他的键照常处理. 提示:按下一个键时产生的扫描码称为通码,松开一个键产生的扫描 ...

  2. Ruby与Python开发的环境IDE配置(附软件的百度云链接)

    Ruby开发环境配置 1.Aptana_RadRails(提示功能不好,开发Ruby不推荐) 链接:http://pan.baidu.com/s/1i5q96K1 密码:yt04 2.Aptana S ...

  3. 利用API 建立Dependent Value Set

    . 建立SET fnd_flex_val_api.create_valueset_independent(v_set_name ,v_description ,v_security ,v_enable ...

  4. 夺命雷公狗---DEDECMS----31dedecms数据库创建一张表完成curl操作

    首先我们创建一张测试表,格式如下所示: 然后我们还是在plus目录下创建一个test3.php进行测试,首先写一个添加的: <?php header("Content-Type:tex ...

  5. zw版【转发·台湾nvp系列Delphi例程】HALCON InpaintingCt2

    zw版[转发·台湾nvp系列Delphi例程]HALCON InpaintingCt2 unit Unit1;interfaceuses Windows, Messages, SysUtils, Va ...

  6. 经典SQL

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  7. C++笔试题(部分)

    1.简述C++11和Boost 2.struct和union与class的区别 3.为什么C++中调用被C编译器编译后的函数要加extern C声明? 4.以下代码哪里不对? #pragma regi ...

  8. SQL Server数据库的三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式(转载)

    SQL Server数据库有三种恢复模式:简单恢复模式.完整恢复模式和大容量日志恢复模式: 1.Simple 简单恢复模式, Simple模式的旧称叫”Checkpoint with truncate ...

  9. OpenStack 界面开发中的排序问题

    Contents [hide] 1 需求 2 调研 3 排序的办法 4 解决代码 需求 获取主机列表的时候,希望能够对主机列表能分组显示,比如网络,一组网络段希望在一起显示 调研 openstack的 ...

  10. 图像处理工具包ImagXpress中如何定义图像显示属性

    图像处理工具包ImagXpress中如何定义图像显示属性,如色彩管理.设置工具栏和工具.设置上下文&工具栏菜单.配置滚动条.鼠标和键等······ 在显示图像时的色彩管理 在ImagXpres ...