2011-12-13 50 views
3

,簡體中文,我想要做這樣的事情:在Python中,如何從生成器表達式中調用的函數引用返回值?

({'publication': obj.pub_name, 'views': obj.views, } for obj = analyze_publication(p) for p in Publication.objects.all()) 

當然,這是行不通的。

現在,我使用的是:

({'publication': obj.pub_name, 'views': obj.views, } for obj in (analyze_publication(p) for p in Publication.objects.all())) 

我不知道如果第二代碼部分是它是如何做或者還有另一種語法,否則我只有2個星期到它的效率不高,等等。蟒蛇。

+1

請問您的第二個樣品的問題是什麼?它在Python中是正確的,併產生你想要的結果?! – gecco

+0

@gecco:沒有問題x__x,只是完全沒有經驗。第二個看起來像循環內循環我的未經訓練的眼睛...如果這些都是循環。我只是想知道這是否是一種明顯效率低下的方式。 – ForeverLearnNeverMaster

+1

我看到......實際上是有趣的挑戰。我沒有看到一個解決方案,除了有一個單獨的函數構造你的循環中的字典:'(toDict(analyze_publication(p))for p in Publication.objects.all())' – gecco

回答

1

有不平衡的零部件 ,但除此之外,您應該沒有(功能)問題嵌套生成器表達式。與列表解析一樣,嵌套時它們很快變得笨拙。出於可讀性的原因,我建議將它移出一個指定的生成器。

如果您對性能感到好奇,請使用disassemblerprofilers來比較不同的方法。

2

只是另一個版本:

(dict(publication= obj.pub_name, views= obj.views) 
    for obj in map(analyze_publication, Publication.objects.all())) 
+0

看起來很時尚!它是否執行相同的操作? (對不起,我的思想還沒有正確調整到Python語法) – ForeverLearnNeverMaster

+0

http://docs.python.org/library/functions.html#map說地圖返回一個列表(在Python3中它是一個'map'對象 - 也類型的生成器),而對於(...)中的obj則返回一個生成器。所以我認爲'地圖'可能會變差。但是我認爲這隻會對真正的大名單起作用。無論如何,在進行任何優化之前 - 1.確保它正在工作2.進行一些分析以確定這是瓶頸。 – warvariuc

+1

用'itertools.imap'替換'map'來獲取迭代器而不是列表。 –

0

而不是試圖扭曲發電機表達式語法允許名稱綁定,我只是用一個函數來產生約束力。然後它很簡單:

def pubdict(pub): 
    obj = analyze_publication(pub) 
    return {"publication": obj.pub_name, "views": obj.views} 

itertools.imap(pubdict, Publication.objects.all() 
相關問題