数据类型
Sage中的每一个对象都有良好定义的类型。Python有广泛的基本内置类型,Sage库又添加了很多。Python内置的类型包括字符串,列表,元组,整数和实数等,如下:
sage: s = "sage"; type(s)
<... 'str'>
sage: s = 'sage'; type(s) # 单引号和双引号都可以使用
<... 'str'>
sage: s =[1,2,3,4]; type(s)
<... 'list'>
sage: s = (1,2,3,4); type(s)
<... 'tuple'>
sage: s = int(2006); type(s)
<... 'int'>
sage: s = float(2006); type(s)
<... 'float'>
Sage增加了很多其他类型,如,向量空间:
sage: V = VectorSpace(QQ, 1000000); V
Vector space of dimension 1000000 over Rational Field
sage: type(V)
<class 'sage.modules.free_module.FreeModule_ambient_field_with_category'>
只有特定的函数才能在作用在V
上。其他数学软件中, 可能会用”函数”形式foo(V,...)
。 在Sage中,特定的函数附加于V
的类型(或类)上,并使用类似Java或C++的面向对象的语法,即,V.foo(...)
。这可以使全局的命名空间保持整洁,而不被成千上万的函数搞乱。而且不同作用的函数都可以叫foo,还不用做参数的类型检查(或case语句)来决定要调用哪一个。如果你重用了一个函数的名字,那个函数还是可用的(如,你把什么东西命名为zeta
, 然后又想计算0.5的Riemann-Zeta函数值,你还是可以输入s=.5; s.zeta()
)。
sage: zeta = -1
sage: s=.5; s.zeta()
-1.46035450880959
通常情况下,常用的函数调用方式也是支持的,这样要方便些,而且数学表达式用面向对象的方式调用看着更不习惯。这有几个例子。
sage: n = 2; n.sqrt()
sqrt(2)
sage: sqrt(2)
sqrt(2)
sage: V = VectorSpace(QQ,2)
sage: V.basis()
[
(1, 0),
(0, 1)
]
sage: basis(V)
[
(1, 0),
(0, 1)
]
sage: M = MatrixSpace(GF(7), 2); M
Full MatrixSpace of 2 by 2 dense matrices over Finite Field of size 7
sage: A = M([1,2,3,4]); A
[1 2]
[3 4]
sage: A.charpoly('x')
x^2 + 2*x + 5
sage: charpoly(A, 'x')
x^2 + 2*x + 5
要列出$A$的所有成员函数,可以使用tab补全功能。先输入A.
, 再按[tab]
,
正如反向查找和Tab补全中介绍的。