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
。同样,它移动到接下来的两项2
,2
。
现在出现了这种情况:
if not cmp: return item
它检查 的值是否cmp
为假,如果cmp
为 0(0 为假值),则返回项目并且函数终止。(not 0
在True
python中)
如果条件为假,则它移回外循环,并且这次item
被赋值3
,然后内循环继续如上所述,除了item
now的事实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(函数的默认返回值)。