Hatena::Groupfukuoka-py

taketin.py RSSフィード

 | 

2011-12-10

初めてのPython 13章 whileループとforループ 14章 Pythonのドキュメント

01:06 | 初めてのPython 13章 whileループとforループ 14章 Pythonのドキュメント - taketin.py を含むブックマーク はてなブックマーク - 初めてのPython 13章 whileループとforループ 14章 Pythonのドキュメント - taketin.py

13章 whileループとforループ

・while ループ

while <条件>:
    <ステートメント>
else:
    <ステートメント2>

else ブロックはオプションであり、breakで処理が終了した場合は実行されない


・break, continue, pass ステートメントと else ブロック

  • break
    • ステートメントが直接属するループを無条件で抜ける
  • continue
    • ステートメントが直接属するループの先頭(見出し行)に無条件で戻る
  • pass
  • else
    • 見出し行に指定された条件が満たされなくなり、ループが終了する際に実行される。break ステートメントによってループが終了される場合には実行されない

・for ループ

for ループはシーケンスオブジェクトなら何にでも使用できる

for <target> in <object>:
    <statements>
else:
    <statements>

処理対象のオブジェクトと代入ターゲットを指定し、その後繰り返し処理に対応するステートメントを書く

  • 代入ターゲットは通常 for ステートメントと同じ名前空間に属する変数として扱われる
  • ループ終了後も最後に代入された要素へのリファレンスを保持し続ける

アンパック代入

>>> T = [(1, 2), (3, 4), (5, 6)]
>>> for (a, b) in T:
…        print a, b
…
1 2
3 4
5 6

ファイルを対象とした反復処理

>>> f = open('script.py')
>>> f.readline()

# 現在はこれに良く似た機能を持つ next() というメソッドが用意されている
# readline との違いはファイルの末尾に到達した時に空文字列を返さず、
# StopIteration というビルトイン例外を発生させる点

>>> f = open('script.py')
>>> f.next()

# 更に現在のPythonはファイル内容を1行づつ読み込む際、読み込みメソッドを呼び出す必要が無い
# この方法は3つのメリットがある。コードがシンプル、実行速度が上がる、メモリ節約。
>>> for line in open('script.py'): # next() が自動的に呼ばれるprint line,

他のオブジェクトへの反復処理

  • for ループは内部動作として、処理対象のオブジェクト引数として iter() というビルトイン関数を呼び出している。これを明示的に書く事で for ループを記述せずにイテレーション処理をする事ができる。
>>> L = [1, 2, 3]
>>> I = iter(L)
>>> I.next()
1
>>> I.next()
2
>>> I.next()
3

特殊な forループ

  • range() を使う
>>> for i in range(3):
…        print i,
0
1
2

# シーケンスに対して変則的なアクセス
>>> S = 'abcdefghijk'
>>> range(0, len(S), 2)
[0, 2, 4, 6, 8, 10]

>>> for i in range(0, len(S), 2): print S[i],
a c e g i k

しかし実はスライシングでもっと効率良く書ける

>>> for x in S[::2]: print x

シーケンスを更新する forループ

>>> L = [1, 2, 3, 4, 5]
>>> for i in range(len(L)):
…        L[i] += 1
...
>>> L
[2, 3, 4, 5, 6]

通常の forループだと代入された変数の方を更新してしまうので、インデックスを使ってオリジナルの値を変更するようにする。


zip関数の利用

>>> L1 = [1, 2, 3, 4]
>>> L2 = [5, 6, 7, 8]
>>> zip(L1, L2)
>>> for (x, y) in zip(L1, L2):
…        print x, y, '--', x+y
…
1 5 -- 6
2 6 -- 8
3 7 -- 10
4 8 -- 12

zip関数を使ったディクショナリの生成と dict関数

>>> keys = ['spam', 'eggs', 'toast']
>>> vals = [1, 3, 5]
>>> zip(keys, vals)
[('spam', 1), ('eggs', 3), ('toast', 5)]

>>> D = {}
>>> for (k, v) in zip(keys, gals): D[k] = v
…
>>> D
{'toast':5, 'eggs':3, 'spam':1}

# dict関数を使えば forループを使用せずに同じ事ができる
>>> D2 = dict(zip(keys, vals))
>>> D2
{'toast':5, 'eggs':3, 'spam':1}

dict は正確には「ディクショナリオブジェクトコンストラクタ」である。


enumerate関数

>>> S = 'spam'
>>> for (offset, item) in enumerate(S):
…        print item, 'appears at offset', offset
…
s appears at offset 0
p appears at offset 1
a appears at offset 2
m appears at offset 3

enumerate関数はジェネレータと呼ばれるオブジェクトを返す。これは反復処理に対応したオブジェクトであり、nextメソッドを持っている為、イテレート処理を行える。


・リスト内包表記

# range() を使った記法
>>> L = [1, 2, 3, 4, 5]
>>> for i in range(len(L)):
…        L[i] += 10
…
>>> L
[11, 12, 13, 14, 15]

# リスト内包表記で書き直す
>>> L = [x +10 for x in L]
>>> L
[21, 22, 23, 24, 25]

リスト内包表記でしかできない事といのは無いが、以下のメリットがある。


ファイルに対してのリスト内包表記

>>> lines = [line.rstrip() for line in open('huge.py')]
>>> lines
['import sys', 'print sys.path', 'x = 2', 'print 2 ** 33']

リスト内包表記の拡張構文

# 先頭が p の行だけ取り出す
>>> lines = [line.rstrip() for line in open('hoge.py') if line[0] == 'p']
>>> lines
['print sys.path', 'print 2 ** 33']

# ループのネスト
>>> [x + y for x in 'abc' for y in 'lmn']
['al', 'am', 'an', 'bl', 'bm', 'bn', 'cl', 'cm', 'cn']

14章 Pythonのドキュメント

Python のドキュメントの種類

#プログラム中のコメント
dir関数引数に渡したオブジェクトの属性リストを返す
ドキュメンテーション文字列:__doc__コメント同様、プログラム中に組み込む
PyDoc:help関数テキストベースでドキュメントを表示する
PyDoc:GUIインターフェースWebブラウザにドキュメント表示
標準マニュアルセットPythonやツールセットに関する標準マニュアル
Webサイトオンラインチュートリアルリファレンスなど
書籍市販されている紙媒体の書籍

ドキュメンテーション文字列:__doc__


PyDoc:help関数


ステートメントについてのまとめ

  • コロンを忘れない
  • トップレベルのコードは字下げしない
  • 対話型コマンドラインでは空白行が意味を持つ
  • 字下げに一貫性を持たせる
  • C と混同しない(カッコやセミコロン
  • できる限り whileやrange()は使わず、単純なforループを使う
  • 可変性を持つオブジェクトの代入に注意する
  • オブジェクトの上書きを行う関数は値を戻さない
  • 関数を呼び出す際には必ずカッコを使用する
  • インポート、リロードの際には拡張子やパスは使用しない

ゲスト



トラックバック - http://fukuoka-py.g.hatena.ne.jp/tksthdnr/20111210
 |