% Sage Syntax Quick Reference
% (c) 2012 by NUMATA, Yasuhide
% Licensed with the GNU Free Documentation License (GFDL)
%   http://www.gnu.org/copyleft/fdl.html
%
%  History
%
%  * 2012-05-03  NUMATA, Yasuhide <numata AT stat.t.u-tokyo.ac.jp>
%     + Draft. 
%
\documentclass[a4paper]{article}
\usepackage{graphicx}  
\usepackage[landscape]{geometry}
%\usepackage[pdftex]{color}
\usepackage[dvipdfm]{color}

\usepackage{quickrefcard}  

\usepackage{multicol}
\usepackage{amsmath}
\usepackage{amsfonts}
\newcommand{\QQ}{\mathbb{Q}}
\newcommand{\ZZ}{\mathbb{Z}}
\newcommand{\FF}{\mathbb{F}}

\parskip2.8pt
\begin{document}
\begin{multicols*}{3}
\begin{center}
\textbf{Sage Quick Reference: Python Syntax}\\
NUMATA, Yasuhide\\
Sage Version 4.8\\
\url{http://wiki.sagemath.org/quickref}\\
GNU Free Document License, extend for your own use.
\end{center}


%*********************************************
\sect{変数への代入}
\begin{exampleblock}
{変数}\EX{ = }{代入するもの}
\end{exampleblock}

変数への代入は\sagecommand{=}

変数の名前に使える文字は 
\sagecommand{a}--\sagecommand{z}, \sagecommand{A}--\sagecommand{Z},
\sagecommand{_}, \sagecommand{0}--\sagecommand{9}.\\
ただし, 数字で始まるもの文字列はNG.\\
システムで使われている文字列もNG.

代入が起こった時点で変数が生成されるので, 
変数の宣言をする必要はない.

次のような複合演算子もある:\\
\EX{a += b} $\leadsto$ \sagecommand{a = a+b}とほぼ同じ \\
\EX{a -= b} $\leadsto$ \sagecommand{a = a-b}とほぼ同じ \\
\EX{a *= b} $\leadsto$ \sagecommand{a = a*b}とほぼ同じ \\
など.


%*********************************************
\sect{関数の定義}
\begin{exampleblock}
\EX{def }{関数名}{\EX(}引数\EX{):}\BreakLineAndIndent
　　{関数の定義}
\end{exampleblock}
値を返すときには\sagecommand{return}を使う.

引数は何個でもOK. 無くてもよい.

関数の定義部分はインデントをする. 複数行でもOK.

次のように定義すると, \sagecommand{a_plus_b(2,3)}で5が返ってくる.
\EX{def a_plus_b(a,b):}\BreakLineAndIndent
   \EX{c=a+b} \BreakLineAndIndent
   \EX{return c}

\hr
\vfill
\columnbreak
%*********************************************
\sect{if/elif/else}
\begin{exampleblock}
\EX{if }{条件1}\EX{:}\BreakLineAndIndent
   {{条件1}を満たす時にやること}\\
\EX{elif }{条件2}\EX{:}\BreakLineAndIndent
   {{条件1}を満たさず{条件2}を満たす時にやること}\\
\EX{elif }{条件3}\EX{:}\BreakLineAndIndent
   {{条件1,2}を満たさず{条件3}を満たす時にやること}\\
\EX{else:}\BreakLineAndIndent
   {どの条件をも満たさなかった時にやること}
\end{exampleblock}

\sagecommand{elif}はいくつでもOK.  なくても良い.

\sagecommand{else}は無くても良い.

処理を書く部分はインデントをする. 複数行でもOK.

%*********************************************
\sect{while/else/break/continue}
\begin{exampleblock}
\EX{while }{条件}\EX{:}\BreakLineAndIndent
   {{条件}を満たす間くり返しやること}\\
\EX{else:}\BreakLineAndIndent
   {ループから抜けた時に実行すること}
\end{exampleblock}


\sagecommand{else}は無くても良い.

処理を書く部分はインデントをする. 複数行でもOK.

%*********************************************
\sect{for/else/break/continue}
\begin{exampleblock}
\EX{for }\sagevar{elm}\EX{ in }\sagevar{sequence}\EX{:}\BreakLineAndIndent
   {\sagevar{sequence}の各要素(変数\sagevar{elm}に代入される)に対しやること}\\
\EX{else:}\BreakLineAndIndent
   {ループから抜けた時に実行すること}
\end{exampleblock}


\sagecommand{else}は無くても良い.

処理を書く部分はインデントをする. 複数行でもOK.

0から9までの整数を出力するには\\
\EX{for i in range(10):}\BreakLineAndIndent
   \EX{print i} 


%*********************************************
\sect{break/continue}

\sagecommand{while}ループまたは\sagecommand{for}ループの中で,
\sagecommand{break}を実行すると, 即座にループを抜ける.
このとき\sagecommand{else}の部分は実行されない.

\sagecommand{while}ループまたは\sagecommand{for}ループの中で,
\sagecommand{continue}を実行すると, 
即座に次の繰り返し移る.



%*********************************************
%*********************************************
\hr
\columnbreak
%*********************************************
%*********************************************

%*********************************************
\sect{比較演算子}
\EX{<}\quad
\EX{<=}\quad
\EX{>}\quad
\EX{>=}\quad
\EX{<>}\quad
\EX{!=}\quad
\EX{==}

\sect{ブール型}
\EX{True},\quad
\EX{False}

\EX{not }\sagevar{x},\quad
\sagevar{x}\EX{ and }\sagevar{y},\quad
\sagevar{x}\EX{ or }\sagevar{y}

%*********************************************
\sect{List}
\EX{a=[40,31,22,13]} \\
\EX{len(a)} $\leadsto$ 4,\quad
\EX{a[0]} $\leadsto$ 40 \\
\EX{a[0]==a[-3]},
\EX{a[1]==a[-2]},
\EX{a[2]==a[-1]}$\leadsto$ True
%\EX{a[4]} $\leadsto$ エラー 

内包的記法:\\
\EX{[ }元\EX{ for }くり返し\EX{ if }条件\EX{]}  
\hfil(`\sagecommand{if} 条件'は省略可)\\
\EX{[ 2*i for i in rage(9) if i \% 3 == 0]}
$\leadsto$ \sagecommand{[0,6,12]}

非破壊的な操作(各操作の前に\sagecommand{a=[0,1]}; \sagecommand{b=[2,3,4,5]}):\\
\EX{c=a+b} $\leadsto$ \sagecommand{c==[0,1,2,3,4,5]}\\
\EX{c=a*2} $\leadsto$ \sagecommand{c==[0,1,0,1]}\\
\EX{c=b[:3]} $\leadsto$ \sagecommand{c==[2,3,4]}\\
\EX{c=b[1:]} $\leadsto$ \sagecommand{c==[3,4,5]}\\
\EX{c=b[1:3]} $\leadsto$ \sagecommand{c==[3,4]}\\
\EX{c=b[:]} $\leadsto$ \sagecommand{c==a}



破壊的な操作(各操作の前に\sagecommand{a=[0,3,1,2]}):\\
\EX{a[0]=1} $\leadsto$ \sagecommand{a==[1,3,1,2]}\\
\EX{a.append(4)} $\leadsto$ \sagecommand{a==[0,3,1,2,4]}\\
\EX{a.insert(1,4)} $\leadsto$ \sagecommand{a==[0,4,3,1,2]}\\
\EX{a.extend([10,11])} $\leadsto$ \sagecommand{a==[0,3,1,2,10,11]}\\
\EX{b=a.pop()} $\leadsto$ \sagecommand{a==[0,3,1]}; \sagecommand{b==2}\\
\EX{b=a.pop(1)} $\leadsto$ \sagecommand{a==[0,1,2]}; \sagecommand{b==3}\\
\EX{a.reverse()} $\leadsto$ \sagecommand{a==[2,1,3,0]}\\
\EX{a.sort()} $\leadsto$ \sagecommand{a==[0,1,2,3]}

検索(各操作の前に\sagecommand{a=[0,2,3,1,2,2]}):\\
\EX{2 in a} $\leadsto$ \sagecommand{True}\hfil
\EX{5 not in a} $\leadsto$ \sagecommand{True}\\
\EX{a.index(2)} $\leadsto$ \sagecommand{1}\hfil
\EX{a.index(5)} $\leadsto$ エラー\\
\EX{a.count(2)} $\leadsto$ \sagecommand{3}

%*********************************************
\sect{Tuple}
\EX{a=(0,1,2,3,4)}

Listとほぼ同じに扱える. ただし破壊的な操作はできない.

変数に一度に代入することもできる: \EX{t=(0,1,2); (a,b,c)=t}

Listからtupleへ: \EX{a=[30,21,12]; tuple(a)}

Tupleからlistへ: \EX{a=(30,21,12); list(a)}

\hr
\end{multicols*}

\end{document}
