获取帮助 - Sage 教程

Skip to content
Back to top
View this page
Edit this page

# 获取帮助

Sage 有大量的内置文档，可以通过输入函数或常量的名称，然后加上问号来访问：

Sage

    sage: tan?
    Type:        <class 'sage.calculus.calculus.Function_tan'>
    Definition:  tan( [noargspec] )
    Docstring:

        The tangent function

        EXAMPLES:
            sage: tan(pi)
            0
            sage: tan(3.1415)
            -0.0000926535900581913
            sage: tan(3.1415/4)
            0.999953674278156
            sage: tan(pi/4)
            1
            sage: tan(1/2)
            tan(1/2)
            sage: RR(tan(1/2))
            0.546302489843790
    sage: log2?
    Type:        <class 'sage.functions.constants.Log2'>
    Definition:  log2( [noargspec] )
    Docstring:

        The natural logarithm of the real number 2.

        EXAMPLES:
            sage: log2
            log2
            sage: float(log2)
            0.69314718055994529
            sage: RR(log2)
            0.693147180559945
            sage: R = RealField(200); R
            Real Field with 200 bits of precision
            sage: R(log2)
            0.69314718055994530941723212145817656807550013436025525412068
            sage: l = (1-log2)/(1+log2); l
            (1 - log(2))/(log(2) + 1)
            sage: R(l)
            0.18123221829928249948761381864650311423330609774776013488056
            sage: maxima(log2)
            log(2)
            sage: maxima(log2).float()
            .6931471805599453
            sage: gp(log2)
            0.6931471805599453094172321215             # 32-bit
            0.69314718055994530941723212145817656807   # 64-bit
    sage: sudoku?
    File:        sage/local/lib/python2.5/site-packages/sage/games/sudoku.py
    Type:        <... 'function'>
    Definition:  sudoku(A)
    Docstring:

        Solve the 9x9 Sudoku puzzle defined by the matrix A.

        EXAMPLE:
            sage: A = matrix(ZZ,9,[5,0,0, 0,8,0, 0,4,9, 0,0,0, 5,0,0,
        0,3,0, 0,6,7, 3,0,0, 0,0,1, 1,5,0, 0,0,0, 0,0,0, 0,0,0, 2,0,8, 0,0,0,
        0,0,0, 0,0,0, 0,1,8, 7,0,0, 0,0,4, 1,5,0,   0,3,0, 0,0,2,
        0,0,0, 4,9,0, 0,5,0, 0,0,3])
            sage: A
            [5 0 0 0 8 0 0 4 9]
            [0 0 0 5 0 0 0 3 0]
            [0 6 7 3 0 0 0 0 1]
            [1 5 0 0 0 0 0 0 0]
            [0 0 0 2 0 8 0 0 0]
            [0 0 0 0 0 0 0 1 8]
            [7 0 0 0 0 4 1 5 0]
            [0 3 0 0 0 2 0 0 0]
            [4 9 0 0 5 0 0 0 3]
            sage: sudoku(A)
            [5 1 3 6 8 7 2 4 9]
            [8 4 9 5 2 1 6 3 7]
            [2 6 7 3 4 9 5 8 1]
            [1 5 8 4 6 3 9 7 2]
            [9 7 4 2 1 8 3 6 5]
            [3 2 6 7 9 5 4 1 8]
            [7 8 2 9 3 4 1 5 6]
            [6 3 5 1 7 2 8 9 4]
            [4 9 1 8 5 6 7 2 3]

