Python:更清晰的初始化方法

时间:2015-06-10 20:20:58

标签: python-2.7 initialization

或许我应该说,跳过必须初始化的方法。

我真的很讨厌每次我想做一个简单的计数变量时,我不得不说,“嘿python,这个变量从0开始。”我希望能够说出count+=1并让它立即知道在循环的第一次迭代中从0开始。也许我可以设计某种功能来容纳这个? count(1)将自我创建的内部计数变量加1,该变量在循环的迭代之间徘徊。

我同样不喜欢将字符串/列表编辑成新的字符串/列表。

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

我认为列表推导可能适用于某些列表。

有没有人对如何解决这个问题有一些指示?我很新,我只是编程了半年。

2 个答案:

答案 0 :(得分: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"]

+ =也适用于字符串,因为它们本质上是列表。希望这有帮助!

答案 1 :(得分: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]