其他的数字类型——Sets——在Python 3.X和2.7中的set comprehensions
除了字面量,Python 3 系列增加了 set comprehension 的结构,它也被逆向移植到了 2.7 中。就像 3 系列的 set 字面量,2.7 也接受了这个语法,但以 2 系列 set 表示法来显示结果。set comprehension 表达式类似于之前在第 4 章中看到的 list comprehension,但它是在花括号而非方括号中编码的且运行来创建 set 而非列表。set comprehension 运行循环并收集每次循环的表达式的结果;循环变量可以访问用于结合表达式中的当前迭代值。结果是运行代码所创建的新的 set,带有所有普通的 set 行为。下面是 3.3 中的 set comprehension(再说一次,结果显示和排序和 2.7 中不同):
>>> {x ** 2 for x in [1, 2, 3, 4]} # 3.X/2.7 set comprehension
{16, 1, 4, 9}
在这个表达式中,循环编码写在右边,集合表达式编码在左边(x ** 2)。如同列表 comprehension,得到的几乎就是表达式所说的:“根据列表中的每一个 X,给出一个新的包含 X 的平方的 set。” Comprehensions 还可以在其他类型的对象上迭代,如字符串(下面第一个例子就显示了以基于 comprehension 的方式来从一个现成的可迭代对象创建 set):
>>> {x for x in 'spam'} # 和: set('spam') 一样
{'m', 's', 'p', 'a'}
>>> {c * 4 for c in 'spam'} # 汇集表达式结果的set
{'pppp', 'aaaa', 'ssss', 'mmmm'}
>>> {c * 4 for c in 'spamham'}
{'pppp', 'aaaa', 'hhhh', 'ssss', 'mmmm'}
>>> S = {c * 4 for c in 'spam'}
>>> S | {'mmmm', 'xxxx'}
{'pppp', 'xxxx', 'mmmm', 'aaaa', 'ssss'}
>>> S & {'mmmm', 'xxxx'}
{'mmmm'}
因为剩余的 comprehension 故事依赖于还未准备好处理的潜在概念,进一步细节将被推迟到本书稍后部分。在第 8 章中,将在 3.X 和 2.7 中见到第一个类似的对象(字典 comprehension),然后对所有 comprehensions,还有许多要讲述 —— 列表,set,字典和构造器 —— 稍后,特别是在第 14 章和第 20 章。在那里将知道:所有的 comprehension 支持未在这里展示的语法,包括嵌套循环和 if
测试,在有机会学习更大的语句前,理解这些语法是有挑战性的。
推荐文章: