Список проверки членства в Python 3 - PullRequest
1 голос
/ 04 февраля 2012

Я пишу относительно простую программу с использованием Tkinter, которая является конвертером для двоичных, десятичных и шестнадцатеричных.Я не использую какие-либо встроенные в Python математические функции, так как я подумал, что это хороший способ научиться не только классам и объектам, но и Tkinter.

У меня есть метод, который проверяетУбедитесь, что двоичная строка верна, проверив, содержит ли она какие-либо цифры 2-9, что сделает ее недействительной.

Для этого я использую оператор if, встроенный в цикл for

bits = '011101'    #self.input_str.get()
bit_list = [i for i in bits]
ill_bits = ['2', '3', '4', '5', '6', '7', '8', '9']

for bit in bit_list:

    if bit in ill_bits:  
        print('yes')
        #self.output_disp.delete(0.0, END)
        #self.output_disp.insert(0.0, "That bit string is invalid")
    else:
        print('no')
        #self.from_binary(self.dec_bttn, self.hex_bttn)`

Две функции print() на самом деле не являются частью программы, они есть, поскольку я продолжаю тестировать разные вещи.Закомментированные части - это код, который я хочу запустить в тестовой области приложения Tkinter в качестве результата теста на достоверность.

Здесь происходит то, что

self.output_disp.delete(0.0, END)
self.output_disp.insert(0.0, "That bit string is invalid")

запускать только в том случае, если последний бит в тесте обнаружен в обоих списках.Например, битовая строка: 111019 будет отображать That bit string is invalid в текстовой области, а 111911 - нет.Хотя обе строки битов будут печатать yes в консоли при повторном выполнении 9, только та, в которой 9 находится в последнем месте, запустит две строки кода, которые начинаются с self.output_disp ....

Ответы [ 4 ]

2 голосов
/ 04 февраля 2012

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

На самом деле нет причин делать [i for i in bits]. Это не так, но на самом деле это не Pythonic. Если вам нужен список, что и делает, вы можете просто передать строку в функцию list. Если вам нужна копия строки, вы можете использовать оператор среза.

bit_list = list(bits) # Convert to list
bit_list = bits[:] # Shallow copy of a string

Хотя хорошо, что для этого вам не нужна копия.


Действительно полезная функция называется any. Вы можете проверить все сразу с ним. Кроме того, с целыми числами легче работать, чем со строками. Преобразование битов в целые числа означает, что вам не нужен этот список строк.

bits = '011101'
ill_bits = range(2, 9+1)
if any(int(bit) in ill_bits for bit in bits):
    print('Bad')
else:
    print('Good')

По сути, он говорит, что если какой-либо бит присутствует в bits и ill_bits, то число неверно. В остальном это хорошо.

1 голос
/ 04 февраля 2012

Ваш поток немного не в порядке.После первого сбоя необходимо выполнить разрыв, и блок else связан с for вместо if.

0 голосов
/ 07 февраля 2012

Вместо цикла я бы сделал:

if [bit for bit in bit_list if bit in ill_bits]:
    raise YourException("illegal bits present")

# now that all bits are legal, fill in the result

Вот как это работает: когда все биты хороши, if bit in ill_bits равно False для каждого bit, а результирующее [...] равнопусто;bool([]) is False, таким образом if [...]: запускается только при наличии плохих битов.

Если у вас очень большой bit_list, вы можете немного оптимизировать это с помощью:

if [b for b in set(bit_list) if b in ill_bits]:
    raise ....

ваш ill_bits потенциально большой, скажем, если вы практикуете арифметику base-999999, то ill_bits должен быть набором, а не списком.

0 голосов
/ 04 февраля 2012

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

import re
if re.search('[2-9]', bits):
    print('yes')
else:
    print('no')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...