Seite 1 von 1

if/then kürzen

Verfasst: Freitag 8. Mai 2020, 09:48
von Cannon
Ich habe hier mehrere Abfragen mit if then else. Die Hex-Zahl dahinter wird sich immer wieder ändern, kann also auch 0x0010 sein. Nun ist für mich die Frage, ob man das nicht kürzen kann? Einfach mit eine Art Berechnung?

Code: Alles auswählen

vresult = 17833
if (vresult & 0x0200) > 0:
    cresult = True
 else:
     cresult = False
Das wird sicherlich nicht gehen oder?

Code: Alles auswählen

cresult = bool(vresult & 0x0200)

Re: if/then kürzen

Verfasst: Freitag 8. Mai 2020, 09:56
von __deets__
Hast du's ausprobiert? Macht es was du willst? Dann geht es.

Re: if/then kürzen

Verfasst: Freitag 8. Mai 2020, 10:05
von Jankie
Da würde sich eine Funktion gut anbieten bei der du die Werte als Parameter übergibst.

Code: Alles auswählen

def mach_was(vresult, hex_number):
    return vresult & hex_number > 0
    
    
print(mach_was(17833, 0x0200))
bzw.

Code: Alles auswählen

VRESULT = 17833

def mach_was(hex_number):
    return VRESULT & hex_number > 0
       
print(mach_was(0x0200))
Wenn VRESULT (was auch immer das ist) konstant ist.

Re: if/then kürzen

Verfasst: Freitag 8. Mai 2020, 11:38
von Sirius3
Die Namen sind schlecht, da c und v keine Aussagekraft haben.
Wenn man cresult nur in einem boolschen Kontext verwendet reicht auch

Code: Alles auswählen

cresult = vresult & 0x0200
@Jankie: die mach_was-Funktion würde man wohl bits_set nennen und entspricht so ziemlich dem &-Operator, so dass eine eigene Funktion hast übertrieben ist. Wenn VRESULT konstant wäre, dann wäre CRESULT auch konstant.

Re: if/then kürzen

Verfasst: Freitag 8. Mai 2020, 11:57
von Jankie
@Sirius3:

der Hexwert ändert sich doch, also ist es nicht konstant, oder hab ich ein Denkfehler?
Cannon hat geschrieben: Freitag 8. Mai 2020, 09:48 Die Hex-Zahl dahinter wird sich immer wieder ändern, kann also auch 0x0010 sein

Re: if/then kürzen

Verfasst: Freitag 8. Mai 2020, 13:51
von Cannon
Sirius3 hat geschrieben: Freitag 8. Mai 2020, 11:38 Die Namen sind schlecht, da c und v keine Aussagekraft haben.
Wenn man cresult nur in einem boolschen Kontext verwendet reicht auch

Code: Alles auswählen

cresult = vresult & 0x0200
@Jankie: die mach_was-Funktion würde man wohl bits_set nennen und entspricht so ziemlich dem &-Operator, so dass eine eigene Funktion hast übertrieben ist. Wenn VRESULT konstant wäre, dann wäre CRESULT auch konstant.
Das ganze ist nur beispielhaft. Deshalb auch irgendwelche Variablen. cresult ist dynamisch, deshalb ist nichts konstant.

cresult = vresult & 0x0200 ergibt doch aber nicht True oder False, sondern entweder 0 oder eben 0x0200 ?

Re: if/then kürzen

Verfasst: Freitag 8. Mai 2020, 14:02
von Sirius3
@Cannon: deshalb auch die Frage, wo Du cresult benutzt. Wenn das nur in einem if passiert, ist das egal.

Re: if/then kürzen

Verfasst: Freitag 8. Mai 2020, 19:27
von Cannon
Sirius3 hat geschrieben: Freitag 8. Mai 2020, 14:02 @Cannon: deshalb auch die Frage, wo Du cresult benutzt. Wenn das nur in einem if passiert, ist das egal.
Nein, ich nutze das, um das eine Variable zuzuweisen. Der Ziel-Typ muss deshalb bool sein.

Re: if/then kürzen

Verfasst: Samstag 9. Mai 2020, 11:28
von Cannon
Ich habe das jetzt so probiert:

Code: Alles auswählen

result1 = bool(vresult & 0x0010)
result2 = bool(vresult & 0x0020)
Anscheinend geht das auch. Aber darf man das so machen?

Re: if/then kürzen

Verfasst: Samstag 9. Mai 2020, 13:17
von __blackjack__
@Cannon: Darf man. 🙂

Ich weiss es sind alles nur Beispiele, aber wenn die literalen Hex-Zahlen jeweils für einzelne Bits oder Masken mit einer Bedeutung stehen, würde man die der besseren Lesbar- und Verständlichkeit als Konstanten mit sprechenden Namen definieren. Eventuell wäre auch `enum.IntFlag` an der Stelle interessant.