Tjohohan Ответов: 3

Как я могу использовать() без нагрузки()ing внутри цикла for?


Привет
Поэтому я пытался выяснить комбинаторику получения случайного значения rgb red, green и blue для предустановленного значения red+green+blue
0<=красный<=255
0<=зеленый<=255
0<=синий<=255
Я не мог так что вместо этого я затопил txt файлы со всеми комбинациями
Я проверил его со статистикой и он кажется точным

Сначала пишем программу в отдельных файлах а потом собираем ее по кусочкам
при расщеплении его в функции построения() загрузить() использовать() закрыть() нагрузки отделять() и использовать() функции с помощью цикла for он выдает Я не знаю, почему. Почему?

как я могу держать их отдельно, чтобы им не приходилось часто закрывать и открывать txt-файлы?

рабочий код ниже

"""
Fixed light, random color
"""

def build():
    
    print("build")
    files = []
    label =[" red.txt", " green.txt", " blue.txt"]
    bound = 255 
    
    for light in range(bound*3+1):
        for color in range(len(label)):
            files.append(open(str(light)+label[color], "w"))
                     
    for red in range(bound+1):
        print(red)
        for green in range(bound+1):
            for blue in range(bound+1):
                light = red + green + blue
                temp = []
                temp.append(red)
                temp.append(green)
                temp.append(blue)
                for color in range(len(label)):
                    files[light*3+color].write(str(temp[color])+"\n")

    for txt in files:
        txt.close()
    files = "string"
    
    file = open("bounds.txt", "w")
    for n in range(bound*3+1):
        num_lines = sum(1 for line in open(str(n)+" red.txt"))
        file.write(str(num_lines)+"\n")
    file.close()
    file = "string"
    
    return None

def load():
    
    print("load")
    files = []
    bound = 255
    label =[" red.txt", " green.txt", " blue.txt"]
    
    for light in range(bound*3+1):
        for color in range(len(label)):
            files.append(open(str(light)+label[color], "r"))

    bounds = open("bounds.txt", "r")
    rows_in_bounds = bounds.readlines()

    bounds.close()
    bounds = "string"
            
    return files, rows_in_bounds

def use(light, files, rows_in_bounds):
    labels = [" red.txt", " green.txt", " blue.txt"]
    rgb = []
    coleur = randrange(int(rows_in_bounds[light]))
    for m in range(3):
        rows_in_colors = files[light*3+m].readlines()
        if m == 0:
            red = (int(rows_in_colors[coleur]))
        elif m == 1:
            green = (int(rows_in_colors[coleur]))
        elif m == 2:
            blue = (int(rows_in_colors[coleur]))
        else:
            print("???")      
    return red, green, blue

def close(files):
    
    print("close")
    
    for txt in files:
        txt.close()
    files = "string" 

    return None

from random import randrange

light = 100 # or randrange with for loop
build()
files, rows_in_bounds = load()
red, green, blue = use(light, files, rows_in_bounds)      
close(files)


Что я уже пробовал:

печать значений в цикле и вне его, и из того, что я могу сказать из холостого хода, выводится одна и та же строка, int и тип значения

3 Ответов

Рейтинг:
24

Patrice T

Цитата:
получение случайного значения rgb red, green и blue для предустановленного значения red+green+blue

Этого не существует, rgb либо предустановлен, либо случайен, а не то и другое.
Цитата:
Поэтому я пытался выяснить комбинаторику получения случайного значения rgb red, green и blue для предустановленного значения red+green+blue

Это точно так же, как и с цифрами.
rgb= красный*256*256+ зеленый*256+ синий
как
Хту= сотни*10*10+ десятки*10+ единицы

Цитата:
при расщеплении его в функции построения() загрузить() использовать() закрыть() нагрузки отделять() и использовать() функции с помощью цикла for он выдает Я не знаю, почему. Почему?

Вам нужно уточнить" не работает", это нам ничего не говорит.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

27.3. ПДБ — отладчика Python — питон 3.6.1 документации[^]
Отладка в Python | Python покоряет Вселенную[^]
pdb – интерактивный отладчик - Python модуль недели[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Tjohohan

оно существует

Patrice T

Предустановленные подразумевают не случайные, а случайные подразумевают не предустановленные.

Рейтинг:
2

Richard MacCutchan

Я дал вам код для этого несколько дней назад в Как я могу убедиться, что это будет случайное значение rgb[^]. Я понятия не имею, что вы пытаетесь сделать с приведенным выше кодом, кроме как генерировать много чисел, 255 * 255 * 255 если быть точным.


Tjohohan

нет, на днях не было заявлено в вопросе, что это должно быть для заданного света (потому что я забыл). Im most cirtain это может быть сделано проще, чем то, что я пытаюсь, но randrange(256) для каждого красного зеленого и синего не будет одинаковым. как сделать случайный красный+зеленый+синий = 501?

Richard MacCutchan

Что именно вы пытаетесь создать? Вы можете иметь либо случайные цвета, либо фиксированные цвета. Но вы, кажется, пытаетесь смешать их.

Рейтинг:
12

Tjohohan

Так что я не знаю, что я сделал не так вчера, но теперь программа работает

я включил распечатку некоторых статистических данных, чтобы показать, чего я пытаюсь достичь, не просто используя randrange(256)

Я хочу случайный колер для ни одного случайного света (красный+зеленый+синий)

Ни один случайный свет не равен 432. к чему будет рандомизирован красный+зеленый+синий?

Кроме того, у меня есть новый вопрос, используя эту программу. поскольку это один вопрос на пост, я перепечатываю код в новый вопрос.

/Йохан

"""
Fixed light, random color
"""

def build():
    
    print("build")
    files = []
    label =[" red.txt", " green.txt", " blue.txt"]
    bound = 255 
    
    for light in range(bound*3+1):
        for color in range(len(label)):
            files.append(open(str(light)+label[color], "w"))
                     
    for red in range(bound+1):
        print(red)
        for green in range(bound+1):
            for blue in range(bound+1):
                light = red + green + blue
                temp = []
                temp.append(red)
                temp.append(green)
                temp.append(blue)
                for color in range(len(label)):
                    files[light*3+color].write(str(temp[color])+"\n")

    for txt in files:
        txt.close()
    files = "string"
    
    file = open("bounds.txt", "w")
    for n in range(bound*3+1):
        num_lines = sum(1 for line in open(str(n)+" red.txt"))
        file.write(str(num_lines)+"\n")
    file.close()
    file = "string"
    
    return None

def load():
    
    print("load")
    files = []
    bound = 255
    label =[" red.txt", " green.txt", " blue.txt"]
    
    for light in range(bound*3+1):
        for color in range(len(label)):
            files.append(open(str(light)+label[color], "r"))

    bounds = open("bounds.txt", "r")
    rows_in_bounds = bounds.readlines()

    bounds.close()
    bounds = "string"
            
    return files, rows_in_bounds

def use(light, files, rows_in_bounds):    
    labels = [" red.txt", " green.txt", " blue.txt"]
    rgb = []
    coleur = randrange(int(rows_in_bounds[light]))
    for m in range(3):
        rows_in_colors = files[light*3+m].readlines()
        if m == 0:
            red = (int(rows_in_colors[coleur]))
            print("lines in three txt files", len(rows_in_colors))
        elif m == 1:
            green = (int(rows_in_colors[coleur]))
        elif m == 2:
            blue = (int(rows_in_colors[coleur]))
        else:
            print("???")      
    return red, green, blue

def close(files):
    
    print("close")
    
    for txt in files:
        txt.close()
    files = "string" 

    return None

from random import randrange
from statistics import median

#build()
files, rows_in_bounds = load()

reds = []
greens = []
blues = []
lights = []

for light in range(255*3,-1,-1):
    red, green, blue = use(light, files, rows_in_bounds)
    reds.append(red)
    greens.append(green)
    blues.append(blue)
    lights.append(light)
    
print("lights")
print("lights average", sum(lights)/len(lights))
print("lights average/3", sum(lights)/3/len(lights))
print("lights median", median(lights))
print("lights median*2/3/2,", 2*median(lights)/3/2)
print("")
        
print("reds")
print("average", sum(reds)/len(reds))
print("median", median(reds))
print("")

print("greens")
print("average", sum(greens)/len(greens))
print("median", median(greens))
print("")

print("blues")
print("average", sum(blues)/len(blues))
print("median", median(blues))
print("------------------------------------------------")

close(files)