3 回答

TA貢獻1884條經驗 獲得超4個贊
首先,您的代碼有錯誤的對齊方式(“ 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函數返回第一個數組的項,以使“ not cmp”,即cmp!=0。cmp是小于給定項的數組元素數減去大于項的數組元素數
if item < other:
cmp -= 1
elif item > other:
cmp += 1
現在,讓我們看一下數組項[1、3、2、2]
1:比self(3,2,2)多3個項目,且不小于self,因此cmp = 0-3 = -3,不返回
3:有3個項目,沒有比自己少的項目,有3個(3、2、2)多于自己,因此cmp = 3-0 = 3,不返回
2:比self(3)多一件商品,而比(1)小一件商品,cmp = 0,函數將其返回(2)

TA貢獻1815條經驗 獲得超10個贊
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?,F在,在內部循環中遍歷整個列表。
分配給other的第一個值是1?,F在,它檢查它是否大于或小于item(在這種情況下為1),并cmp基于此值增加或減少。在下一次迭代中,現在分配了other 3,再次將其與item(1)比較,并cmp根據該值更改了值。同樣,它移至下兩個項目2,2。
現在出現這種情況:
if not cmp: return item
它檢查的值是否cmp為falsey,如果cmp為0(0為falsey值),則返回該項目,函數終止。(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(函數的默認返回值)。

TA貢獻1821條經驗 獲得超5個贊
是否有人對如何簡化代碼塊的解釋有任何提示?
把它寫出來。在頁面中為每個名稱分配自己的空間,并在運行代碼時跟蹤對值的更改。經過一些練習,您將能夠輕松跟蹤簡單值,只需要寫出非標量值即可。
添加回答
舉報