問題的緣起
今天完成了LeetCode首秀(而且是用剛學不久的python做的),心情挺激動的,畢竟之前只涉獵了競賽OJ,沒有在應用型平臺上刷過題,不妨定一個小目標,今年拿到力扣全家桶!!!
今天的每日一題對python非常友好,有關陣列索引查找,原題如下:
給定一個整數型別的陣列 nums,請撰寫一個能夠回傳陣列 “中心索引” 的方法,
我們是這樣定義陣列 中心索引 的:陣列中心索引的左側所有元素相加的和等于右側所有元素相加的和,
如果陣列不存在中心索引,那么我們應該回傳 -1,如果陣列有多個中心索引,那么我們應該回傳最靠近左邊的那一個,
輸入:
nums = [1, 7, 3, 6, 5, 6]
輸出:3
解釋:
索引 3 (值為6) 的左側數之和 (1 + 7 + 3 = 11),與右側數之和 (5 + 6 = 11) 相等,
同時, 3 也是第一個符合要求的中心索引,
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-pivot-index
附上我(蒟蒻)的代碼:
值得注意的一點是,需要特判首尾的情況,因為單邊沒有元素記其和為零
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
self.before = 0
self.after = sum(nums[1:])
self.flag = 0
if len(nums) == 0:
self.flag = 0
elif self.before == self.after:
self.flag = 1
self.ans = 0
else:
for i in range(len(nums)-1):
self.before += nums[i]
self.after -= nums[i+1]
if self.before == self.after:
self.ans = i+1
self.flag = 1
break
if self.flag == 0:
return -1
else:
return self.ans
然而碼完后我發現了一個問題:代碼中出現了太多的self以至于看上去非常不美觀,而且在評論區中我發現了不加self的寫法
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
a=sum(nums[:0])
b=sum(nums[1:])
for i in range(0,len(nums)-1):
if a==b:
return i
a+=nums[i]
b-=nums[i+1]
if a==b:
return len(nums)-1
return -1
暫且不論對錯,self存在的必要性確實值得懷疑
問題的解決
解決這個問題,首先需要明白self存在的意義,
self代表的是實體物件,因此帶有self前綴的屬性都是實體屬性,換言之,在類中出現的所有的帶有前綴self的屬性都在描述實體物件的特征,同一個帶有self的屬性在實體物件面前完全等價,用一個不太恰當的比喻,事實上就相當于類中實體物件的一種“全域變數”
那么如果去掉self呢?
此時的屬性就只能在類的某個方法中被呼叫,也就如同“區域變數”一樣
下面再回到問題本身,顯然,self存在與否確實不重要,因為Solution類下只有一個方法成員——pivotIndex,也根本不會出現類中不同方法下屬性相互呼叫的情景
舉幾個栗子:上面的代碼片中a,b只能在方法pivotIndex中使用,既不能從其他方法中呼叫,也不能在類外呼叫
class test:
def __init__(self):
a = 1
self.a = 1
def c(self):
print(a) # EEROR:不能由其他方法呼叫
print(self.a)
kk = test()
kk.c()
print(test.a) # ERROR:不能在類外由類呼叫
print(kk.a) # ERROR:不能在類外由實體呼叫
(我們這里把“變數”與“屬性”這兩個名詞一概而論,今后如發現不妥會回來修改,此外部分參考書上指出,上面的代碼片中用“呼叫”一詞是不嚴謹的,歡迎巨佬們在評論區指出原因)
問題的反思
大一上學期學院預置了《程式設計》這門課程,主要學習了C語言的基本語法,甚至連深一點的演算法跟資料結構都沒有涉及,C語言中對于面向物件編程這一概念并不完善,例如結構體只能支持復雜的資料結構,卻不支持演算法方法,因而在python當中去理解這一概念的時候會有不小的困難,深入理解類的組成,剖析三大特性——封裝性、繼承性和多型性,才能更靈活地掌握這門語言,
(第一次寫博客,筆者水平有限,請巨佬們見諒啦)
下一篇博客預告:Python中賦值操作與深淺拷貝的秘密
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254403.html
標籤:python
上一篇:1.Yolov5學習率調整策略
