python遞迴函式下不能正常使用yield

2022-07-08 06:18:09 字數 2716 閱讀 6210

# -*- coding:utf-8  -*-

importos

importtime

file_list =

deffindfile(path):

listfile =os.listdir(path)

for file inlistfile:

try:

file =os.path.join(path,file)

ifos.path.isfile(file):

yieldfile # test1

#print(file.decode('gb2312'))

else:

findfile(file)

exceptwindowserror,e:

# 捕獲系統不允許訪問的資料夾導致的異常,會讓程式無法進行下去

# 將不允許訪問的資料夾,直接跳過該資料夾

print(e)

continue

exceptexception,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

extjs 在ie8下不能正常顯示解決方法

在ie6和ie7都能正常顯示但是在ie8下面不能正常顯示,解決方法如下 x ua compatible是針對ie8新加的乙個設定,對於ie8之外的瀏覽器是不識別的,這個區別與content ie 7 在無論頁面是否包含指令,都像是使用了 windows internet explorer 7的標準模...

iOS適配 舊專案工程在iOS9下不能正常顯示

在ios開發中,很多時候會用到舊專案,比如版本的公升級 使用demo等等,ios sdk正在不斷的公升級,不斷的公升級給ios開發帶來了新的活力。然而在ios sdk新的版本出來之後,舊專案可能會出現新問題。舊專案工程在ios9下不能正常顯示 如圖,上面下面各有一塊黑色區域。未設定啟動頁 在 inf...

不能正常判斷按鍵函式中的Flag

之前在51微控制器裡面定義bit型別的變數是這樣 bit flag 0 然後今天在32裡面寫 static u8 key4 flag 0 然後我在後面進行判斷 else if keycode 4 else if key4 flag 0 0000 0000 1111 1111 0000 0000 11...