其他的数字类型——Sets——在Python 3系列和2.7中的set字面量

未匹配的标注

如果你认为set 很“酷”,它们最终明显变得更酷了,因为它们有了set 字面量comprehensions的新语法,一开始只被增添在Python 3系列中,但应广大用户的需求逆向移植到Python 2.7中。在这些Python中,仍可以使用内置的set函数来创建set对象,但还可以用一个新的set字面量形式(使用之前为字典保留的花括号)。在3系列和2.7中,下面代码是等价的:

set([1, 2, 3, 4]) # 内置函数调用(所有版本)
{1, 2, 3, 4} # 新的set字面量(2.7,3.X)

考虑到set本质上像无值字典,这个语法是合理的——因为set的项是无序的,唯一的且不可变的,这些项表现得很像字典的键。考虑到在3系列中的字典键列表是视图对象(它支持类set的行为如交集和并集,参见第8章获取关于字典视图对象的更多信息),这个操作上的相似性甚至更加引入注目。

不管set是如何创建的,3系列使用新的字面量格式来显示。Python 2.7 接受新的字面量格式,但仍使用之前章节中的2.6显示形式来显示set。在所有版本的Python中,set内置函数仍然需要用来创建空set和从现存可迭代对象中构建set(除了使用本章稍后会讨论的 set comprehensions),但新字面量很方便用来初始化已知结构的set。

下面是3系列中set看起来像什么样子;在2.7是一样的,除了是用2系列的 set([...])表示法来显示set结果,而且项的顺序可能依版本而异(不管怎样,根据定义这无关紧要):

C:\code> c:\python33\python
>>> set([1, 2, 3, 4]) # 内置函数: 同 2.6 中一样
{1, 2, 3, 4}
>>> set('spam') # 添加可迭代对象中的所有项
{'s', 'a', 'p', 'm'}
>>> {1, 2, 3, 4} # set字面量:在 3.X (和 2.7)中的新东西
{1, 2, 3, 4}
>>> S = {'s', 'p', 'a', 'm'}
>>> S
{'s', 'a', 'p', 'm'}
>>> S.add('alot') # 方法像之前那样工作
>>> S
{'s', 'a', 'p', 'alot', 'm'}

所有在之前章节中讨论过的set处理操作在3.X中工作起来是一样的,但结果的set打印出来是不同的:

>>> S1 = {1, 2, 3, 4}
>>> S1 & {1, 3} # 交集
{1, 3}
>>> {1, 5, 3, 6} | S1 # 并集
{1, 2, 3, 4, 5, 6}
>>> S1 - {1, 3, 4} # 差集
{2}
>>> S1 > {1, 3} # 超集
True

注意在所有的Python版本中, {} 仍是一个字典。空set必须使用set内置函数来创建,并且以同样的方式打印出来:

>>> S1 - {1, 2, 3, 4} # 空set打印出来是不同的
set()
>>> type({}) # 因为 {} 是空字典
<class 'dict'>
>>> S = set() # 初始化空set
>>> S.add(1.23)
>>> S
{1.23}

如同Python2.6和之前的版本,用3.X/2.7的字面量创建的set支持同样的set对象方法,其中一些方法允许通用的可迭代操作对象而表达式不允许:

>>> {1, 2, 3} | {3, 4}
{1, 2, 3, 4}
>>> {1, 2, 3} | [3, 4]
TypeError: unsupported operand type(s) for |: 'set' and 'list'
>>> {1, 2, 3}.union([3, 4])
{1, 2, 3, 4}
>>> {1, 2, 3}.union({3, 4})
{1, 2, 3, 4}
>>> {1, 2, 3}.union(set([3, 4]))
{1, 2, 3, 4}
>>> {1, 2, 3}.intersection((1, 3, 5))
{1, 3}
>>> {1,2,3} & (1,3,5)
TypeError: unsupported operand type(s) for &: 'set' and 'tuple'
>>> {1, 2, 3}.issubset(range(-5, 5))
True
>>> {1,2,3} < range(-5,5)
TypeError: '<' not supported between instances of 'set' and 'range'

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~