Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 1, 2013 13:59:26

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает код для переопределения элементов в массиве

Набросал простой пример проблемы. Есть класс созданныя для выбора и сравнения значений цветов из массивов(Менять класс нельзя). Некоторые значения хранятся не в массивах, а в переменных (Менять нельзя).
После того как значения выбраны, необходимо произвести проверку, и если среди значений есть ‘blank’, то есть “пустой” цвет, переопределять остальные значения цветов на ‘blank’.

import random

#Данные
colors_one = [('brown', 1), ('black', 1), ('green',1),
('blue', 0), ('gray', 0), ('blank', 1)]

colors_two = [('white', 0), ('black', 2), ('gray', 3),
('green', 1), ('yellow', 0), ('red', 1),
('blank', 0)]

class define_color:
#Выбирает два случайных цвета из массива, сравнивает их
#индексы и присваивает переменной main_color тот
#признак у которого индекс выше.
def __init__(self, seq):
#Описываем переменные
self.sequence = seq
self.choice_one = random.choice(self.sequence)
self.choice_two = random.choice(self.sequence)
self.main_color = 'N/A'

#Сравниваем
if self.choice_one[1] > self.choice_two[1]:
self.main_color = self.choice_one[0]

if self.choice_one[1] < self.choice_two[1]:
self.main_color = self.choice_two[0]

if self.choice_one[1] == self.choice_two[1]:
self.main_color = self.choice_one[0]

#Создаем несколько экземпляров класса для тестирования
color_one = define_color(colors_one)
color_two = define_color(colors_two)

#Поскольку некоторые значения хранятся не как атрибут класса
#а как обычные переменные, создаем обычные переменные
color_three = "N/A"
color_four = "blank"

#Выводим отладочную информацию
#До переопределния
print("Unchanged values")
print("color one", color_one.main_color)
print("color two", color_two.main_color)
print("color three", color_three)
print("color four", color_four)

#Начинаем проверку на вхождение "blank"
#Создаем массив куда помещаем значения переменных и атрибутов класса
color_list = [color_one.main_color, color_two.main_color,
color_three, color_four]

#Cчетчик для цикла
col_counter = len(color_list) - 1

#Перебираем значения хранящиеся в массиве и если видим хоть один пустой цвет
#переопределяем остальные цвета на пустой (blank).
if "blank" in color_list:
while col_counter != 0:
color_list[col_counter] = "blank"
col_counter = col_counter - 1

#Просто разделитель
print('-----------------------------------')

#Выводим отладочную информацию
#После переопределния
print("Changed values")
print("color one", color_one.main_color)
print("color two", color_two.main_color)
print("color three", color_three)
print("color four", color_four)

Насколько я понимаю, проблема в том, что в массиве color_list хранятся копии переменных, а не сами переменные хранящиеся в color_one.main_color, color_four и т.д. Соответственно, цикл присваивает значения blank именно этим копиям, что само собой, никак не влияет на исходные значения переменных, хранящихся в color_one.main_color, color_two.main_color и т.д. Верна ли моя догадка? Возможно ли, сделать так, что бы значения присваивались не копиям, а самим переменным?

Очень полезна была бы функция, которая позволяет получить порядковый номер элемента массива, по его значению. Вроде бы раньше в питоне, что то такое было?

Я не придумал ничего лучше, кроме как обращаться к переменным напрямую.
if "blank" in color_list:
color_one.main_color = 'blank'
color_two.main_color = 'blank'
color_three = 'blank'
color_four = 'blank'
Но может быть есть более правильное решение? Ведь переменных может быть не четыре, а четыре сотни к примеру.



Отредактировано rudm (Дек. 1, 2013 14:06:12)

Офлайн

#2 Дек. 1, 2013 15:05:07

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Не работает код для переопределения элементов в массиве

Есть такая штука - слоты (__slots__), покопайте в эту сторону
хотя… тут наверное лучше через словарь сделать и всё…



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Отредактировано Master_Sergius (Дек. 1, 2013 15:08:42)

Офлайн

#3 Дек. 1, 2013 19:55:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Не работает код для переопределения элементов в массиве

rudm
После того как значения выбраны, необходимо произвести проверку, и если среди значений есть ‘blank’, то есть “пустой” цвет, переопределять остальные значения цветов на ‘blank’.
придётся сделать функцию, которая меняет всё: глобальные переменные устанавливает и у объектов вызывает метод изменения атрибутов

rudm
Менять класс нельзя
придётся добавить метод, который делает изменение всех атрибутов (объект сам должен знать, какие у него атрибуты внутри)

rudm
Ведь переменных может быть не четыре, а четыре сотни к примеру.
переменных может быть не только много, но и имена у них могут меняться

rudm
Но может быть есть более правильное решение?
сначала избавиться от глобальных переменных

rudm
Очень полезна была бы функция, которая позволяет получить порядковый номер элемента массива, по его значению.
help(list)
help(list.index)

вообще, сильно отдаёт тем, что ты не знаешь, что такое структурное программирование
разработку нужно вести сверху вниз:
1. мне нужна рука, чтобы взять яблоко
2. делаю руку, будто она есть
2.1. чтобы рука взяла яблоко, нужно её протянуть
2.1.1. чтобы протянуть руку, нужны суставы
2.2. делаю суставы, будто они есть
2.3. чтобы рука взяла яблоко, нужно его зажать
2.3.1. чтобы зажать яблоко, нужна кисть
2.4. делаю кисть, будто она есть
2.4.1. чтобы яблоко не вывалилось, нужно его удерживать
2.4.1.1. чтобы удерживать, нужны пальцы
2.4.2. делаю пальцы, будто они есть

после выполнения 2-го пункта у тебя есть работающая рука, но она состоит из заглушек - то есть суставы мнимые, кисть мнимая
когда ты даёшь команду руке взять яблоко, она тебе сообщает, что взяла его
когда это всё отлажено, ты приступаешь к разработке суставов и кисти
суставы становятся настоящими, но кисть состоит из заглушек - то есть пальцы на ней мнимые
когда рука кисти даёт команду зажать яблоко, та ей сообщает, что яблоко зажато
когда это всё отлажено, ты приступаешь к разработке пальцев
у них там тоже суставы есть

вот так делаешь, пока не дойдёшь до дна (разрабатывать будет больше нечего)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version