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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM