2015-06-10 113 views
1

或者我應該說,根本不需要初始化的方法。Python:更清潔的方式初始化

我真的很討厭每次我想做一個簡單的count變量,我不得不說,「嘿python,這個變量從0開始。」我希望能夠說count+=1並立即知道在循環的第一次迭代中從0開始。也許我可以設計一些功能來適應這種情況? count(1),它給循環迭代之間的自創內部計數變量加1。

我有同樣的不喜歡編輯字符串/列表到一個新的字符串/列表。

(在循環之前初始化new_string=""/new_list=[])。

我認爲列表解析可能適用於某些列表。

有沒有人有一些指導如何解決這個問題?我相當新,我只開了半年的節目。

+2

所以,應該把它初始化爲'float'或'int'?或者'複雜',也許?如果你想數不止一件事情呢?你會如何重置比匿名,自我創建的計數器變量?這似乎是非常不切實際的。只需以正常的方式初始化它。 –

回答

2

聲明:我不認爲這會使初始化更清潔。此外,如果您在計數器變量的某些用法中存在拼寫錯誤,則不會得到NameError,而是會默默創建並增加第二個計數器。請記住Python的禪:

顯式比隱式更好。

說了這麼多,你可以創建一個特殊的類,它會自動添加缺少的屬性和使用這個類來創建和自動初始化各種計數器:

class Counter: 

    def __init__(self, default_func=int): 
     self.default = default_func 

    def __getattr__(self, name): 
     if name not in self.__dict__: 
      self.__dict__[name] = self.default() 
     return self.__dict__[name] 

現在你可以創建一個單一的該類的實例可創建任意數量的相同類型的計數器。用法示例:

>>> c = Counter() 
>>> c.foo 
0 
>>> c.bar += 1 
>>> c.bar += 2 
>>> c.bar 
3 
>>> l = Counter(list) 
>>> l.blub += [1,2,3] 
>>> l.blub 
[1, 2, 3] 

其實,這是類似於collections.defaultdict做,除了你可以使用點符號訪問計數器的,亦即c.foo代替c['foo']。試想想起來了,你甚至可以擴展defaultdict,使整個事情更加簡單:

class Counter(collections.defaultdict): 

    def __getattr__(self, name): 
     return self[name] 
+0

加上一個提到'defaultdict'。 –

+0

我接受了這個,因爲它更靈活。謝謝。 – jh44tx

2

如果您使用的是計數器在for循環中,你可以使用枚舉:

for counter, list_index in enumerate(list): 

計數器語句中的第一變量和1被添加到它每循環迭代中,下一個變量是該列表中該迭代的值。我希望這回答了你的第一個問題,關於你的第二,下面的代碼可能會幫助

list_a = ["this", "is"] 
list_b = ["a", "test"] 
list_a += list_b 
print(list_a) 
["this", "is", "a", "test"] 

的+ =字符串作品,以及因爲它們基本上列出AW好。希望這可以幫助!

+0

我喜歡這個,我會記住它的未來。 – jh44tx