2011-02-03 11 views
1

ジェネレータを利用してこのジェネレータのすべての要素を生成するための1つのライナはありますか?例:より深く進む - 歩留まりから歩く

def Yearly(year): 
    yield YEARLY_HEADER 
    for month in range(1, 13): 
    # How can I rewrite the following two lines? 
    for line in Monthly(month): 
     yield line 
    yield YEARLY_FOOTER 

def Monthly(month): 
    yield MONTHLY_HEADER 
    for day in range(31): # Yes, this is wrong 
    yield 'Day %d' % day 
    yield MONTHLY_FOOTER 

多分、この全体の方法を書き直すのが良い方法はありますか?

+1

私はそこにいるとは思わないし、あなたのコードは今のところ完全に読みやすくなっています。シンプルではなく複雑です。 –

+0

Olexiy、お会いできてよかったです。 :) – FogleBird

+0

@Timとても近いですが、Python引用の正しい禅は「シンプルが複合よりも優れています」; –

答えて

3

この場合、特別な構文はありません。

希望するものはPEP 380に記載されています。何年も前からありましたが、すぐにいつでもPythonに組み込むことはできません。 for .. yieldは十分に単純であり、それが提案する他の変更はかなり複雑です。

+0

ありがとう!どのくらい愚かな15文字の最小限の制限:( – Olexiy

+1

Python 3.2は数週間後にリリース予定です.PEP 380は実際にはPython 3.3に含める予定ですが、2012年末までは公開されません。 – ncoghlan

+6

Python 3.3は現在PEP380と一緒に(収穫量から)排出される。 – jomido

4
import itertools 

def Yearly(year): 
    return itertools.chain(*[(YEARLY_HEADER,)] + 
         [Monthly(m) for m in range(1, 13)] + 
         [(YEARLY_FOOTER,)]) 

基本的には、イテレータへYEARLY_HEADERYEARLY_FOOTERを作り、彼らは毎月のイテレータを連鎖させることができます。

+6

ここで良い点。はい、1つのライナーがあります。ほとんどの1ライナーと同様に、読むのは難しいです。 –

関連する問題