w/Python - FrontPage Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
無駄にインデントしたら叱られたwww (IndentationError)
これは新鮮。
インデントのレベルが同じ連続した行が一つの複合文を作るのは了解したが、インデントのレベルが選べないとは思わなかった。
当初の目的だった、ViewVC(Pythonで書かれている)の出力を SHJSに対応させることはできたのでモチベーションが消失中。
!リテラル
!!文字列リテラル
!!!short string
*シングルクォートあるいはダブルクォートでくくる。
*\で引用符をエスケープ可能。
*改行を含むことはできないが \を行末に置くことで次の行に続けられる。(このとき文字列に改行は含まれない)
*\r, \n, \tといった一般的なエスケープシークェンスが有効。
*\gは特殊な意味をもっていないのだが、このとき '\g'と '\\g'は同じ文字列になる。
*Uまたは uを引用符の直前に置くとその文字列の内部表現が Unicodeになり、また \uxxxxと \Uxxxxxxxxのエスケープシークェンスが有効になる。
*Rまたは rを前置するとエスケープシークェンスが無効になり、\は \そのものを表すが、\の直後の文字がその文字そのものとして文字列に含まれるという効果もある。(例えば引用符や改行。r"\"" = "\\\""、r"\(改行)" = "\\\n")
*言い換えると、R(r)を引用符の前に付けると、\が消えないで必ず残る。\の次の文字も必ず文字列の一部になる。ただし偶数個の\の後ろの文字はその限りではない。
*U(u)と R(r)を同時に使用する場合は U(u)を先に置く。また \uxxxxと \Uxxxxxxxxのエスケープシークェンスだけは依然有効。
!!!long string (triple-quoted string)
short stringとの違いは
*三重の {{"'''"}}か """で囲まれている。({{"'''"}}3quoted string{{"'''"}})
*一つか二連の引用符はエスケープ無しで書ける。
*改行をそのまま含むことができ、改行文字として文字列に含められる。
複数の文字列リテラルを、あいだに改行や空白を挟んだり挟まなかったりして並べると、連結された一つの文字列になる。引用符はシングルでもダブルでも三連でも混在できるが、 U(u)接頭辞を持つリテラルが混じっていると全て Unicode文字列になる。
文字列は共有されているだろうかと思って str[0] = 'a' とやってみたら代入は許可されていなかった。(共有されているが変更が不可能なので意識する必要はないというあたりだろうか。変更する方法が本当にないのかはわからない)
!!!日本語
len("日本語") == 6
len(U"日本語") == 3
"日本語"[1] == 0xFA
U"日本語"[1] == '本'
すべて true。U(u)なしではバイト単位。U(u)ありでは 2バイト単位? サロゲートペアは \uxxxxと \Uxxxxxxxxを使ってエンコードしろと書かれている。
!!数値リテラル
四種類。整数(plain integer)、長整数(long integer)、浮動小数点数(floating point number)、虚数(imaginary number) 。
!!!整数リテラル、長整数リテラル
[1-9][0-9]* (10進数)
0[0-7]+ (8進数)
0[Xx][0-9A-Fa-f]+ (16進数)
*末尾に L(l)を付けると明示的に長整数を作れるが、整数(32ビット)で表せない大きな数字は自動的に長整数になる。
*長整数に明示的な上限はない。
*8進表記と 16進表記のばあい、符号付き整数の上限から符号無し整数の上限までの範囲は負数になる。(これらは数値というよりバイナリの表現なのだと認識した)
!!!浮動小数点数リテラル
1.0
1.
.0
1e5
* 小数点の前か後ろは省いてよい。
* e(E)に続けて指数を書ける。指数は正か負の整数。(例:1e-5 = 1.0 * 10**-5)
* 整数部分と指数部分に 0から始まる数字を書けるが常に十進数。(例:07e05 = 7e5)
!!!虚数リテラル
*他の数値リテラルに J(j)の接尾辞を付けると実部が 0.0の虚数(複素数)になる。
*実部が 0.0以外の複素数は (5+4j)と加算するか complex(5, 4)関数を使う。
*内部的にはペアになった浮動小数点数(double)。
*実部、虚部へのアクセスは .real、.imagを使用。(例:1.0.real = 0.0)
*絶対値は abs()で得る。(例:abs(5+4j) = math.sqrt(5*5+4*4))
*一度複素数になってしまった数値は他の数値へ変換できない。(.imag、.realで個別に取り出すことになる)
!!!リスト (< シーケンスオブジェクト)
* Rubyの配列のようなもの。(list = [0, 1, 2, "3", "4"])
* インデックスは 0から。
* list[start:end]で範囲アクセス(slicing)。list[end]は返ってくるリストに含まれない。
* 代入もできる。(list1[0:0] = list0は list1 = list0 + list1と同じ)
* slicingでは常にリストか空リストが返るが、添え字を使ったアクセスでは -length〜lengh-1の範囲外で IndexErrorになる。
*参照型。(変更は、同じリストを指す変数、そのリストを含むリストで共有される)
!!演算子
+、-、*、**、/、//、%、<<、>>、&、|、^、~、<、>、<=、>=、==、!=、<>
* != と <>の意味は同じだが Pythonは !=を推奨。
* //は切り捨て除算。(5/2 = 5//2 = 2。5.0/2 = 2.5。5.0//2 = 2.0 = math.floor(5.0/2))
!制御構造
!! if
!モジュール
*拡張子が .pyのファイルはモジュール。(インタプリタに最初に読み込まれるスクリプトファイルも .py)
*ファイル毎に名前空間を持つ。
*import modnameすると modname.pyというファイルが読み込まれ、実行され、modnameというシンボルが現在の名前空間(シンボルテーブル)に追加される。
*モジュール内のグローバルなシンボルは、modname.function、modname.variableというようにモジュール名とピリオドを付けてアクセスできる。
*モジュールの名前は__name__というグローバル変数に入っている。(import a; a.__name__ == 'a')
*importではなくpython.exeに直接実行された.pyファイルの__name__は '__main__'になる。
*モジュールは一度だけ importされ、実体も一つしかない。(bをimportする aをimportした後に import bとすることは b=a.bとするのと同じ)
*モジュールの検索パスはカレントディレクトリ、環境変数PYTHONPATH、標準のライブラリのインストール先。これは sys.pathでアクセスでき、変更もできる。
*.pyと同じ場所に同じ名前の.pycというファイルが見つかったとき、.pycはバイトコンパイルされた.pyだと見なされ、.pycに記録された.pyの最終更新時刻と.pyの最終更新時刻が比較され新しい方が利用される。
*「.pyと同じ場所に同じ名前の.pycというファイルが見つかったとき」というのは少し違う。.pyがなくても.pycがあれば importは成功する。
*.pyのコンパイルに成功すると常に .pycの書き出しが試みられる。
*python.exeを -Oや -OOフラグ付きで起動すると .pycファイルは無視され、.pyoファイルが読み込みor作成される。
*インタプリタに渡された.pyファイル(__name__=='__main__')から .pyc、.pyoファイルが作られることはない。
!変数
*代入前に値を参照することはできない。
*変数への代入は変数の参照するオブジェクトへの代入やメソッド呼び出しではない。
これは新鮮。
インデントのレベルが同じ連続した行が一つの複合文を作るのは了解したが、インデントのレベルが選べないとは思わなかった。
当初の目的だった、ViewVC(Pythonで書かれている)の出力を SHJSに対応させることはできたのでモチベーションが消失中。
!リテラル
!!文字列リテラル
!!!short string
*シングルクォートあるいはダブルクォートでくくる。
*\で引用符をエスケープ可能。
*改行を含むことはできないが \を行末に置くことで次の行に続けられる。(このとき文字列に改行は含まれない)
*\r, \n, \tといった一般的なエスケープシークェンスが有効。
*\gは特殊な意味をもっていないのだが、このとき '\g'と '\\g'は同じ文字列になる。
*Uまたは uを引用符の直前に置くとその文字列の内部表現が Unicodeになり、また \uxxxxと \Uxxxxxxxxのエスケープシークェンスが有効になる。
*Rまたは rを前置するとエスケープシークェンスが無効になり、\は \そのものを表すが、\の直後の文字がその文字そのものとして文字列に含まれるという効果もある。(例えば引用符や改行。r"\"" = "\\\""、r"\(改行)" = "\\\n")
*言い換えると、R(r)を引用符の前に付けると、\が消えないで必ず残る。\の次の文字も必ず文字列の一部になる。ただし偶数個の\の後ろの文字はその限りではない。
*U(u)と R(r)を同時に使用する場合は U(u)を先に置く。また \uxxxxと \Uxxxxxxxxのエスケープシークェンスだけは依然有効。
!!!long string (triple-quoted string)
short stringとの違いは
*三重の {{"'''"}}か """で囲まれている。({{"'''"}}3quoted string{{"'''"}})
*一つか二連の引用符はエスケープ無しで書ける。
*改行をそのまま含むことができ、改行文字として文字列に含められる。
複数の文字列リテラルを、あいだに改行や空白を挟んだり挟まなかったりして並べると、連結された一つの文字列になる。引用符はシングルでもダブルでも三連でも混在できるが、 U(u)接頭辞を持つリテラルが混じっていると全て Unicode文字列になる。
文字列は共有されているだろうかと思って str[0] = 'a' とやってみたら代入は許可されていなかった。(共有されているが変更が不可能なので意識する必要はないというあたりだろうか。変更する方法が本当にないのかはわからない)
!!!日本語
len("日本語") == 6
len(U"日本語") == 3
"日本語"[1] == 0xFA
U"日本語"[1] == '本'
すべて true。U(u)なしではバイト単位。U(u)ありでは 2バイト単位? サロゲートペアは \uxxxxと \Uxxxxxxxxを使ってエンコードしろと書かれている。
!!数値リテラル
四種類。整数(plain integer)、長整数(long integer)、浮動小数点数(floating point number)、虚数(imaginary number) 。
!!!整数リテラル、長整数リテラル
[1-9][0-9]* (10進数)
0[0-7]+ (8進数)
0[Xx][0-9A-Fa-f]+ (16進数)
*末尾に L(l)を付けると明示的に長整数を作れるが、整数(32ビット)で表せない大きな数字は自動的に長整数になる。
*長整数に明示的な上限はない。
*8進表記と 16進表記のばあい、符号付き整数の上限から符号無し整数の上限までの範囲は負数になる。(これらは数値というよりバイナリの表現なのだと認識した)
!!!浮動小数点数リテラル
1.0
1.
.0
1e5
* 小数点の前か後ろは省いてよい。
* e(E)に続けて指数を書ける。指数は正か負の整数。(例:1e-5 = 1.0 * 10**-5)
* 整数部分と指数部分に 0から始まる数字を書けるが常に十進数。(例:07e05 = 7e5)
!!!虚数リテラル
*他の数値リテラルに J(j)の接尾辞を付けると実部が 0.0の虚数(複素数)になる。
*実部が 0.0以外の複素数は (5+4j)と加算するか complex(5, 4)関数を使う。
*内部的にはペアになった浮動小数点数(double)。
*実部、虚部へのアクセスは .real、.imagを使用。(例:1.0.real = 0.0)
*絶対値は abs()で得る。(例:abs(5+4j) = math.sqrt(5*5+4*4))
*一度複素数になってしまった数値は他の数値へ変換できない。(.imag、.realで個別に取り出すことになる)
!!!リスト (< シーケンスオブジェクト)
* Rubyの配列のようなもの。(list = [0, 1, 2, "3", "4"])
* インデックスは 0から。
* list[start:end]で範囲アクセス(slicing)。list[end]は返ってくるリストに含まれない。
* 代入もできる。(list1[0:0] = list0は list1 = list0 + list1と同じ)
* slicingでは常にリストか空リストが返るが、添え字を使ったアクセスでは -length〜lengh-1の範囲外で IndexErrorになる。
*参照型。(変更は、同じリストを指す変数、そのリストを含むリストで共有される)
!!演算子
+、-、*、**、/、//、%、<<、>>、&、|、^、~、<、>、<=、>=、==、!=、<>
* != と <>の意味は同じだが Pythonは !=を推奨。
* //は切り捨て除算。(5/2 = 5//2 = 2。5.0/2 = 2.5。5.0//2 = 2.0 = math.floor(5.0/2))
!制御構造
!! if
!モジュール
*拡張子が .pyのファイルはモジュール。(インタプリタに最初に読み込まれるスクリプトファイルも .py)
*ファイル毎に名前空間を持つ。
*import modnameすると modname.pyというファイルが読み込まれ、実行され、modnameというシンボルが現在の名前空間(シンボルテーブル)に追加される。
*モジュール内のグローバルなシンボルは、modname.function、modname.variableというようにモジュール名とピリオドを付けてアクセスできる。
*モジュールの名前は__name__というグローバル変数に入っている。(import a; a.__name__ == 'a')
*importではなくpython.exeに直接実行された.pyファイルの__name__は '__main__'になる。
*モジュールは一度だけ importされ、実体も一つしかない。(bをimportする aをimportした後に import bとすることは b=a.bとするのと同じ)
*モジュールの検索パスはカレントディレクトリ、環境変数PYTHONPATH、標準のライブラリのインストール先。これは sys.pathでアクセスでき、変更もできる。
*.pyと同じ場所に同じ名前の.pycというファイルが見つかったとき、.pycはバイトコンパイルされた.pyだと見なされ、.pycに記録された.pyの最終更新時刻と.pyの最終更新時刻が比較され新しい方が利用される。
*「.pyと同じ場所に同じ名前の.pycというファイルが見つかったとき」というのは少し違う。.pyがなくても.pycがあれば importは成功する。
*.pyのコンパイルに成功すると常に .pycの書き出しが試みられる。
*python.exeを -Oや -OOフラグ付きで起動すると .pycファイルは無視され、.pyoファイルが読み込みor作成される。
*インタプリタに渡された.pyファイル(__name__=='__main__')から .pyc、.pyoファイルが作られることはない。
!変数
*代入前に値を参照することはできない。
*変数への代入は変数の参照するオブジェクトへの代入やメソッド呼び出しではない。