Python

    >>> from sage.all import *
    >>> tan?
    Type:        <class 'sage.calculus.calculus.Function_tan'>
    Definition:  tan( [noargspec] )
    Docstring:

        The tangent function

        EXAMPLES:
    >>> tan(pi)
            0
    >>> tan(RealNumber('3.1415'))
            -0.0000926535900581913
    >>> tan(RealNumber('3.1415')/Integer(4))
            0.999953674278156
    >>> tan(pi/Integer(4))
            1
    >>> tan(Integer(1)/Integer(2))
            tan(1/2)
    >>> RR(tan(Integer(1)/Integer(2)))
            0.546302489843790
    >>> log2?
    Type:        <class 'sage.functions.constants.Log2'>
    Definition:  log2( [noargspec] )
    Docstring:

        The natural logarithm of the real number 2.

        EXAMPLES:
    >>> log2
            log2
    >>> float(log2)
            0.69314718055994529
    >>> RR(log2)
            0.693147180559945
    >>> R = RealField(Integer(200)); R
            Real Field with 200 bits of precision
    >>> R(log2)
            0.69314718055994530941723212145817656807550013436025525412068
    >>> l = (Integer(1)-log2)/(Integer(1)+log2); l
            (1 - log(2))/(log(2) + 1)
    >>> R(l)
            0.18123221829928249948761381864650311423330609774776013488056
    >>> maxima(log2)
            log(2)
    >>> maxima(log2).float()
            .6931471805599453
    >>> gp(log2)
            0.6931471805599453094172321215             # 32-bit
            0.69314718055994530941723212145817656807   # 64-bit
    >>> sudoku?
    File:        sage/local/lib/python2.5/site-packages/sage/games/sudoku.py
    Type:        <... 'function'>
    Definition:  sudoku(A)
    Docstring:

        Solve the 9x9 Sudoku puzzle defined by the matrix A.

        EXAMPLE:
    >>> A = matrix(ZZ,Integer(9),[Integer(5),Integer(0),Integer(0), Integer(0),Integer(8),Integer(0), Integer(0),Integer(4),Integer(9), Integer(0),Integer(0),Integer(0), Integer(5),Integer(0),Integer(0),
        0,3,0, 0,6,7, 3,0,0, 0,0,1, 1,5,0, 0,0,0, 0,0,0, 0,0,0, 2,0,8, 0,0,0,
        0,0,0, 0,0,0, 0,1,8, 7,0,0, 0,0,4, 1,5,0,   0,3,0, 0,0,2,
        0,0,0, 4,9,0, 0,5,0, 0,0,3])
    >>> A
            [5 0 0 0 8 0 0 4 9]
            [0 0 0 5 0 0 0 3 0]
            [0 6 7 3 0 0 0 0 1]
            [1 5 0 0 0 0 0 0 0]
            [0 0 0 2 0 8 0 0 0]
            [0 0 0 0 0 0 0 1 8]
            [7 0 0 0 0 4 1 5 0]
            [0 3 0 0 0 2 0 0 0]
            [4 9 0 0 5 0 0 0 3]
    >>> sudoku(A)
            [5 1 3 6 8 7 2 4 9]
            [8 4 9 5 2 1 6 3 7]
            [2 6 7 3 4 9 5 8 1]
            [1 5 8 4 6 3 9 7 2]
            [9 7 4 2 1 8 3 6 5]
            [3 2 6 7 9 5 4 1 8]
            [7 8 2 9 3 4 1 5 6]
            [6 3 5 1 7 2 8 9 4]
            [4 9 1 8 5 6 7 2 3]

Sage 还提供了“Tab 补全”功能：输入函数的前几个字母，然后按下 `Tab` 键。 例如，如果你输入 `ta` 然后按下 `Tab`，Sage 会显示 `tachyon, tan, tanh, taylor`。这是查找 Sage 中函数和其他结构名称的好方法。

# 函数、缩进和计数

在 Sage 中定义一个新函数，请使用 `def` 命令，并在变量名列表后加上冒号。例如：

Sage

    sage: def is_even(n):
    ....:     return n%2 == 0
    sage: is_even(2)
    True
    sage: is_even(3)
    False

Python

    >>> from sage.all import *
    >>> def is_even(n):
    ...     return n%Integer(2) == Integer(0)
    >>> is_even(Integer(2))
    True
    >>> is_even(Integer(3))
    False

注意：根据你查看的教程版本，你可能会在本例的第二行看到三个点 `....:`。 请勿输入它们，它们只是为了强调代码的缩进。 在这种情况下，请在块末尾按 [Return/Enter] 以插入空行并结束函数定义。

你不需要指定输入参数的类型。 你可以指定多个输入，每个输入都可以有一个可选的默认值。 例如，如果未指定 `divisor`，则下面的函数默认值为 `divisor=2`。

Sage

    sage: def is_divisible_by(number, divisor=2):
    ....:     return number%divisor == 0
    sage: is_divisible_by(6,2)
    True
    sage: is_divisible_by(6)
    True
    sage: is_divisible_by(6, 5)
    False

