У меня есть программа, которая создает двоичные числа из чисел с основанием 10 на основе n
. Я использую t
в качестве счетчика для цикла while.
Я пытаюсь заполнить список выходными данными, поэтому n
должен равняться t
. Как я могу сделать это, не нарушая мой цикл while и операторы if?
keyList = []
binList = []
n = 0
i = 0
t = 0
while (t <= 255):
## 128
if n < 128:
binList.append(0)
n = n
elif n >= 128:
binList.append(1)
n = n - 128
## 64
if n < 64:
binList.append(0)
n = n
elif n >= 64:
binList.append(1)
n = n - 64
## 32
if n < 32:
binList.append(0)
n = n
elif n >= 32:
binList.append(1)
n = n - 32
## 16
if n < 16:
binList.append(0)
n = n
elif n >= 16:
binList.append(1)
n = n -16
## 8
if n < 8:
binList.append(0)
n = n
elif n >= 8:
binList.append(1)
n = n - 8
## 4
if n < 4:
binList.append(0)
n = n
elif n >= 4:
binList.append(1)
n = n - 4
## 2
if n < 2:
binList.append(0)
n = n
elif n >= 2:
binList.append(1)
n = n - 2
## 1
if n < 1:
binList.append(0)
n = n
elif n >= 1:
binList.append(1)
n = n - 1
print(n)
t = t + 1
В настоящее время я не могу заставить n
и t
равняться друг другу, не влияя на результат кода, где я получаю только 0.
@iamchoosinganame Хорошо, вот оно.
В Python уже есть функции, которые делают это, но я предполагаю, что вы работаете над заданием. Есть более простой способ сделать это.
Если вы пытаетесь преобразовать t
в двоичный код в каждом цикле, то вам, вероятно, нужно n = t
в верхней части тела цикла.
@KennyOstrom на самом деле это не задание. Я только начинаю изучать python и подумал, что это будет хороший проект.
Если вы инвертируете свой алгоритм, чтобы смотреть на младший бит вместо какого-то определенного вручную старшего бита, это намного проще. Используйте n%2, чтобы проверить, установлен ли следующий бит, и n //= 2, чтобы перейти к следующему биту.
@Duncan Я знаю, что пытался, но все равно получаю только 0. Спасибо.
Вам нужно выбрать между циклом (который может обрабатывать числа любого размера по модулю и // по основанию) или серией операторов if для обработки каждого бита отдельно. Делать и то, и другое вместе не имеет смысла.
важно отметить, что после if x<y
вы можете использовать else
вместо elif
, чтобы поймать все остальные сценарии.
Стиль цикла, который у вас есть выше, не совсем питонический. for t in range(x)
— это типичный способ перебора диапазона чисел. Вы эффективно развернули цикл в серию часто повторяющихся операторов if, которые я свернул во внутренний список. n
должен быть инициализирован для каждого значения t, и, наконец, я сделал следующий шаг, чтобы добавить двоичную строку в список ключей.
keyList = []
binList = []
n = 0
i = 0
value_list = [128, 64, 32, 16, 8, 4, 2, 1]
for t in range(255): # iterates through 0 to 255
n = t
binList = []
for v in value_list: # iterates over list in order
if n < v:
bit = 0
else:
bit = 1
n = n - v
binList.append(bit)
keyList.append("".join(map(str, binList)))
binList предназначен для получения двоичного числа в этот раз, затем оно будет добавлено в keyList, чтобы список ключей был заполнен всеми 256 числами. Кроме того, я проверил это, и вы все равно получаете только 0, а не правильный двоичный файл. Является ли оператор if для бита допустимым оператором?
@ForestCayden Я добавил готовое решение для вашей проблемы.
Не могли бы вы объяснить последнюю строку кода?
Функция str преобразует int в строку, map применяет str (или любую другую функцию с одним входом и одним выходом) ко всем записям binList, join — это функция строки, которая выводит строку из предоставленных записей, объединенных строкой, соединение которой вызывается (в данном случае это пустая строка, но это может быть ', ' для вставки запятой и пробела).
Было бы полезно увидеть весь код. Я не думаю, что смогу понять, что не так, основываясь только на фрагментах кода, которые вы предоставили.