|
ist ein bitwise, logical or:
>>> 0 | 1
1
>>> 1 | 1
1
Reduzieren der Anrufe lambda
mit der aktuellen laufenden Summe und dem nächsten (integer) Wert der Ausgabe der map()
Funktion. Also, es tut dem folgend in einer Schleife:
sum = 0
for chunk in map(int, ip.split(".")):
sum = (sum << 8) | chunk
wo map(int, ip.split("."))
die IP-Adresse in eine Folge von ganzen Zahlen gedreht; 1.2.3.4
wird [1, 2, 3, 4]
.
Die <<
ist ein bitwise left shift, durch 8 Bits in diesem Fall:
>>> 1 << 8
256
für jedes ganzzahlige Teil einer IP-Adresse, so, ist es, den Wert nach links verschiebt um 8 Positionen, und fügt die Bits des nächsten Teils der Adresse auf diese Nummer.
Dies ist vollkommen sinnvoll, da eine IP-Adresse nichts anderes als eine 32-Bit-Nummer ist, und die Zeichenfolgennotation teilt diese Nummer in 4 Teile von 8 Bits auf und 'druckt' den ganzzahligen Wert jedes dieser 8 Bits mit einem .
Zeichen dazwischen.
Es hilft jede Stufe als binäre Zahl zu drucken:
>>> map(int, '1.2.3.4'.split('.'))
[1, 2, 3, 4]
>>> bin(1)
'0b1'
>>> bin(2)
'0b10'
>>> bin(3)
'0b11'
>>> bin(4)
'0b100'
>>> bin(1 << 8)
'0b100000000'
>>> bin(1 << 8 | 2)
'0b100000010'
>>> bin((1 << 8 | 2) << 8)
'0b10000001000000000'
>>> bin((1 << 8 | 2) << 8 | 3)
'0b10000001000000011'
>>> bin(((1 << 8 | 2) << 8 | 3) << 8)
'0b1000000100000001100000000'
>>> bin(((1 << 8 | 2) << 8 | 3) << 8 | 4)
'0b1000000100000001100000100'
Als Randnotiz enthält python diese Art von Batterien: 'struct.unpack (, socket.inet_aton (ip 'I')) [ 0] ' – georg
Ich frage mich, was der Leistungsunterschied ist? – Keith