[Python]

    >>> from sage.all import *
    >>> def is_divisible_by(number, divisor=Integer(2)):
    ...     return number%divisor == Integer(0)
    >>> is_divisible_by(Integer(6),Integer(2))
    True
    >>> is_divisible_by(Integer(6))
    True
    >>> is_divisible_by(Integer(6), Integer(5))
    False

调用函数时，你还可以显式地指定一个或多个输入；如果你显式地指定输入，可以以任意顺序给出它们：

Sage

    sage: is_divisible_by(6, divisor=5)
    False
    sage: is_divisible_by(divisor=2, number=6)
    True

Python

    >>> from sage.all import *
    >>> is_divisible_by(Integer(6), divisor=Integer(5))
    False
    >>> is_divisible_by(divisor=Integer(2), number=Integer(6))
    True

在 Python 中，代码块不是用大括号或其他语言中的开始和结束标记来表示的。 相反，代码块由缩进来表示，缩进必须完全匹配。 例如，以下是一个语法错误，因为 `return` 语句的缩进与上面的其他行不一致：

Sage

    sage: def even(n):
    ....:     v = []
    ....:     for i in range(3,n):
    ....:         if i % 2 == 0:
    ....:             v.append(i)
    ....:    return v
    Syntax Error:
           return v

[Python]

    >>> from sage.all import *
    >>> def even(n):
    ...     v = []
    ...     for i in range(Integer(3),n):
    ...         if i % Integer(2) == Integer(0):
    ...             v.append(i)
    ...    return v
    Syntax Error:
           return v

如果你修复了缩进，函数就可以正常工作：

Sage

    sage: def even(n):
    ....:     v = []
    ....:     for i in range(3,n):
    ....:         if i % 2 == 0:
    ....:             v.append(i)
    ....:     return v
    sage: even(10)
    [4, 6, 8]

Python

    >>> from sage.all import *
    >>> def even(n):
    ...     v = []
    ...     for i in range(Integer(3),n):
    ...         if i % Integer(2) == Integer(0):
    ...             v.append(i)
    ...     return v
    >>> even(Integer(10))
    [4, 6, 8]

行末不需要分号；在大多数情况下，行以换行符结束。但是，你可以在一行上放置多个语句，用分号间隔：

Sage

    sage: a = 5; b = a + 3; c = b^2; c
    64

[Python]

    >>> from sage.all import *
    >>> a = Integer(5); b = a + Integer(3); c = b**Integer(2); c
    64

如果你希望一行代码跨越多行，可以使用反斜杠：

Sage

    sage: 2 + \
    ....:    3
    5

Python

    >>> from sage.all import *
    >>> Integer(2) +    Integer(3)
    5

在 Sage 中，你可以通过遍历整数区间来计数。 例如，下面代码的第一行与 C++ 或 Java 中的 `for(i=0; i<3; i++)` 完全一样：

Sage

    sage: for i in range(3):
    ....:     print(i)
    0
    1
    2

[Python]

    >>> from sage.all import *
    >>> for i in range(Integer(3)):
    ...     print(i)
    0
    1
    2

下面代码的第一行与 `for(i=2;i<5;i++)` 等价。

Sage

    sage: for i in range(2,5):
    ....:     print(i)
    2
    3
    4

Python

    >>> from sage.all import *
    >>> for i in range(Integer(2),Integer(5)):
    ...     print(i)
    2
    3
    4

第三个参数控制步长，所以下面代码与 `for(i=1;i<6;i+=2)` 等价。

Sage

    sage: for i in range(1,6,2):
    ....:     print(i)
    1
    3
    5

[Python]

    >>> from sage.all import *
    >>> for i in range(Integer(1),Integer(6),Integer(2)):
    ...     print(i)
    1
    3
    5

通常你会希望创建一个漂亮的表格来显示你使用 Sage 计算的数字。 一个简单的方法是使用格式化字符串。 下面，我们创建三个宽度正好为 6 的列，并制作一个平方和立方的表格。

Sage

    sage: for i in range(5):
    ....:     print('%6s %6s %6s' % (i, i^2, i^3))
         0      0      0
         1      1      1
         2      4      8
         3      9     27
         4     16     64

Python

    >>> from sage.all import *
    >>> for i in range(Integer(5)):
    ...     print('%6s %6s %6s' % (i, i**Integer(2), i**Integer(3)))
         0      0      0
         1      1      1
         2      4      8
         3      9     27
         4     16     64

