if/then kürzen

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
Cannon
User
Beiträge: 4
Registriert: Freitag 8. Mai 2020, 09:40

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)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du's ausprobiert? Macht es was du willst? Dann geht es.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

@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
Cannon
User
Beiträge: 4
Registriert: Freitag 8. Mai 2020, 09:40

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 ?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@Cannon: deshalb auch die Frage, wo Du cresult benutzt. Wenn das nur in einem if passiert, ist das egal.
Cannon
User
Beiträge: 4
Registriert: Freitag 8. Mai 2020, 09:40

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.
Cannon
User
Beiträge: 4
Registriert: Freitag 8. Mai 2020, 09:40

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?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten