Alcune condizioni valutano in modo diverso poi attesi in Python

voti
-1

Attualmente creando un pezzo che assume valori un dato valore in un array e aggiunge 32

Il mio IDE (PyCharm) ha raccomandato che tolgo una ridondanza nel mio codice facendo quanto segue

if ascii_key[i] >= 65 and ascii_key[i] <= 90:
    ascii_key[i] = ascii_key[i] + 32

per

if 65 <= ascii_key[i] <= 90:
    ascii_key[i] = ascii_key[i] + 32

Entrambe le soluzioni funzionano per me, ma io sono curioso di sapere il motivo per cui questa disposizione di condizioni pause

if ascii_key[i] <= 65 >= 90:
    ascii_key[i] = ascii_key[i] + 32

Apprezzerei una spiegazione pseudo-codice se conveniente, io sono ancora un po 'alle prime armi

È pubblicato 13/02/2020 alle 23:55
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

Nel terzo codice fornito da voi.

ascii_key[i] <= 65 >= 90questo è sempre valutata a False.

ascii_key[i] <= 65 >= 90viene valutata come ascii_key[i] <= 65 and 65 >= 90. 65>=90è False.

La valutazione Byte-codice a<b<c.

In [17]: dis.dis('a<b<c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               0 (<)
             10 JUMP_IF_FALSE_OR_POP    18
             12 LOAD_NAME                2 (c)
             14 COMPARE_OP               0 (<)
             16 RETURN_VALUE
        >>   18 ROT_TWO
             20 POP_TOP
             22 RETURN_VALUE

La valutazione Byte-codice a<b and b<c.

In [18]: dis.dis('a<b and b<c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 COMPARE_OP               0 (<)
              6 JUMP_IF_FALSE_OR_POP    14
              8 LOAD_NAME                1 (b)
             10 LOAD_NAME                2 (c)
             12 COMPARE_OP               0 (<)
        >>   14 RETURN_VALUE

È possibile osservare osservare a<b<cè equivalente a a<b and b<c.

Risposto il 14/02/2020 a 00:00
fonte dall'utente

voti
0

ciò è dovuto al modo in cui si risolvono le condizioni. if ascii_key[i] >= 65 and ascii_key[i] <= 90e if 65 <= ascii_key[i] <= 90sono equivalenti. Mentre if ascii_key[i] <= 65 >= 90viene risolto a questo: if ascii_key[i] <= 65 and 65 >= 90 65> = 90 non è mai vero.

In primo luogo la condizione 65 <= ascii_key[i]e poi l'altra condizione ascii_key[i] <= 90sono valutati e incatenati con un AND.

Saluti

Risposto il 14/02/2020 a 00:08
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more