2015-06-10 85 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