同时声明多个变量的更优雅的方法

2024-04-26 00:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

要同时声明多个变量,我需要:

a, b = True, False

但如果我必须声明更多的变量,它就会变得越来越不优雅:

a, b, c, d, e, f, g, h, i, j = True, True, True, True, True, False, True ,True , True, True

有没有更好/优雅/方便的方法来做这个?

这必须是非常基本的,但如果我使用列表或元组来存储变量,我将如何处理,以便我会有所帮助,因为:

aList = [a,b]

无效,我必须:

a, b = True, True

或者我错过了什么?


Tags: 方法falsetrue声明列表元组我会alist
3条回答
a, b, c, d, e, g, h, i, j = (True,)*9
f = False

使用列表/字典或定义自己的类来封装您定义的内容,但如果您需要所有这些变量,则可以执行以下操作:

a = b = c = d = e = g = h = i = j = True
f = False

正如其他人所建议的,使用10个不同的带有布尔值的局部变量不太可能是编写例程的最佳方法(特别是如果它们真的只有一个字母名:)

根据你正在做的事情,用字典代替可能是有意义的。例如,如果要为一组单字母标志设置布尔预设值,可以执行以下操作:

>>> flags = dict.fromkeys(["a", "b", "c"], True)
>>> flags.update(dict.fromkeys(["d", "e"], False))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

如果愿意,也可以使用单个赋值语句:

>>> flags = dict(dict.fromkeys(["a", "b", "c"], True),
...              **dict.fromkeys(["d", "e"], False))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

dict的第二个参数并不是完全为此而设计的:它实际上是为了允许您使用诸如d=False之类的关键字参数重写字典中的各个元素。上面的代码将**后面的表达式的结果放大成一组keyword arguments,并传递给被调用函数。这无疑是一种可靠的词典编纂方法,人们似乎至少接受了这个习语,但我怀疑有些人可能认为它不符合语法。</disclaimer>


还有一种方法,如果您经常使用这种模式,那么最直观的方法可能是将数据定义为映射到标志名(单个字符串)的标志值列表(TrueFalse)。然后将此数据定义转换为一个反向字典,该字典将标志名称映射到标志值。这可以通过嵌套列表理解非常简洁地完成,但这里有一个非常可读的实现:

>>> def invert_dict(inverted_dict):
...     elements = inverted_dict.iteritems()
...     for flag_value, flag_names in elements:
...         for flag_name in flag_names:
...             yield flag_name, flag_value
... 
>>> flags = {True: ["a", "b", "c"], False: ["d", "e"]}
>>> flags = dict(invert_dict(flags))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

函数invert_dict是一个generator function。它生成,或者生成-这意味着它重复返回键值对的值。这些键值对是初始flags字典的两个元素内容的倒数。它们被输入到dict构造函数中。在本例中,dict构造函数的工作方式与上面的不同,因为它的参数是iterator,而不是字典。


借鉴@Chris Lutz的评论:如果您真的要将此用于单字符值,那么实际上可以

>>> flags = {True: 'abc', False: 'de'}
>>> flags = dict(invert_dict(flags))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

这是因为Python字符串是iterable,这意味着它们可以逐值移动。对于字符串,值是字符串中的单个字符。因此,当它们被解释为iterable时,比如在for循环中使用它们时,['a', 'b', 'c']'abc'实际上是等价的。另一个例子是当它们被传递给一个带iterable的函数时,比如^{}

我个人不会这么做,因为它没有直观地阅读:当我看到一个字符串时,我希望它被用作一个值而不是一个列表。所以我看了第一行,然后想“好吧,有一面真旗和一面假旗。”所以虽然这是一种可能性,但我不认为这是可行的。从好的方面来说,它可能有助于更清楚地解释iterable和迭代器的概念。


定义函数invert_dict以便它实际返回字典也不是一个坏主意;我之所以没有这样做,主要是因为它没有真正帮助解释例程的工作方式。


显然,Python2.7有字典理解,这将使实现该函数的方法非常简洁。这是留给读者的练习,因为我没有安装Python2.7:)

您还可以组合来自永远通用的itertools模块的一些函数。正如他们所说,There's More Than One Way To Do It。等等,Python人不会这么说的。好吧,在某些情况下这是真的。我猜圭多已经给了我们字典上的理解,以便有One Obvious Way这样做。

相关问题 更多 >