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在Truepython中)
如果条件为假,则它移回外循环,并且这次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(函数的默认返回值)。