python递归函数下不能正常使用yield
# -*- coding:utf-8 -*-
import os
import time
file_list = []
def findFile(path):
listFile = os.listdir(path)
for file in listFile:
try:
file =os.path.join(path,file)
if os.path.isfile(file):
yield file # test1
#file_list.append(file) # test2
#print(file.decode('gb2312'))
else:
findFile(file)
except WindowsError,e:
# 捕获系统不允许访问的文件夹导致的异常,会让程序无法进行下去
# 将不允许访问的文件夹,直接跳过该文件夹
print(e)
continue
except Exception,e:
print(e)
测试代码:
start = time.time()
print('start time : ' + str(start))
t = findFile('H:\\python')
for i in t:
try:
print(str(i).decode('gb2312'))
except UnicodeDecodeError:
pass
print('use time : ' + str(time.time() - start))
然后运行就会只是将输入路径下的所有文件列举出来而已,但是没有将其下的目录下的文件列举出来,如图:
但是在上述代码中,修改一下代码,将yield file这一句注释,改用下面那一句后,即使用一个列表将所有结果汇集在一起后,然后测试,测试代码如下:
start = time.time()
print('start time : ' + str(start))
findFile('H:\\python')
for i in file_list:
try:
print(str(i).decode('gb2312'))
except UnicodeDecodeError:
pass
print('use time : ' + str(time.time() - start))
这次测试是可以正常显示所有文件夹下的所有文件的,如图:
这证明不是函数编写出现的问题,也不是出现异常导致不能获取到其他文件夹下的文件,也将测试的代码放出吧,其实只是就是在函数体加异常,而且将异常显示出来,
但是发现执行期间没有异常产生,如图:
还以为是函数没有回调导致没有查找其他文件夹下的文件,但是使用软件的调试功能来调试该程序,发现并不是函数没有回调,而是listFile始终都是没有改变,
都是H:\python下的所有文件夹和文件的集合,每当判断到其他文件时这个值都不会改变,导致for循环不能判断来自新文件夹下的所有文件夹或文件,
那就是说for循环始终判断H:\python文件夹下的元素,仅此而已。如在调试时,跳到这个NoteFiles目录时,然后就按下一步,一直到for循环时:
再按下一步:
这时发现,它直接进入了下一个文件夹,而不是进入该目录下,也可以发现listFile还是没有改变,为了证明其是进入了H:\python文件夹下的下一个文件夹,可以展开listFile就可以看到for循环直接是忽略了当前文件夹,并且进入了下个文件夹,如图:
但是如果该文件夹没有文件,也可能将会忽略该文件夹,打开NotesFile文件夹,如图:
所以并不是该文件夹下没有文件,所以是因为yield导致的原因。其实经过上述的已经可以判断是yield带来的效果,但是至于为什么会这样,恐怕我不能回答大家,
因为我也不知道,哈哈哈哈哈,至于为社么发这个博客,我只是觉得这个很有探究的意义,但是我不知道是否有意义,因为本人才疏学浅,对python更是刚接触不久,
但是我希望各位前辈可以指点一下,告诉我是不是不能在递归函数使用,还是要修改一下代码才可以使用,希望不吝指教,谢谢。2016-04-04
python递归函数下不能正常使用yield的更多相关文章
- Python天天美味(25) - 深入理解yield
Python天天美味(25) - 深入理解yield - CoderZh - 博客园 Python天天美味(25) - 深入理解yield yield的英文单词意思是生产,刚接触Python的时候 ...
- python递归函数(10)
一个函数在函数体内部调用自己,这样的函数称为递归函数,递归的次数在python是有限制的,默认递归次数是997次,超过997次会报错:RecursionError. 一.递归函数案例 案例一:计算数字 ...
- Python环境下NIPIR(ICTCLAS2014)中文分词系统使用攻略
一.安装 官方链接:http://pynlpir.readthedocs.org/en/latest/installation.html 官方网页中介绍了几种安装方法,大家根据个人需要,自行参考!我采 ...
- Python多线程下的_strptime问题
Python多线程下的_strptime问题 由于Python的datetime和time中的_strptime方法不支持多线程,运行时会报错: import datetimeimport threa ...
- Python的下划线_
1.单下划线(_) 通常情况下,单下划线(_)会在以下3种场景中使用: 1.1 在解释器中: 在这种情况下,"_"代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准C ...
- python环境下实现OrangePi Zero寄存器访问及GPIO控制
最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...
- 20170310 - Python 3 下 SQLAlchemy 的 MySQL 数据库 URI 配置
MySQL-Python 只用于 Python 2,URI配置为 mysql://username:password@server/db Python 3 下要使用另一个 PyMySQL 包,相应的U ...
- python(七) Python中单下划线和双下划线
Python中单下划线和双下划线: 一.分类 (1).以单下划线开头,表示这是一个保护成员,只有类对象和子类对象自己能访问到这些变量. 以单下划线开头的变量和函数被默认是内部函数,使用from mod ...
- python单下划线与双下划线的区别
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划 ...
随机推荐
- hbase namespace问题
如果遇到进入shell之后HMaster自动挂掉的问题,并且master的log里出现“TableExistsException: hbase:namespace”字样,很可能是更换了Hbase的版本 ...
- UIButton 头文件常见属性和方法
UIButton头文件常见属性 1.属性 contentEdgeInsets: default is UIEdgeInsetsZero.设置内容四边距,默认边距为0 @property(nonatom ...
- 表现层技术以及Freemaker使用教程
表现出计数以及Freemaker详解 在java领域,表现层技术主要有三种:jsp.freemarker.velocity.jsp是大家最熟悉的技术优点: 1.功能强大,可以写java代码 2.支持j ...
- OpenAL
http://blog.csdn.net/luckilyyu/article/details/6894707
- juce AsyncUpdaterMessage 分析
这个类同样是基于 CallbackMessage, 主要目的是为了在主线程中进行回调,只不过在收到消息的时候进行检测,检测消息发送对象是否已经删除,如果消息发送对象已经没了.消息回调最终调用了调用者的 ...
- C++ 动态分配类对象
1.概念 在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A:这两种方式是有区别的. 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通 ...
- Django建立helloworld自定义页面
目录介绍 按照上一篇初学Django首先建立起一个默认站点,生成如下的目录结构: manage.py 一种命令行工具,允许你以多种方式与该 Django 项目进行交互. 键入python manage ...
- 使用Python多线程犯的错误总结
在使用Python多线程的时候,在使用多线程编程的时候,由于对于变量作用域和多线程不是很熟悉,导致在使用多线程的时候,犯了低级的错误. 第一个错误: 在多线程中使用全局变量,导致多个线程修改全局变量. ...
- 国标电表DLT645转MODBUS TCP协议转换器MRD-5021,工业设备,浪涌三级保护MRD
DL/T645转ModbusTcp协议转换器 MRD-5021具有1 路RS485及1路以太网接口,最多支持同时采集5个DL/T645-1997或者5个2007协议国标电表设备,支持DL/T645协议 ...
- 拓扑排序(TopologicalSort)算法
拓扑排序算法应用: 有些事情做都需要按照流程的去做,比如你准备约你小女友去影院看速度与激情7大片,首先你想的是我怎么到达影院,然后达到影院,你可以先买票,或者等小女友来了一起买票,然后一起进电影大厅. ...