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

同时声明多个变量的更优雅的方式,第1张

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

正如其他人所建议的那样,不太可能将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
。上面的代码将表达式的结果
**
分解为一组关键字参数,这些参数传递给调用的函数。这当然是创建字典的可靠方法,而且人们似乎至少接受了这种习语,但我怀疑有人可能认为它是非Python的。
</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)已经给了我们字典理解能力,因此会有一种明显的方式来做到这一点。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5644437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存