Hatena::Groupfukuoka-py

taketin.py RSSフィード

 | 

2011-12-07

初めてのPython 10章 Pythonのステートメント 11章 代入ステートメント、式ステートメント、printステートメント 12章 ifステートメント

18:18 | 初めてのPython 10章 Pythonのステートメント 11章 代入ステートメント、式ステートメント、printステートメント 12章 ifステートメント - taketin.py を含むブックマーク はてなブックマーク - 初めてのPython 10章 Pythonのステートメント 11章 代入ステートメント、式ステートメント、printステートメント 12章 ifステートメント - taketin.py

10章 Pythonのステートメント

  • 行の終わりがステートメントの終わり
  • セミコロンで1行に複数のステートメントを記述できる
a = 1; b = 2;  c = 3;
  • 複数行にまたがるステートメントは () [] {} で囲む
if (A == 1 and
    B == 2 and
    C == 3):
        print 'spam'

  • 字下げの終わりがブロックの終わり
if x > y:
    x = 1
    y = 2
  • 複合ステートメントはコロンで1行にまとめる事ができる(ただしボディに複合ステートメントが含まれない場合のみ)
if x > y: x = 1

11章 代入ステートメント、式ステートメント、printステートメント

・代入ステートメント

・代入ステートメントの形式

ステートメント説明
spam = 'spam'基本形
spam, ham = 'yum', 'YUM'タプル代入(代入先は変数、値の位置で決まる)アンパック代入ともいう
[spam, ham] = ['yum', 'YUM']リスト代入(代入先は変数、値の位置で決まる)アンパック代入ともいう
a, b, c, d = 'spam'シーケンス代入
spam = ham = 'lunch'マルチターゲット
spams += 42拡張代入ステートメント

・アンパック代入

L = [1, 2, 3, 4]
while L:
    front, L = L[0], L[1:]
    print front, L

~
1 [2, 3, 4]
2 [3, 4]
3 [4]
4 []

・拡張代入ステートメント

X += Y

等、省略した式の事。上記の例で言うと X = X + Y という式に比べて以下のメリットがある。

  • タイピングが少ない
  • 評価数が少ないので処理が早い
  • 速度の面で有利な操作方法が自動的に選択される(対象が不変性か可変性かで変わる)

変数名に関するルール

  • 先頭は英文字またはアンダースコア、その後は英文字、数字、アンダースコアのいずれか
  • 大文字と小文字は区別される
  • 予約語変数名として使用できない

・名前付けに関する慣例

  • アンダースコア2つで変数名を挟まない (__hoge__ など)
    • システム上特別な意味を持つ為
  • 先頭にアンダースコア1つ付けた名前は使わない(from module import * ステートメントでインポートできない為)
  • 先頭にアンダースコア2つ付けた名前は使わない(使用すると、所属するクラスの名前を付けた名前に自動的に変換される。これをマングリングという)
  • アンダースコア1つだけの名前は付けない(対話型コマンドラインで直前に実行された式の演算結果を保持する為に使われる為)
  • 大文字で始まる名前は通常クラスの名前に使用される為、変数名には使わない
  • モジュール名は小文字にする
  • self は予約語ではないが通常は特別な意味を持つため変数名としては使用しない

・式ステートメント

以下の場合に式をステートメントとして使用する事ができる


・print ステートメント

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


・出力ストリームリダイレクト

標準出力先を変える事で、printステートメントの出力先も変更できる。独自クラスで出力先の挙動を定義する事もできる。その場合は writeメソッドを定義する。

class Hoge:
    def write(self, string):
        # 処理を記述

~

import sys
sys.stdout = Hoge()
print fuga

・>> を使ったリダイレクト

出力ストリームリダイレクトは >> を使う事でもっと簡単にできる

hoge = Hoge()
print >> huge, fuga

12章 ifステートメント

Python には多分岐のステートメントは存在しない(switch〜case文など)。

同様の処理はディクショナリやリストのインデクシングで行う。

>>> choice = 'ham'
>>> print {'spam' : 1.25
...            'ham' :   1.99
...            'eggs' :   0.99
...            'bacon' : 1.10}[choice]
1.99

ディクショナリに適切なキーが存在しないケースに対処するには、has_key メソッド、get メソッド、try ステートメントを使う、等の方法がある。


•ブロックの区切り

  • ブロックの区切りがインデントによって表現される。(インデントが同じになっているステートメントは全て同一のブロックと判定される)

Python のブール演算

  • ブール演算子は and, or, not
  • True, False は 1, 0 のカスタマイズ版である
  • or演算の場合、左から評価され最初にTrueと判定されたオペランドのオプジェクトが返される(ショートサーキット評価)
  • and演算の場合、最初にFalse判定された時点で評価が終了する。True判定された場合は最後に判定されたオペランドが返される。
  • 戻り値としては True, False ではなくオペランドに使われているオブジェクトである、という点が C等の言語と違う部分。但し判定は結局 True, False になるので意味は同じ。

三項演算子

if X:
    A = Y
else:
    A = Z

~

# Python 2.5 以上
A = Y if X else Z

# Python 2.5 以下
A = ((X and Y) or Z) # 但し Y が必ず True であるという前提

又は

A = [Z, Y][bool(X)]
↓
>>> ['f', 't'][bool('')]
'f'
>>> ['f', 't'][bool('spam')]
't'

•ブール演算の応用

X = A or B or C or None

最初に True と評価されたオブジェクトを返す。

Python はあらゆるオブジェクトが True, あるいは False と解釈される。

 |