要在“相同时间”声明多个变量,我会这样做:
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
还是我想念什么?
正如其他人所建议的那样,不太可能将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
。上面的代码将表达式的结果**
分解为一组关键字参数,这些参数传递给调用的函数。当然,这是创建字典的可靠方法,人们似乎至少接受了这种习语,但我怀疑有些人可能认为它是Unpythonic。</disclaimer>
另一种方法,这是最直观的,如果你会经常使用这种模式,是定义你的数据作为标志值(列表True
,False
映射到标志名(单字符串))。然后,您可以将此数据定义转换为反向字典,该字典将标志名称映射到标志值。使用嵌套列表理解可以很简洁地完成此操作,但是这是一个非常易读的实现:
>>> 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
是一个生成器函数。它生成或产生 -意味着它反复返回 -键值对的值。这些键值对是初始flags
字典中两个元素的内容的逆。它们被送入dict
构造函数。在这种情况下,dict
构造函数的工作原理与上面的有所不同,因为构造函数被作为迭代器而不是字典作为参数。
借鉴@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字符串是可迭代的,这意味着它们可以逐值移动。对于字符串,值是字符串中的各个字符。因此,当它们被解释为可迭代时,例如在这种情况下,它们在for循环中使用,['a', 'b', 'c']
并且'abc'
等效。另一个示例是将它们传递给需要迭代的函数时,例如tuple
。
我个人不会这样做,因为它不能直观地理解:当我看到一个字符串时,我希望它可以用作单个值而不是列表。因此,我看第一行,并认为“好吧,所以有一个True标志和一个False标志。” 因此,尽管这是有可能的,但我认为这并不是要走的路。从好的方面来说,这可能有助于更清楚地解释可迭代和迭代器的概念。
定义函数invert_dict
以使其实际上返回字典也不是坏主意。我大多只是不这样做,因为它并不能真正帮助解释例程的工作原理。
显然,Python 2.7具有字典理解功能,这将为实现该功能提供一种极为简洁的方法。这留给读者练习,因为我没有安装Python 2.7 :)
您还可以结合功能广泛的itertools模块中的某些功能。正如他们所说,有不止一种方法可以做到。等等,Python人士不这么说。好吧,在某些情况下还是如此。我猜想圭多(Guido)已经给了我们字典理解能力,因此会有一种明显的方式来做到这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句