0

考虑以下函数:

def fun(lst):
    for item in lst:
        cmp = 0
        for other in lst:
            if item < other: 
                cmp -= 1
            elif item > other:
                cmp += 1
         if not cmp:
            return item



nums = [1,3,2,2]
print("fun({0}) = {1}".format(nums,fun(nums)))

我知道这段代码的输出是:

乐趣([1, 3, 2, 2])= 2

但我不知道为什么。有人可以解释为什么这是输出吗?

有没有人有任何关于如何更容易解释代码块的提示......

因为我在考试中显然无法访问 python,而且我正在努力弄清楚一些代码块的实际作用。

谢谢你。

4

3 回答 3

1

首先,您的代码中有错误的对齐方式(“if not cmp:”应该在左边一个位置,最后两行应该与第一行在同一列),如下所示:

def fun(lst):
    for item in lst:
        cmp = 0
        for other in lst:
            if item < other: 
                cmp -= 1
            elif item > other:
                cmp += 1
        if not cmp:
            return item

nums = [1,3,2,2]
print("fun({0}) = {1}".format(nums,fun(nums)))

fun 函数返回第一个数组的项,即“不是 cmp”,即 cmp != 0。 cmp 是小于给定项的数组元素数减去大于该项的数组元素数

  if item < other:
    cmp -= 1
  elif item > other:
    cmp += 1

现在,让我们看看数组项 [1, 3, 2, 2]

1:比self多3项(3,2,2)且不小于self,所以cmp = 0 - 3 = -3,不返回

3:有 3 个项目没有比 self 少的项目和三个 (3, 2, 2) 比 self 多的项目,所以 cmp = 3 - 0 = 3,不返回

2:比self多一项(3)少一项(1),cmp = 0,函数返回它(2)

于 2013-06-24T05:25:32.270 回答
1
def fun(lst):
    for item in lst:
        cmp = 0
        for other in lst:
            if item < other: 
                cmp -= 1
            elif item > other:
                cmp += 1
         if not cmp:
            return item

nums = [1, 3, 2, 2]

您的代码有一个嵌套循环,一个 for 循环内的 for 循环。

外部for循环是for item in lst,内部for循环是:for other in lst:

循环看起来像这样:

1(outer) - > 1, 3, 2, 2   # 1,3,2,2 are assigned one by one to `other`
3(outer) - > 1, 3, 2, 2
2(outer) - > 1, 3, 2, 2
2(outer) - > 1, 3, 2, 2

它首先从外部循环开始,分配给 item 的值为1,并cmp设置为0。现在它遍历内部循环内的整个列表。

分配给 other 的第一个值是1。现在它检查它是否大于或小于item(在这种情况下为 1)并根据它增加或减少 的值cmp。在下一次迭代中, other 现在被赋值3,它再次与 item( 1) 进行比较,并据此更改 的值cmp。同样,它移动到接下来的两项22

现在出现了这种情况:

if not cmp: return item

它检查 的值是否cmp为假,如果cmp为 0(0 为假值),则返回项目并且函数终止。(not 0Truepython中)

如果条件为假,则它移回外循环,并且这次item被赋值3,然后内循环继续如上所述,除了itemnow的事实3

内部循环实际上做的是它实际上比较有多少项大于或小于当前项。

1(outer) - > 1, 3, 2, 2   # cmp is -3, because 3,2,2 are bigger than 1
3(outer) - > 1, 3, 2, 2   # cmp is 3, because 1,2,2 are smaller than 3

2(outer) - > 1, 3, 2, 2   # cmp is 0, because 3 is greater than 2 and 1 is smaller
                          # than 2, so the condition `if cmp` is True for this case
                          # and the function  return 2 (i,e. item)

2(outer) - > 1, 3, 2, 2   # this is never reached as function already returned

如果所有循环都结束并且cmp永远不会变成 0,那么您的函数将返回 None(函数的默认返回值)。

于 2013-06-24T05:41:46.700 回答
1

有没有人有任何关于如何更容易解释代码块的提示......

把它写出来。在页面上为每个名称提供自己的空间,并在运行代码时跟踪值的更改。经过一些练习,您将能够轻松地跟踪简单的值,只需要写出非标量值。

于 2013-06-24T05:10:13.683 回答