列表,元素和序列
列表类型保存任意类型的元素。和C,C++等一样(但是和多数标准的计算机代数系统不一样),列表中的元素下标从0开始计数。
sage: v =[2, 3, 5, 'x', SymmetricGroup(3)]; v[2, 3, 5, 'x', Symmetric group of order 3! as a permutation group]sage: type(v)<... 'list'>sage: v[0]2sage: v[2]5
(索引一个列表时,如果下标不是Python整数类型也是可以的!)Sage整数(或有理数,或其他有__index__方法的对象)都可以正常索引。
sage: v =[1,2,3]sage: v[2]3sage: n = 2 #SageIntegersage: v[n] # Perfectly OK!3sage: v[int(n)] # Also OK.3
range函数新建一个Python整数(不是Sage整数)的列表:
sage: range(1, 15) # py2[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
使用包含列表(list comprehension)的方式构造列表是非常有用的:
sage: L =[factor(n) for n in range(1, 15)]sage: L[1, 2, 3, 2^2, 5, 2 * 3, 7, 2^3, 3^2, 2 * 5, 11, 2^2 * 3, 13, 2 * 7]sage: L[12]13sage: type(L[12])<class 'sage.structure.factorization_integer.IntegerFactorization'>sage:[factor(n) for n in range(1, 15) if is_odd(n)][1, 3, 5, 7, 3^2, 11, 13]
更多关于如何使用包含列表创建列表的内容,请参见PyT.
列表切片(list slicing)是一个有趣的功能。若L是一个列表, 那么L[m:n]返回L的一个子列表,从第$m$个元素开始到第$n-1$个元素,象下面这样。
sage: L =[factor(n) for n in range(1, 20)]sage: L[4:9][5, 2 * 3, 7, 2^3, 3^2]sage: print L[:4][1, 2, 3, 2^2]sage: L[14:4][]sage: L[14:][3 * 5, 2^4, 17, 2 * 3^2, 19]
元组(tuple)与列表类似,除了它们是固定的,也就是说,一旦它们被建立,就不能再被修改。
sage: v = (1,2,3,4); v(1, 2, 3, 4)sage: type(v)<... 'tuple'>sage: v[1]= 5Traceback (most recent call last):...TypeError: 'tuple' object does not support item assignment
序列(sequence)是第三种面向列表的Sage类型。与列表和元组不同,序列不是Python内置的类型。序列默认是可修改的,但是可以使用Sequence类中的set_immutable方法设置成不能修改的,如下例所示。一个序列中的所有元素都有共同的祖先(parent), 称为序列的领域(sequences universe)。
sage: v = Sequence([1,2,3,4/5])sage: v[1, 2, 3, 4/5]sage: type(v)<class 'sage.structure.sequence.Sequence_generic'>sage: type(v[1])<type 'sage.rings.rational.Rational'>sage: v.universe()Rational Fieldsage: v.is_immutable()Falsesage: v.set_immutable()sage: v[0]= 3Traceback (most recent call last):...ValueError: object is immutable; please change a copy instead.
序列是从列表继承下来的,可用于任何列表可用的地方:
sage: v = Sequence([1,2,3,4/5])sage: isinstance(v, list)Truesage: list(v)[1, 2, 3, 4/5]sage: type(list(v))<... 'list'>
另外一个例子,向量空间的基是不可修改的序列, 因为你不能修改它们。
sage: V = QQ^3; B = V.basis(); B[(1, 0, 0),(0, 1, 0),(0, 0, 1)]sage: type(B)<class 'sage.structure.sequence.Sequence_generic'>sage: B[0]= B[1]Traceback (most recent call last):...ValueError: object is immutable; please change a copy instead.sage: B.universe()Vector space of dimension 3 over Rational Field
