2013-11-22 17 views
8

Python gurular için yeni bir sorum var.Python - Alt işlevde ana işlev dışında bir grup getiri düzenlemenin herhangi bir yolu var mı?

ben şöyle tekrarlanan verim-eylemlerin bir sürü tutun fonksiyonuna A vardır:

def funA(): 
    … 
    yield a 
    yield b 
    yield c 
    … 
    yield a 
    yield b 
    yield c 
    … 
    yield a 
    yield b 
    yield c 

işlevinde tüm tekrarlanan verim koymak için bir yol var mı: gibi

yield a 
yield b 
yield c 

yüzden görünüyor ve böyle bir şey ?:

def funA(): 
    … 
    yield funB() 
    … 
    yield funB() 
    … 
    yield funB() 

Güncelleme yapmak

Bu sadece bir örnektir, ancak gerçek bir uygulamada ana jeneratörde bir kez daha tekrarlayan daha karmaşık ürün verimi dizisi (bu nedenle ürün verilerinin düzenlenmesiyle ilgili bir soru değil), ancak alt-jeneratörler hakkında. Bu yüzden kod çoğaltmasından kaçınmak istiyorum.

+0

Neden bunu yapıyorsunuz? Kulağa oldukça berbat geliyor. Tek bir fonksiyonda 1'den fazla verim olmamalıdır. Aksi halde, noktayı yeniyorsun. – Falmarri

+1

Itertools'un buraya gitme yolundan şüpheleniyorum. – munk

+1

Bunu yapmak mümkün olsa da, gerçekten ihtiyacınız olan şey bir döngüde bir "verim" gibi geliyor. – user2357112

cevap

13

En son ve en büyük python (> = 3.3) kullanıyorsanız, yield from yapısı var.

yield from funB() 

It does tam olarak ne istediğinizi: Bir alt jeneratör gibi bir işlevi çağırmak ve size verir şeyi geri verebilir.

for x in funB(): yield x 

yapabilirsiniz grup onları böyle, yer kazanmak için: Eğer python önceki bir sürümünü kullanıyorsanız

, o zaman ben bunu elle yapmanız gerekecek korkuyorum

groups = [funA, funB, funC] 
for group in groups: 
    for item in group(): 
     yield item 
+0

Evet! Teşekkürler! Tam olarak ihtiyacım olan şey, ne yazık ki 2.7 versiyonunu kullanıyorum. –

+0

Yani böyle bir sonuç çıkarmak mümkün mü: Eğer python <3.3 varsa. Alt jeneratörler yapmamak ve sadece verimi tekrarlamak daha iyidir? Yani –

+0

'dan önce olduğu gibi işlev yaptı. Aksine, fikrinizin iyi olduğunu düşünüyorum. Gözler üzerinde sonsuz bir 'verim' ifadesi akışı zordur. Olası bir gruplama tekniği için yukarıdaki düzenlememe bakın – slezica

2

itertools.chain Eğer

import itertools 

def funA(): 
    for x in range(10): 
     yield x 

def funB(): 
    for x in range(10,20): 
     yield x 

def funC(): 
    for x in range(20,30): 
     yield x 

def funs(): 
    for x in itertools.chain(funA(), funB(), funC()): 
     yield x 

print [x for x in funs()] 

Çıkışlar aradığınız fonksiyonudur:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29] 
İlgili konular