Come verificare se un ingresso è in formato binario(1 e 0)?

Ho fatto un programma comunque volevo aggiungere un’eccezione se l’input dell’utente non è in un formato binario. Ho provato molte volte l’aggiunta di eccezioni, ma io non riesco a farlo funzionare. Il seguente è il codice del programma. Sarei grato se qualcuno potesse aiutare.

import time
error=True
n=0
while n!=1:
    print"***Welcome to the Bin2Dec Converter.***\n"
    while error:
        try:
            bin2dec =raw_input("Please enter a binary number: ")
            error=False
        except NameError: 
            print"Enter a Binary number. Please try again.\n"
            time.sleep(0.5)
        except SyntaxError: 
            print"Enter a Binary number. Please try again.\n"
            time.sleep(0.5)


        #converts bin2dec
        decnum = 0 
        for i in bin2dec: 
            decnum = decnum * 2 + int(i)
            time.sleep(0.25)
        print decnum, "<<This is your answer.\n" #prints output

OriginaleL’autore Rayner Da Cruz | 2013-09-15

8 Replies
  1. 1

    Se si sta evitando di Python costruito nel modo di fare questo (int(..., 2)), come un esercizio di apprendimento, quindi un logico e Divinatori approccio sarebbe quello di fare il vostro proprio errore di classe e di costruire l’errore del check-in in funzione di conversione.

    class BinaryError(Exception):
        def __str__(self):
            return "Not a valid binary number"
    
    def bin2dec(input_string):
        r = 0
        for character in input_string:
            if character == '0':
                r = r * 2
            elif character == '1':
                r = r * 2 + 1
            else:
                raise BinaryError()
        return r
    
    while True:
        try:
            print bin2dec(raw_input("Please enter a binary number: "))
        except BinaryError:
            print "Enter a Binary number. Please try again.\n"
        else:
            break

    OriginaleL’autore Stuart

  2. 9

    Meglio chiedere il perdono. Prova a convertire il numero utilizzando int(valore 2):

    while True:
        try:
            decnum = int(raw_input("Please enter a binary number: "), 2)
        except ValueError:
            print "Enter a Binary number. Please try again.\n"
        else:
            break
    
    print decnum
    Yup, più pieni che la mia risposta 🙂
    Penso che sarebbe più bello per sbarazzarsi di inutili continue e magari spostare break in un else blocco.
    grazie, buon punto.
    e ‘ un implicito di controllo (per la conversione funziona solo per ingresso binario), quindi questa è una cosa che l’OP ha chiesto + di un modo migliore per gestire il problema IMO
    Si noti che questa funzione consente a più ingressi validi che l’OP versione. Si deve verificare se l’input dell’utente contiene un b prima di chiamare int(..., 2), altrimenti ingressi a partire con il 0b prefisso saranno ammessi(che, credo, non è qualcosa che l’OP vuole, e comunque dovrebbe essere consapevoli di questo cambiamento).

    OriginaleL’autore alecxe

  3. 6

    int(bin2dec, 2) lancerà una ValueError se l’ingresso non è in formato binario. Ma, naturalmente, che risolve tutto il problema per voi.

    OriginaleL’autore Imre Kerr

  4. 4

    Utilizzando set():

    def is_binary(x):
        return set(input_string) <= set('01')
    
    input_string = "0110110101"
    print(is_binary(input_string))
    
    input_string = "00220102"
    print(is_binary(input_string))
    Nota, questo non funziona per “00000” o “111111” (o qualsiasi altro modello contenente solo uno dei due caratteri).
    Ah sì, è vero 😉 ho modificato il codice…
    Penso che si potrebbe scrivere set(input_string) <= set('01') docs.python.org/2/library/sets.html#set-objects
    Bella @Stuart, grazie!
    se davvero si volesse utilizzare un set per questo, poi un altro modo è not set('01').symmetric_difference(input_string)

    OriginaleL’autore tamasgal

  5. 2

    Utilizzando :

    >>> b = '01011'
    >>> all(c in '01' for c in b) # OR  c in ('0', '1')
    True
    >>> b = '21011'
    >>> all(c in '01' for c in b) # OR  c in ('0', '1')
    False
    è più veloce rispetto ad altri?
    Voglio dire, perché any() e all() anche le funzioni di supporto cortocircuiti
    Non ne sono sicuro. Ma penso int si fermerà anche se ha trovato alcune voci di caratteri/cifre all’interno del loop.
    Ok int(your_string, 2) sembra più corretto modo troppo…grazie a aggiungere una tecnica
    Vedere codice sorgente (esp. PyLong_FromString)

    OriginaleL’autore falsetru

  6. 1
    >>> b = '01011'
    >>> not(b.translate(None, '01'))
    True
    >>> b = '21011'
    >>> not(b.translate(None, '01'))
    False
    not è un operatore unario, quindi non c’è bisogno di aggiungere parentesi, come per una chiamata di funzione.

    OriginaleL’autore John La Rooy

  7. 1

    Utilizzando re:

    >>> import re
    >>> matches = re.match('[01]*$', bin2dec)
    >>> if matches:
    ...    process(bin2dec)
    Pensa tu in realtà vuoi [01]+$
    Grazie, sono d’accordo con il $; mi dimentico sempre match ha un implicito ^, ma non $. * vs + è una domanda per l’OP davvero.

    OriginaleL’autore Alex Chamberlain

Lascia un commento