python代码理解

2024-09-29 06:28:59 发布

您现在位置: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++?你知道吗


Tags: andthelodataifdefsteprange
3条回答

线路

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

是一个for循环,i从lo+r运行到hi-r,不包括,步骤为step。举个例子:

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

注意,在range(start, end, step)中,起始值和结束值可以以任何方式排序,步长可以是正的或负的。这使得编写C版本有点麻烦。你知道吗

因此,一旦你知道Python是伪代码,实际上

  • 它可以说比在三条不同的线路上带有计数器初始化、测试和增量的while循环更简洁易读
  • 它可以很好地处理Python所涵盖的所有情况(开始和结束的顺序以及步骤的符号)。你知道吗

这相当于

for(int i=lo+r;i<(hi-r);i+=step)
<>(C或C++,爪哇,C等)

(注意:这只在step为正时有效。如果步骤为负-即lo+r>;hi-r,则需要将检查更改为i>(hi-r)

它所做的是在lo+r处启动一个计数器,将它移动step个单位,直到计数器等于或超过hi-r。你知道吗

How can I read it using pseudo code?

Python非常接近于伪代码。你知道吗

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

意思就是它所说的:用指定的range中的每个值i执行以下代码。前两个值是范围的上下限,step是要使用的值之间的距离。有关详细信息,请在Python解释器提示符处尝试help(range)。你知道吗

相关问题 更多 >