@hypnoticum: Was derdon gesagt hat.
Außerdem könnte man dein Programm pythonischer machen.
Variablen sollte man nicht so benennen, dass sie builtins überschreiben. Außerdem gibt es Operator Chaining. Und die Klammern um die Ausdrücke rechts und links vom
or sind auch überflüssig:
Code: Alles auswählen
def checkHex(hexStr):
boolResult = True
for c in hexStr:
if not (48 <= ord(c) <= 57 or 65 <= ord(c.upper()) <= 70):
boolResult = False
return boolResult
Schon besser. Allerdings gibt es die Funktion
all(), mittels derer man
boolResult loswerden kann:
Code: Alles auswählen
def checkHex(hexStr):
return all(48 <= ord(c) <= 57 or 65 <= ord(c.upper()) <= 70 for c in hexStr)
Als nächstes fällt auf, dass die Aufrufe von
ord() und
c.upper() teuer sind und durch eine - zudem besser lesbare - Konstruktion ersetzt werden können, unter Zuhilfenahme des string-Moduls:
Code: Alles auswählen
from string import hexdigits
def checkHex(hexStr):
return all(c in hexdigits for c in hexStr)
Wenn wir statt eines Strings eine Buchstabenmenge verwenden, können wir jetzt die
all()-Konstruktion loswerden, weil Mengen schon eine entsprechende Methode mitbringen:
Code: Alles auswählen
from string import hexdigits
def checkHex(hexStr):
return set(hexdigits).issuperset(hexStr)
Wenn wir das genau ansehen, stellen wir fest, dass
checkHex() dieselbe Signatur besitzt, wie
set(hex_chars).issuperset(), nämlich
str --> bool. Also können wir
checkHex auch einfach direkt mittels Zuweisung definieren:
Code: Alles auswählen
from string import hexdigits
checkHex = set(hexdigits).issuperset
Diesen Programmierstil nennt man
point-free, oder auch
tacit.
Jetzt müssen wir nun noch den Namen unserer Funktion PEP8-konform machen:
Code: Alles auswählen
from string import hexdigits
is_hex_string = set(hexdigits).issuperset
Das Ergebnis ist deklarativer, kürzer, expliziter und besser lesbar, und vielleicht sogar performanter, was ich allerdings nicht getestet habe.
In specifications, Murphy's Law supersedes Ohm's.