[英]Converting Python code to Kotlin
我找到了生成 n 个不同 colors 的代码。 我拿了代码并从中制作了一个 class
import colorsys
import itertools
from fractions import Fraction
class DistinctColorsGenerator:
def __init__(self):
self._bias = lambda x: (math.sqrt(x / 3) / Fraction(2, 3) + Fraction(1, 3)) / Fraction(6, 5)
self._gen_rgb = lambda x : colorsys.hsv_to_rgb(*x)
self._flatten = itertools.chain.from_iterable
self._hsvs = lambda: self._flatten(map(self._hsv, self._fracs()))
self._rgbs = lambda: map(self._gen_rgb, self._hsvs())
self._gen_colors = lambda: map(self._gen_color, self._rgbs())
def generate(self, number):
return list(itertools.islice(self._gen_colors(), number))
def _zenos_dichotomy(self):
for k in itertools.count():
yield Fraction(1, 2 ** k)
def _fracs(self):
yield 0
for k in self._zenos_dichotomy():
i = k.denominator
for j in range(1, i, 2):
yield Fraction(j, i)
def _hsv(self, h):
for s in [Fraction(6, 10)]:
for v in [Fraction(8, 10), Fraction(5, 10)]:
yield (h, s, v)
def _gen_color(self, x):
uint8tuple = map(lambda y: int(y * 255), x)
return list(uint8tuple)
我想将其转换为 Kotlin,问题是我的大部分 Kotlin 经验(以及 Python)都是编写普通无聊的代码。 而看起来这个通过生成无限序列并懒惰地评估它来解决问题。 我可以只看Python的代码,明白是怎么回事,写一个简单无聊的代码。 但在此之前,我想在这里询问是否有人可以展示如何在 Kotlin 中实现类似的事情
我阅读了一些文档(如评论中所建议),这就是我想出的(以防万一有人会觉得有用)
class DistinctColorsGenerator {
fun generate(number: Int): List<ColorRgb> = generateRgbs.take(number).toList()
private val genHsvs = buildSequence {
fractions.forEach { createHsvColors(it).forEach { yield(it) } }
}
private val generateRgbs = buildSequence {
genHsvs.forEach { yield(it.toRgb()) }
}
private val zenosDichotomy = buildSequence {
var d = 1
while (true) {
yield(Fraction(1, d))
d *= 2
}
}
private val fractions = buildSequence {
yield(Fraction(0, 1))
zenosDichotomy.forEach {
val i = it.denominator.toInt()
for (j in 1 until i step 2) {
yield(Fraction(j, i))
}
}
}
private fun createHsvColors(h: Fraction<Int>) = buildSequence {
listOf(Fraction(6, 10)).forEach { s ->
listOf(Fraction(8, 10), Fraction(5, 10)).forEach { v ->
yield(ColorHsv(h, s, v))
}
}
}
}
类ColorRgb
, ColorHsv
和Fraction
只是数据类。 我从这里取的ColorHsv.toRgb()
import random N = random.randrange(1,10) A = [random.randrange(100) for e in range(N)] print(A) print(min(A)) B = [random.randrange(100) for e in range(N)] print(B) print(min(B)) C = [random.randrange(100) for e in range(N)] print(C) print(min(C))
你能把它转换成kotlin吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.