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 类中的私有变量名 核心风格:避免用下划 ...
随机推荐
- Android EditText 取消复制粘贴功能,取消横向全屏编辑功能(一)
在做一些安全性的软件时候常常要考虑取消 EditText 上的复制粘贴功能以确保安全性.下面就记录了这个方法: 首先在API-11以下的版本很简单,只需要在Xml布局文件或者用代码把长按属性设置成fa ...
- 用ul、li做横向导航
/* ul li以横排显示 */ /* 所有class为menu的div中的ul样式 */ div.menu ul { list-style:none; /* 去掉ul前面的符号 */ margin: ...
- oracle体系结构
oracle体系结构有四个部分组成分别为:oracle 服务器.用户进程.服务器进程.其他关键文件.其中oracle服务器又有实例(instance)和database组成是一个数据库管理系统. 一. ...
- Android 抓包,监控流量工具之 mitmproxy
转:http://greenrobot.me/devpost/how-to-debug-android-http-get-started/ mitmproxy实践教程之调试 Android 上 HTT ...
- zrender源码分析1:总体结构
开始 zrender(Zlevel Render) 是一个轻量级的Canvas类库,这里是GitHub的网址 点我, 类似的类库有Kinetic.JS.EaselJS. 但貌似都没有zrender好用 ...
- sencha touch 2.3 结合cordova 环境搭建
sencha touch 2.3环境搭建必备工具 sencha touch 2.3 包sencha cmd 4.0以上JAVA JDK 1.7以上(注意JDK和JRE的区别)Ruby 1.9.3或更早 ...
- JavaScript学习笔记(三)this关键字
this是Javascript的关键字,代表在函数运行时,自动生成一个内部对象,只能在函数内部使用.例如: function test() { this.x = 1; } 随着函数的使用场合不同,th ...
- 00UILabel控件的详解
文本属性 1.text:label显示的文字 2.font:text的字体,值不可以为nil,否则异常 3.textColor:text的颜色 4.textAlignment;text的对其方式 5. ...
- html5介绍
html5与html4的区别 (h5 and h4) 什么是OPOA 1, 浏览器对h5的支持情况 2, 历史 --- h5 2004年,whatwg 提出 w ...
- Cocos2d-X学习之Ref类
先看看定义该类的头文件——CCRef.h /**************************************************************************** C ...