3

N個の「異なる」色を自動的に生成する方法の最後でソリューションを再利用しようとしていますか?Python2.7を使用します。

残念ながら、以下のコードは返されませんislice()。最初の100回の反復を要求したとしても、内部マップは次のように呼び出しているようです。

gethsvs = lambda: flatten(itertools.imap(genhsv, getfracs()))

すべての反復を強制的に取得します。すべてのラムダ関数に反復回数を渡す代わりに、islice()以下のようにメインコードで呼び出しを行う方法はありますが、すべての内部マップでも最初の100回の反復のみを取得しますか?

import colorsys, itertools, numpy as np
from fractions import Fraction

def zenos_dichotomy():
    '''
http://en.wikipedia.org/wiki/1/2_%2B_1/4_%2B_1/8_%2B_1/16_%2B_%C2%B7_%C2%B7_%C2%B7
    '''
    for k in itertools.count():
        yield Fraction(1, 2 ** k)

def getfracs():
    '''
    [Fraction(0, 1), Fraction(1, 2), Fraction(1, 4), Fraction(3, 4), Fraction(1, 8), Fraction(3, 8), Fraction(5, 8), Fraction(7, 8), Fraction(1, 16), Fraction(3, 16), ...]
    [0.0, 0.5, 0.25, 0.75, 0.125, 0.375, 0.625, 0.875, 0.0625, 0.1875, ...]
    '''
    yield 0
    for k in zenos_dichotomy():
        i = k.denominator # [1,2,4,8,16,...]
        for j in range(1, i, 2):
            yield Fraction(j, i)

'''Can be used for the v in hsv to map linear values 0..1 to something that looks equidistant.'''
bias = lambda x: (np.sqrt(x / 3) / Fraction(2, 3) + Fraction(1, 3)) / Fraction(6, 5)

def genhsv(h):
    for s in [Fraction(6, 10)]: # optionally use range
        for v in [Fraction(8, 10), Fraction(5, 10)]: # could use range too
            yield (h, s, v) # use bias for v here if you use range

genrgb = lambda x: colorsys.hsv_to_rgb(*x)
flatten = itertools.chain.from_iterable
gethsvs = lambda: flatten(itertools.imap(genhsv, getfracs()))
getrgbs = lambda: itertools.imap(genrgb, gethsvs())

def genhtml(x):
    uint8tuple = itertools.imap(lambda y: int(y * 255), x)
    return 'rgb({},{},{})'.format(*uint8tuple)

gethtmlcolors = lambda: map(genhtml, getrgbs())

if __name__ == '__main__':
    print(list(itertools.islice(gethtmlcolors(), 100)))
4

1 に答える 1

2

ラムダmap()の代わりに使用itertools.imap()しています:gethtmlcolors

gethtmlcolors = lambda: map(genhtml, getrgbs())

Python 2 ではmap()、入力 iterable のすべての要素を試行して処理します。それを使用するように変更するimap()と、すべてが機能します。

gethtmlcolors = lambda: itertools.imap(genhtml, getrgbs())
于 2013-01-14T16:09:50.017 に答える