Prgramm optimieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Hallo,

ich lerne gerade Python und da dachte ich mir eine gute Übung wäre es, wenn ich ein Programm schreibe das binäre Zahlen nach Hexadezimal umwandelt.

Das ist dabei rausgekommen:
http://paste.pocoo.org/show/80019/

Das Programm lauft zwar aber es gibt bestimmt viele Möglichkeiten wie man den Code mit mehr Wissen über Syntax und Funktionen eleganter lösen könnte.

Was kann ich bei dem Programm verbessern? Mir gefällt vor allem die Überprüfung, ob man eine Binärzahl eingegeben hat nicht (ok, könnte hier viele if durch elif ersetzten)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hallo peddy,

deine `test(bin)' liesse sich stark vereinfachen:

Code: Alles auswählen

def test(bin):
  for entry in [x for x in range(2,10)]:
    if str(entry) in bin:
      raise ValueError
Und so in `trans(bin)' einbinden:

Code: Alles auswählen

try: test(bin)
except ValueError:
  return "Das ist keine Binaerzahl!"
Um mir das noch weiter anzuschaun fehlt mir jetzt leider die Zeit, hoffe du kannst es nützen ;)
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

cofi hat geschrieben:

Code: Alles auswählen

def test(bin):
  for entry in [x for x in range(2,10)]:
    if str(entry) in bin:
      raise ValueError
Ich finde die art der Prüfung etwas merkwürdig.
Warum nicht einfach so:

Code: Alles auswählen

def test(bin):
    for digit in bin:
        if digit not in [0, 1]:
           raise ValueError
Liest sich meiner Meinung nach einfacher..

@peddy
Ich finde die Lösung sehr kreativ ;) Vielleicht könntest du das ganze ja mal in der Form überarbeiten das es auf mathemtischem Wege gelöst wird.
Dann brauchst du z.B. nicht mehr das Dictionary mit den Zuordnungen.

Edit: Bin mal gespannt wie lange es dauert bis einer dir den Spass verdirbt und einen Einzeiler als Lösung postet ... ;)
Zuletzt geändert von Zap am Dienstag 22. Juli 2008, 11:57, insgesamt 1-mal geändert.
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Danke, das ist wirklich einfacher und so naheliegend :oops:

Das

Code: Alles auswählen

for entry in [x for x in range(2,10)]:
geht aber noch einfacher

Code: Alles auswählen

        for x in range(2, 10):
            if str(x) in bin:
Pablo Escobar
User
Beiträge: 21
Registriert: Montag 12. November 2007, 15:15
Wohnort: Stuttgart

So könnte man eventuell auch die Überprüfung gestalten:

Code: Alles auswählen

def test(bin):
    try:
        int(bin,2)
    except ValueError:
        return 'Das ist keine Binaerzahl!'
oder die Umrechnung:

Code: Alles auswählen

def trans(bin):
    try:
         return hex(int(bin,2))[2:].upper()
    except ValueError:
         return 'Dies ist keine Binaerzahl!'
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

@zap
Gefällt mir auch sehr gut.

@Pablo Escobar
Die Sache mit int(10101,2) war mir neu.

hex() kannte ich, wollte aber eine Möglichkeit ohne finden.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Pablo Escobar hat geschrieben:

Code: Alles auswählen

         return hex(int(bin,2))[2:].upper()
Da ist ja der Einzeiler auf den ich gewartet hab... :P

Es gäbe auch noch diese Lösung:

Code: Alles auswählen

"0x%X" % int(bin, 2)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Zap hat geschrieben:
Pablo Escobar hat geschrieben:

Code: Alles auswählen

         return hex(int(bin,2))[2:].upper()
Da ist ja der Einzeiler auf den ich gewartet hab... :P
Das ist aber langweilig .. und schlecht zu lesen *g*

@Zap:
Deine Überprüfung ist weit besser, das stimmt .. ich hatte wohl noch zu sehr das ursprüngliche Snippet im Hinterkopf.
Antworten