Sage 中最基本的数据结构是列表，顾名思义，就是一个任意对象的列表。 例如，以下命令使用 `range` 创建一个列表:

Sage

    sage: list(range(2,10))
    [2, 3, 4, 5, 6, 7, 8, 9]

[Python]

    >>> from sage.all import *
    >>> list(range(Integer(2),Integer(10)))
    [2, 3, 4, 5, 6, 7, 8, 9]

下面是一个更复杂的列表：

Sage

    sage: v = [1, "hello", 2/3, sin(x^3)]
    sage: v
    [1, 'hello', 2/3, sin(x^3)]

Python

    >>> from sage.all import *
    >>> v = [Integer(1), "hello", Integer(2)/Integer(3), sin(x**Integer(3))]
    >>> v
    [1, 'hello', 2/3, sin(x^3)]

如如许多编程语言一样，列表的索引是从 0 开始。

Sage

    sage: v[0]
    1
    sage: v[3]
    sin(x^3)

[Python]

    >>> from sage.all import *
    >>> v[Integer(0)]
    1
    >>> v[Integer(3)]
    sin(x^3)

使用 `len(v)` 获取 `v` 的长度， 使用 `v.append(obj)` 将新对象追加到 `v` 的末尾， 使用 `del v[i]` 删除 `v` 的第 \(i\) 项：

Sage

    sage: len(v)
    4
    sage: v.append(1.5)
    sage: v
    [1, 'hello', 2/3, sin(x^3), 1.50000000000000]
    sage: del v[1]
    sage: v
    [1, 2/3, sin(x^3), 1.50000000000000]

Python

    >>> from sage.all import *
    >>> len(v)
    4
    >>> v.append(RealNumber('1.5'))
    >>> v
    [1, 'hello', 2/3, sin(x^3), 1.50000000000000]
    >>> del v[Integer(1)]
    >>> v
    [1, 2/3, sin(x^3), 1.50000000000000]

另一个重要的数据结构是字典（或关联数组）。 字典的工作方式类似于列表，但它可以用几乎任何对象来索引（索引必须是不可变的）：

Sage

    sage: d = {'hi':-2,  3/8:pi,   e:pi}
    sage: d['hi']
    -2
    sage: d[e]
    pi

[Python]

    >>> from sage.all import *
    >>> d = {'hi':-Integer(2),  Integer(3)/Integer(8):pi,   e:pi}
    >>> d['hi']
    -2
    >>> d[e]
    pi

你还可以使用类定义新的数据类型。 使用类封装数学对象是一种强大的技术，可以帮助简化和组织你的 Sage 程序。 下面，我们定义一个表示不超过 n 的正偶数列表的类；它从内置类型 `list` 派生而来。

Sage

    sage: class Evens(list):
    ....:     def __init__(self, n):
    ....:         self.n = n
    ....:         list.__init__(self, range(2, n+1, 2))
    ....:     def __repr__(self):
    ....:         return "Even positive numbers up to n."

Python

    >>> from sage.all import *
    >>> class Evens(list):
    ...     def __init__(self, n):
    ...         self.n = n
    ...         list.__init__(self, range(Integer(2), n+Integer(1), Integer(2)))
    ...     def __repr__(self):
    ...         return "Even positive numbers up to n."

`__init__` 方法在创建对象时调用以初始化对象； `__repr__` 方法打印对象。 我们在 `__init__` 方法的第二行调用列表构造函数。 下面我们创建 `Evens` 类的对象：

Sage

    sage: e = Evens(10)
    sage: e
    Even positive numbers up to n.

[Python]

    >>> from sage.all import *
    >>> e = Evens(Integer(10))
    >>> e
    Even positive numbers up to n.

注意，`e` 使用我们定义的 `__repr__` 方法打印。 要查看底层数字列表，请使用 `list` 函数：

Sage

    sage: list(e)
    [2, 4, 6, 8, 10]

Python

    >>> from sage.all import *
    >>> list(e)
    [2, 4, 6, 8, 10]

我们还可以访问属性 `n` 或像列表一样操作 `e`。

Sage

    sage: e.n
    10
    sage: e[2]
    6

[Python]

    >>> from sage.all import *
    >>> e.n
    10
    >>> e[Integer(2)]
    6