初めての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のコードレベルで実行されるから。 デメリットとして、いくらでも拡張することができるため、複雑な処理を記述すると可読性が落ちてしまう点。