Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > В чём здесь ошибка?


Автор: Arc 11.4.2005, 16:32
Изучать python я начал недавно. Целых 3 дня назад. smile
Сейчас пытаюсь написать простенькую программку для преобразование десятичного однобайтового числа в двоичное (в моём примере это число 250). Понимаю, что её год выглядит немного глуповато, но меня интересует другое. Код (представленный ниже) почему-то не хочет выполняться интерпретатором. И прошу не обращать внимания на последнюю команду print nArray smile

number = 250
count = 8
nArray = (0,0,0,0,0,0,0,0)
index = 7
while count >= 0:
b = divmod(number,2)
number = b[0]
nArray[index] = b[1]
count = count - 1
index = index - 1

print nArray

Автор: Domestic Cat 11.4.2005, 18:17
Ты используешь тапл
Код

nArray = (0,0,0,0,0,0,0,0)

а потом пытаешься его изменить
Код

nArray[index] = b[1]



Тапл же менять нельзя. Воспользуйся листом:
Код

nArray = [0,0,0,0,0,0,0,0]

Автор: setq 11.4.2005, 18:44
и ещё кажется цикл выполнится 9 раз.
для count = 8,7,6, 5,4,3, 2,1,0.

в скобках: советую пользоваться тегами code

Автор: Arc 11.4.2005, 18:51
Всё, исправил. Теперь код работает, как часы. Спасибо, в следующий раз буду внимательнее. smile

Автор: Void 11.4.2005, 18:57
 Ошибки в коде уже указали, попробую дать рекомендации по улучшению  smile 
Код

number = 250
# список из одного элемента [0] 8 раз присоединяется сам к себе
nArray = [0] * 8
# зачем две переменные count и index, когда они принимают одинаковые значения?
index = 7
while index >= 0:
    # слева tuple, справа tuple - присваиваем два значения за один шаг
    number, nArray[index] = divmod(number, 2)
    # корокая запись index = index - 1
    index -= 1
print nArray

А можно и так:
Код

number = 250
# для каждого i в диапазоне 7..0 будет выполнена операция (number >> i) & 1
# (очевидно, это i-й бит числа number) и значения будут собраны в один список.
nArray = [(number >> i) & 1 for i in range(7, -1, -1)]
print nArray

 

Автор: Arc 11.4.2005, 19:06
Цитата(setq @ 11.4.2005, 18:44)
и ещё кажется цикл выполнится 9 раз.
для count = 8,7,6,  5,4,3,  2,1,0.

в скобках: советую пользоваться тегами code

Да нет, исполняетс ровно 8 раз. Проверено опытным путём. smile
Хотя совет я тоже приму к сведению, спасибо.

Автор: Arc 11.4.2005, 19:39
Цитата(Arc @ 11.4.2005, 19:06)
Цитата(setq @ 11.4.2005, )
и ещё кажется цикл выполнится 9 раз.
для count = 8,7,6,  5,4,3,  2,1,0.

в скобках: советую пользоваться тегами code

Да нет, исполняетс ровно 8 раз. Проверено опытным путём. smile
Хотя совет я тоже приму к сведению, спасибо.

Хотя нет, действительно 9 раз. smile

Автор: Lich 15.4.2005, 02:43
или так:

Код

func=lambda n: [(2**i<=n and (n/(2**i))%2) or 0 for i in range(7,-1,-1)]
print func(250)


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)