re:annkara

日々学んだことを書き留めておく。

初めてのPython再挑戦2

初めてのPythonのメモがき。
今日はステートメントの部分のポイントをまとめる。

条件の評価式の際には()は任意

a = []
in not a:
    print a #空のリストが表示

代入ステートメントについて

代入は変数とオブジェクトリファレンスを結びつける操作のこと。 変数はオブジェクトリファレンスを保持するのみであり、 型情報はあくまでオブジェクト側で保持されていることに注意。

形式
  • シーケンス代入
a, b, c, d = "spam"
print a # 's'と表示
print b # 'p'と表示

左辺の変数の数と、右辺のシーケンスの要素数が一致しないとエラーなる。 そういう場合は、スライシングを利用すると良い。

str = "spam"
a, b, c = str[0], str[1], str[2:]
print c # 'am'と表示
  • マルチターゲット代入

複数の変数に同一のオブジェクトリファレンスを保持させることができる。

a = b = [] # a b ともに空のリストの共通リファレンスを保持する
a.append(1)
print a, b # ([1],[1])と表示

b.append(2)
print a, b # ([1, 2], [1, 2])と表示

いわゆる、+=や/=なやつ。
演算対象が可変オブジェクトである場合、ちょっと変わった振る舞いをする。

L = [1,2]
L = L + [3] # リストの連結 このとき新しいリストオブジェクトが生成され代入される
L = L.append(4) # appendを利用すれば元のオブジェクトの上書きをする

新しいオブジェクトを生成するか、上書きをするのか挙動が変化する。 このとき、拡張代入ステートメントを使用すれば、処理系が自動で実行速度で高率な方を採用するため、 あまり考えなくてよい。

printステートメント

オブジェクトのデータをテキストに変換して標準出力ステートメントに書き込むステートメント

標準出力の変更

sys.stdoutにwriteオブジェクトを備えたオブジェクトを代入すれば、printステートメントが リダイレクトされる。

>>でもリダイレクトは可能であるが、これは一度キリなので、何度もリダイレクトしたい場合は sys.stdoutを弄った方がよい。

forループ

forステートメントを使用しないループ処理の書き方もある。 処理対象のオブジェクトをiter()に渡すと、イテレータオブジェクトを返す。 そのオブジェクトに対して、nextメソッドを実行すると、要素を返してくれる。

L = [1,2,3]
I = iter(L) # 反復処理に対応したオブジェクトを生成

I.next() # 1を表示 要素がつきるとStopIteretion例外を発生させる

リスト内包表記

メリットとして、コードが簡潔になる。 また、処理速度もforループを使用したときよりも高速になる。 これは反復処理がPythonのコードレベルではなく、インタプリタの内部で Cのコードレベルで実行されるから。 デメリットとして、いくらでも拡張することができるため、複雑な処理を記述すると可読性が落ちてしまう点。