Простой код работает для любого итерабельного объекта, а не только для списков:
>>> def empty(seq):
... try:
... return all(map(empty, seq))
... except TypeError:
... return False
...
>>> empty([])
True
>>> empty([4])
False
>>> empty([[]])
True
>>> empty([[], []])
True
>>> empty([[], [8]])
False
>>> empty([[], (False for _ in range(0))])
True
>>> empty([[], (False for _ in range(1))])
False
>>> empty([[], (True for _ in range(1))])
False
Этот код делает предположение, что все, что может быть повторено, будет содержать другие элементы и не должно рассматриваться как лист в дереве". Если попытка выполнить итерацию по объекту не удалась, то это не последовательность и, следовательно, конечно, не пустая последовательность (при этом возвращается False
). Наконец, этот код использует тот факт, что all
возвращает True
, если его аргумент является пустой последовательностью.
Выбор цвета идет от 0 до 360. setHSL идет от 0 до 1.
Если вы хотите получить оттенок 50 из 360, установите значение 50/360, равное 0,1388888888888889.
setHSL (0,1388888888888889, 1, 0,5) - желтый.
let camera, scene, renderer, material;
init();
function init() {
camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 10 );
camera.position.z = 1;
scene = new THREE.Scene();
const geometry = new THREE.PlaneGeometry();
material = new THREE.MeshBasicMaterial( { color: 0xffffff } );
material.color.setHSL( 0.1388888888888889, 1, 0.5 );
const mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
renderer.render( scene, camera );
}
body {
margin: 0;
}
<script src="//cdn.rawgit.com/mrdoob/three.js/master/build/three.min.js"></script>