Python:更简洁的初始化方式
Python: Cleaner ways to initialize
或者也许我应该说,完全跳过不必初始化的方法。
我真的很讨厌每次我想做一个简单的计数变量,我不得不说,"hey python, this variable starts at 0."我希望能够说count+=1
并让它立即知道从哪里开始0 在循环的第一次迭代。也许我可以设计某种功能来适应这种情况? count(1)
将 1 添加到一个自创的内部计数变量,该变量在循环的迭代之间停留。
我同样不喜欢将 strings/lists 编辑成新的 string/list。
(在循环前初始化new_string=""/new_list=[]
)。
我认为列表理解可能适用于某些列表。
有没有人对如何解决这个问题有一些建议?我是新手,断断续续编程才半年。
如果您在 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"]
+= 也适用于字符串,因为它们本质上是很好的列表。希望这对您有所帮助!
免责声明:我认为这不会使初始化更清晰。此外,如果您在使用计数器变量时出现拼写错误,您将不会得到 NameError
,而是会默默地创建并递增第二个计数器。忆禅Python:
Explicit is better than implicit.
话虽如此,您可以创建一个特殊的 class,它将自动添加缺少的属性并使用此 class 来创建和自动初始化各种计数器:
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]
现在您可以创建该 class 的单个实例来创建任意数量的相同类型的计数器。用法示例:
>>> 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]
或者也许我应该说,完全跳过不必初始化的方法。
我真的很讨厌每次我想做一个简单的计数变量,我不得不说,"hey python, this variable starts at 0."我希望能够说count+=1
并让它立即知道从哪里开始0 在循环的第一次迭代。也许我可以设计某种功能来适应这种情况? count(1)
将 1 添加到一个自创的内部计数变量,该变量在循环的迭代之间停留。
我同样不喜欢将 strings/lists 编辑成新的 string/list。
(在循环前初始化new_string=""/new_list=[]
)。
我认为列表理解可能适用于某些列表。
有没有人对如何解决这个问题有一些建议?我是新手,断断续续编程才半年。
如果您在 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"]
+= 也适用于字符串,因为它们本质上是很好的列表。希望这对您有所帮助!
免责声明:我认为这不会使初始化更清晰。此外,如果您在使用计数器变量时出现拼写错误,您将不会得到 NameError
,而是会默默地创建并递增第二个计数器。忆禅Python:
Explicit is better than implicit.
话虽如此,您可以创建一个特殊的 class,它将自动添加缺少的属性并使用此 class 来创建和自动初始化各种计数器:
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]
现在您可以创建该 class 的单个实例来创建任意数量的相同类型的计数器。用法示例:
>>> 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]