<p><code>|</code>是<a href="http://docs.python.org/2/reference/expressions.html#binary-bitwise-operations" rel="nofollow">bitwise, logical or</a>:</p>
<pre><code>>>> 0 | 1
1
>>> 1 | 1
1
</code></pre>
<p>Reduce使用当前运行的总计和<code>map()</code>函数输出的下一个(整数)值调用<code>lambda</code>。因此,它在一个循环中执行以下操作:</p>
^{pr2}$
<p>其中<code>map(int, ip.split("."))</code>将IP地址变成一个整数序列;<code>1.2.3.4</code>变成{<cd6>}。在</p>
<p><code><<</code>是一个<a href="http://docs.python.org/2/reference/expressions.html#shifting-operations" rel="nofollow">bitwise left shift</a>,在本例中为8位:</p>
<pre><code>>>> 1 << 8
256
</code></pre>
<p>因此,对于ip地址的每个整数部分,它将值向左移动8个位置,并将地址下一部分的位加到该数字上。在</p>
<p>这很有意义,因为IP地址只不过是一个32位的数字,而字符串表示法将该数字分成4个8位的块,然后“打印”这8个位中每个位的整数值,中间有一个<code>.</code>字符。在</p>
<p>它有助于将每个阶段打印为二进制数:</p>
<pre><code>>>> 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'
</code></pre>