2017-08-11 22 views
1

是否可以通過Python中的迭代器對函數進行單線調用?不帶塊的單線函數調用?

背景:

假設我想在目錄列表創建一個子目錄。傳統上,我會用列表解析來構建所需的子目錄路徑的列表:

subs = [os.path.join(root, "sub") for root in roots]

哪裏roots是目錄列表。那我就必須創建一個for塊叫os.mkdir()

for sub in subs: 
    os.mkdir(sub) 

問:

是否有可能使用發電機來做到這一點?

我已經試過: os.mkdir(os.path.join(root, "sub") for root in roots)

但它拋出一個TypeError說發電機是不能接受的。

+4

你可以重寫你的循環作爲列表理解。但你不應該。因爲你不想創建一個新的列表。你正試圖在循環中執行一個命令。這就是正常的'for'陳述的目的。 – khelwood

+1

單行:'for sub in subs:os.mkdir(sub)'。 –

+0

@AshwiniChaudhary這並不能解決問題。在那之前可以執行'subs'仍然需要被做,我想不創建另一個列表對象。 – datta

回答

3

是的,你可以這樣做:

[os.mkdir(os.path.join(root, "sub")) for root in roots] 

這工作,因爲列表解析會,即使你沒有任何地方的分配結果來執行。 os.mkdir調用將返回None,因此結果將是None的列表(您不需要關心),但函數的作用將發生。現在

,這是值得商榷的是否是或:

for root in roots: 
    os.mkdir(os.path.join(root, "sub")) 

甚至:

for root in roots: os.mkdir(os.path.join(root, "sub")) 

更具有可讀性,因爲人們普遍預期列表解析生成列表和循環執行的操作,因此例如,如果您在閱讀理解內容時檢查代碼,則可能很容易錯過您實際上正在創建文件夾。但如果你,你可以。

+0

我不知道我可以使用列表理解這個。很高興知道。雖然'for'塊是傳統的,它只是從程序中消除額外的行來建立列表,然後爲每個列表隨後的'for'循環。寧願帶有'#'評論的單行眼鏡來解釋。 – datta

+0

@datta如果你要爲這些簡單的東西添加評論,那麼你做錯了。 for循環更明顯,不需要任何解釋。 –

+0

我真的不喜歡爲了產生副作用而專門編寫列表理解。無論如何,我的兩分錢。 – wwii