簡體   English   中英

python中的yield +遞歸讓我很煩

[英]The yield + recursion in python annoyed me

我很難理解何時同時發生yield和遞歸。我想用我的代碼遍歷文件目錄:

import os
def doc_iter(fpath):
  if os.path.isdir(fpath):
    for child in os.listdir(fpath):
      child=os.path.join(fpath,child)
      print  "this is ",child
      for cn in doc_iter(child):
        print "i am here1"
        yield cn
        print "yiedl1",cn
  else:
    print "i am here2"
    yield fpath
    print "yield2",fpath

有一個目錄test ,其中有三個子目錄test1,test2,test3
在目錄test1 ,有兩個文件test11,test12
在目錄test2 ,有兩個文件test21,test22
在目錄test3 ,有兩個文件test31,test32

    >>> a.next()
this is  /home/debian/test/test2
this is  /home/debian/test/test2/test22
i am here2
i am here1
i am here1
'/home/debian/test/test2/test22'
>>> a.next()
yiedl1 /home/debian/test/test2/test22
yiedl1 /home/debian/test/test2/test22
yield2 /home/debian/test/test2/test22
this is  /home/debian/test/test2/test21
i am here2
i am here1
i am here1
'/home/debian/test/test2/test21'
>>> a.next()
yiedl1 /home/debian/test/test2/test21
yiedl1 /home/debian/test/test2/test21
yield2 /home/debian/test/test2/test21
this is  /home/debian/test/test3
this is  /home/debian/test/test3/test32
i am here2
i am here1
i am here1
'/home/debian/test/test3/test32'
>>> a.next()
yiedl1 /home/debian/test/test3/test32
yiedl1 /home/debian/test/test3/test32
yield2 /home/debian/test/test3/test32
this is  /home/debian/test/test3/test31
i am here2
i am here1
i am here1
'/home/debian/test/test3/test31'
>>> a.next()
yiedl1 /home/debian/test/test3/test31
yiedl1 /home/debian/test/test3/test31
yield2 /home/debian/test/test3/test31
this is  /home/debian/test/test1
this is  /home/debian/test/test1/test11
i am here2
i am here1
i am here1
'/home/debian/test/test1/test11'
>>> a.next()
yiedl1 /home/debian/test/test1/test11
yiedl1 /home/debian/test/test1/test11
yield2 /home/debian/test/test1/test11
this is  /home/debian/test/test1/test12
i am here2
i am here1
i am here1
'/home/debian/test/test1/test12'
>>> a.next()
yiedl1 /home/debian/test/test1/test12
yiedl1 /home/debian/test/test1/test12
yield2 /home/debian/test/test1/test12
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

輸出讓我很煩,
1,產量1的印刷等於產量2?
2.至少有兩個yield語句要運行,在教科書中,據說when run into yield ,the program will be halt, the next next() make it continue 3.讓我們分析第一個next()的輸出,為什么i am here1之后i am here2" 4.what is the function of產量cn` i am here2" 4.what is the function of什么?
5.如何詳細繪制計算樹? 6,如果編寫了遍歷目錄的函數,

bottom=[]
import os 
def doc_iter(fpath):
    if os.path.isdir(fpath):
        for child in os.listdir(fpath):
            child=os.path.join(fpath,child)
            doc_iter(child)
    else:
        bottom.append(fpath)
    return bottom

輸出為:

doc_iter("/home/debian/test")  

['/ home / debian / test / test2 / test22','/ home / debian / test / test2 / test21','/ home / debian / test / test','/ home / debian / test / test3 / test32' ,'/ home / debian / test / test3 / test31','/ home / debian / test / test〜','/ home / debian / test / test1 / test11','/ home / debian / test / test1 / test12' ']

函數和迭代器之間的區別在於:

doc_iter(child)

在迭代器中:

for cn in doc_iter(child):
    yield 

這個例子有多復雜!

因此,這里的示例有些人為的設計,會導致您在了解yield工作原理時遇到的大多數(如果不是全部)困難。

walk_dir每次迭代walk_dir導致將新的根路徑傳遞給整個函數,這將導致函數具有自己的yields的新迭代

現在,您看到打印相同路徑的原因是因為每次調用next都將更深入地移入目錄結構。

因此,每個next()返回下一個目錄或文件。 您看到的停止迭代異常是這個成語

for x in something_that_yeilds()知道如何停止。

我會看一下關於迭代器,可迭代的和生成器的出色文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM