Циклы while с зависимыми операторами If в Python

У меня есть программа, которая создает двоичные числа из чисел с основанием 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 30.05.2019 17:42

@iamchoosinganame Хорошо, вот оно.

Forest Cayden 30.05.2019 17:45

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

Kenny Ostrom 30.05.2019 17:47

Если вы пытаетесь преобразовать t в двоичный код в каждом цикле, то вам, вероятно, нужно n = t в верхней части тела цикла.

Duncan 30.05.2019 17:48

@KennyOstrom на самом деле это не задание. Я только начинаю изучать python и подумал, что это будет хороший проект.

Forest Cayden 30.05.2019 17:49

Если вы инвертируете свой алгоритм, чтобы смотреть на младший бит вместо какого-то определенного вручную старшего бита, это намного проще. Используйте n%2, чтобы проверить, установлен ли следующий бит, и n //= 2, чтобы перейти к следующему биту.

MisterMiyagi 30.05.2019 17:49

@Duncan Я знаю, что пытался, но все равно получаю только 0. Спасибо.

Forest Cayden 30.05.2019 17:50

Вам нужно выбрать между циклом (который может обрабатывать числа любого размера по модулю и // по основанию) или серией операторов if для обработки каждого бита отдельно. Делать и то, и другое вместе не имеет смысла.

Kenny Ostrom 30.05.2019 17:50

важно отметить, что после if x<y вы можете использовать else вместо elif, чтобы поймать все остальные сценарии.

Xander YzWich 30.05.2019 19:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
9
134
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Стиль цикла, который у вас есть выше, не совсем питонический. 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 для бита допустимым оператором?

Forest Cayden 30.05.2019 18:06

@ForestCayden Я добавил готовое решение для вашей проблемы.

Xander YzWich 30.05.2019 19:26

Не могли бы вы объяснить последнюю строку кода?

Forest Cayden 30.05.2019 20:05

Функция str преобразует int в строку, map применяет str (или любую другую функцию с одним входом и одним выходом) ко всем записям binList, join — это функция строки, которая выводит строку из предоставленных записей, объединенных строкой, соединение которой вызывается (в данном случае это пустая строка, но это может быть ', ' для вставки запятой и пробела).

Xander YzWich 30.05.2019 20:10

Другие вопросы по теме