python代码理解

时间:2011-10-23 12:19:07

标签: python

我有以下代码

def compare_and_swap(x, a, b):
    if x[a] > x[b]:
        x[a], x[b] = x[b], x[a]

def oddeven_merge(x, lo, hi, r):
    step = r * 2
    if step < hi - lo:
        oddeven_merge(x, lo, hi, step)
        oddeven_merge(x, lo + r, hi, step)
        for i in range(lo + r, hi - r, step):
            compare_and_swap(x, i, i + r)
    else:
        compare_and_swap(x, lo, lo + r)

def oddeven_merge_sort_range(x, lo, hi):
    """ sort the part of x with indices between lo and hi.

    Note: endpoints (lo and hi) are included.
    """
    if (hi - lo) >= 1:
        # if there is more than one element, split the input
        # down the middle and first sort the first and second
        # half, followed by merging them.
        mid = lo + ((hi - lo) / 2)
        oddeven_merge_sort_range(x, lo, mid)
        oddeven_merge_sort_range(x, mid + 1, hi)
        oddeven_merge(x, lo, hi, 1)

def oddeven_merge_sort(x):
    oddeven_merge_sort_range(x, 0, len(x)-1)

>>> data = [4, 3, 5, 6, 1, 7, 8]
>>> oddeven_merge_sort(data)
>>> data
[1, 2, 3, 4, 5, 6, 7, 8]

对我来说一切都很清楚,但只有这条线不能理解

 for i in range(lo + r, hi - r, step):

如何使用伪代码或其他语言(例如C ++)读取它?

5 个答案:

答案 0 :(得分:3)

这相当于

for(int i=lo+r;i<(hi-r);i+=step)

in C(或C ++,Java,C#等)

(注意:这仅在step为正时才有效。如果步骤为负 - 即lo + r&gt; hi-r,则需要将支票更改为i>(hi-r)

它的作用是在lo+r开始计数器,将其移至step个单位,直到计数器等于或超过hi-r

答案 1 :(得分:1)

for i in range(lo + r, hi - r, step):

是一个 for循环,我从lo+rhi-r 不包含,步骤为step。这是一个例子:

>>> for i in range(10, 31, 3):
...     print i
...     
10
13
16
19
22
25
28

请注意,在range(start, end, step)中,可以以任何方式排序开始和结束值步骤可以是正数或负数。这使得编写C版本有点麻烦。

因此,一旦你知道 Python for i in range(lo + r, hi - r, step 就是伪代码:事实上,

  • 它可以说比在三个不同的行上进行计数器初始化,测试和增量的while循环更简洁和清晰;
  • 很好地处理了Python所涵盖的所有案例(开始和结束的顺序,以及步骤的标志)。

答案 2 :(得分:1)

  

如何使用伪代码阅读?

Python非常接近伪代码。

for i in range(lo + r, hi - r, step):

表示它所说的内容:使用指定i中的每个range值执行以下代码。前两个值是范围的下限和上限,step是要使用的值之间的距离。有关更多信息,请在Python解释器提示符处尝试help(range)

答案 3 :(得分:0)

lo + r(包括)到hi -r(不包含)的循环,以step为增量。

假设步骤是肯定的,在类C语言中它可以写成:

 for (i = lo + r; i < hi - r; i += step) { ... } 

用Python编写它的另一种方法:

 i = lo + r
 while i < hi - r:
      # loop body
      i += step

如果步骤为否定,则上述代码中的<变为>

答案 4 :(得分:0)

您可以将其读作以下伪代码(正面步骤):

i = lo + r
while i < hi - r:
    # body of loop
    i = i + step

对于否定步骤:

i = lo + r
while i > hi - r:
    # body of loop
    i = i + step

换句话说,它从第一个值迭代i变量,直到达到或传递第二个值,每次通过循环调整第三个值。