==言語まとめ Python==
[[Python][言語 まとめ][Python サンプルコード][Python 標準ライブラリ概観]]
{{amazon|4873113407}}
{{amazon|4873113938}}
===対話モード===
====プロンプト====
>>>>>>
====継続行====
...
====最後に印字された式は変数 _ に代入される====
>>> >>> 2+2
4
>>> >>> _
4
===HELP===
*[Python help関数の使い方] [help関数の使い方]
====例====
>>>>>>help(os) >>>>>>help('string')
[[File:0055_pyhelp01.jpg]]
===デバッガ===
>>> >>> def readfile(f):
fp = open(f,'r')
for l in fp:
print l
>>> >>> import pdb >>> >>> pdb.run("readfile(r'/home/piroto/test.txt')") > <> <string>>(1)<<module>>()->>None
(Pdb) step
--Call--
> <> <pyshell#50>>(1)readfile()
(Pdb) args
f = /home/piroto/test.txt
[GCC 4.1.1 20061011 (Red Hat 4.1.1-30)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> print "hello python"
hello python
>>> >>>
===Pythonスクリプトの実行===
=====env [http://ja.wikipedia.org/wiki/Env Wikipediaより]=====
<<blockquote>>この例では、/usr/bin/env は env コマンドのフルパスである。環境は変わらない。この場合、python インタプリタのフルパスを与えることでもインタプリタを指定できる。この方法の問題は異なるコンピュータシステム上では、パスが異なるかもしれないということである。この例のように代わりに env を使うことで、スクリプトの実行時にインタプリタが検索され場所が特定される。これによりスクリプトがより移植性の高いものとなる。しかし、実行可能ファイルの検索パスにあるすべてのディレクトリの中からマッチするのが検索されるので、違うインタプリタが選択される危険性が高くなる。<</blockquote>>
=====coding=====
<<blockquote>>ASCII 形式でない文字コードのエンコーディングをソースコードファイル中で使う最良の方法は、 #! 行の直後に一行かそれ以上の特殊なコメントを挿入して、ソースファイルのエンコードを指定する<</blockquote>>
# -*- coding: {エンコーディング} -*-
====実行====
上記4つを連結したものが、sys.path となる
>>> >>> import sys >>> >>> sys.path
['', 'C:\\Windows\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26\\lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python26', 'C:\\Python26\\lib\\site-packages']
====利用可能なモジュールの一覧====
>>> >>> help('modules')
Please wait a moment while I gather a list of all available modules...
*同じブロックに属するコードではインデントの仕方を統一する必要がある
*括弧、文末のセミコロンは基本的に不要(あっても動作はする)
>>> >>> x = 1 >>> >>> y = 2 >>> >>> if x > > y:
... print x
... else:
=====1行に複数のステートメントを記述=====
*セミコロンを利用すると、複合ステートメント以外は1行に書ける
>>> >>> l = [1, 2] >>> >>> if l:
... l[0] = 3; l[1] = 4
...
>>> >>> l
[3, 4]
=====1ステートメントを複数行にまたがらせる=====
*リストやディクショナリ、タプルの場合、括弧が閉じるまでは1ステートメントとみなされるため、途中で改行してもよい
>>> >>> l = [1,
... 2,
... 3]
>>> >>> l
[1, 2, 3]
*バックスラッシュで行継続が可能(現在非推奨)
>>> >>> x = 1 + 2 + 3 + \
... 4 + 5 + 6
>>> >>> x
21
====ステートメント一覧====
http://www.python.jp/doc/release/ref/encodings.html
*最初の行か、二行目に以下のようなコメント
# -*- coding: <<encoding-name> > -*-
===行の継続===
====明示的====
def finally in print
===代入ステートメント===
>>> >>> x = 1 # 基本形 >>> >>> a, b, c = 'a', 'b', 'c' # タプル代入 >>> >>> [d, e] = ['d', 'e'] # リスト代入 >>> >>> f, g, h = 'fgh' # シーケンス代入 >>> >>> i = j = 'ij' # マルチターゲット >>> >>> j += 'k' # 拡張代入
*上記例では、変数 a ~ h までは、どれも対応する 'a' ~ 'h' が代入される。
===def===
====関数定義は def で行う====
>>> >>> def max(i, j): ... if i > > j:
... return i
... else:
... return j
...
>>> >>> print max(10,99)
99
===docstring===
====関数本体の最初の文として文字列リテラルを利用することにより、関数の説明を行う====
>>> >>> def max(i, j):
... """ return max value. """
... if i > > j:
... return i
... else:
... return j
...
>>> >>> help(max)
Help on function max in module __main__:
===引数===
====引数のデフォルト====
>>> >>> def greet(msg='hello'):
... print '%s world.' % (msg)
...
>>> >>> greet()
hello world.
>>> >>> greet('good bye')
good bye world.
====名前つき引数====
>>> >>> def profile(name='secret', age='secret'):
... print 'name: %s, age: %s' % (name, age)
...
>>> >>> profile(age='37')
name: secret, age: 37
>>> >>> profile('Yagi')
name: Yagi, age: secret
====名前つき引数をディクショナリとして受け取る====
*最後の仮引数が、**引数名 となっていると、名前つき引数をディクショナリとして受け取る
>>> >>> def profile(**prof):
... print 'name: %s, age: %s' % (prof['name'], prof['age'])
...
>>> >>> profile(name='Yagi',age='37')
name: Yagi, age: 37
====ディクショナリを展開して名前つき引数として渡す====
*ディクショナリを**をつけて関数に渡すと、名前つき引数に展開される
>>> >>> profile(name='Yagi',age='37')
name: Yagi, age: 37
>>> >>> def profile(name, age):
... print 'name: %s, age:%s' % (name, age)
...
>>> >>> prof = {'name':'Yagi','age':'37'} >>> >>> profile(**prof)
name: Yagi, age:37
====タプルやリストを展開して引数として渡す====
>>> >>> parm = (5, 0, -1) >>> >>> for i in range(*parm):
... print i
...
1
====可変引数====
>>> >>> def var_prms( *prms ):
... for p in prms:
... print p
...
>>> >>> var_prms('a', 'b', 1, 2)
a
b
*このような引数はタプルとして引き渡される
>>> >>> def var_prms2( *prms ):
... print prms
...
>>> >>> var_prms2('a', 'b', 1, 2)
('a', 'b', 1, 2)
====引数の型チェック====
>>> >>> def test(word):
assert isinstance(word, basestring),"word must be string"
print word
>>> >>> test("abc")
abc
>>> >>> test(123)
Traceback (most recent call last):
File "<<pyshell#15>>", line 1, in <<module>>
test(123)
File "<<pyshell#13>>", line 2, in test
assert isinstance(word, basestring),"word must be string"
AssertionError: word must be string
====関数を引数として渡す====
>>> >>> def test(func,data):
print func(data)
>>> >>> test(len,range(10))
10
>>> >>> test(sum,range(10))
45
=====lambda式を渡す=====
>>> >>> test(lambda n : n * n, 5)
25
===無名関数 lambda (ラムダ)式===
[[Scheme]]
*定義と使用が1文で済む、無名関数を書くことができる
>>> >>> inc = lambda x : x + 1 >>> >>> x = 0 >>> >>> while x < < 5:
... print x
... x = inc(x)
yield x
x += 1
if x > > e:
raise StopIteration
*filter は要素から関数の結果がTrueとなる値を抽出
=====奇数を返すフィルタ=====
>>> >>> def odd(x):
... return (x % 2) != 0
...
>>> >>> l = range(10) >>> >>> filter(odd,l)
[1, 3, 5, 7, 9]
====map関数を使う====
*map 要素を関数に渡した戻値からなるリストを返す
>>> >>> def suqare(x):
... return x * x
...
>>> >>> l = range(10) >>> >>> map(suqare, l)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> >>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
*式、for 節、後ろに続くゼロ個かそれ以上の for 節または if 節からなる
=====小文字のリストを大文字のリストに変換=====
>>> >>> items = ['aaa', 'bbb', 'ccc'] >>> >>> [item.upper() for item in items]
['AAA', 'BBB', 'CCC']
=====数値のリストを自乗のリストに変換=====
>>> >>> n = [1, 2, 3, 4, 5] >>> >>> [ x * x for x in n ]
[1, 4, 9, 16, 25]
=====条件に合う辞書を作成する=====
>>> >>> m = {'a':1,'b':2,'c':1,'d':2} >>> >>> m2 = dict([(k, v) for k, v in m.iteritems() if v == 1]) >>> >>> m2
{'a': 1, 'c': 1}
==ビルトイン型==
===n進数===
====16進数====
>>> >>> 0xff
255
>>> >>> hex(255)
'0xff'
====8進数====
>>> >>> 010
8
>>> >>> oct(8)
'010'
====文字列数値変換====
>>> >>> int('11111111',2)
255
>>> >>> int('0xff',16)
255
==演算子==
!備考
|-
|< <
|小なり
|
|-
|<<=
|小なりイコール
|
|-
|>>
|大なり
|
|-
|>>=
|大なりイコール
|
|推奨
|-
|<><>
|等号否定
|時代遅れ
=====オブジェクト比較の例=====
>>> >>> l1 = [1, 2, 3] >>> >>> l2 = l1 # リファレンスをコピーするため、l2 は l1 と同一オブジェクトを参照 >>> >>> l3 = l1.copy() # 内容をコピーするため、l3 は l1 と内容は同一の別オブジェクトとなる >>> >>> l3 = l1[:] >>> >>> l1 == l2 # 内容は同一
True
>>> >>> l1 == l3 # 内容は同一
True
>>> >>> l1 is l2 # 実体も同一
True
>>> >>> l1 is l3 # 実体は別
False
=====大きさを比較する式を複数組み合わせることができる=====
>>> >>> x, y, z = 1 ,2 ,3 >>> >>> x < < y < < z
True
===論理演算子===
===エスケープ(\n:改行文字)と継続(\で文の継続)===
>>> >>> m = "m1\n\
... m2\n\
... m3"
>>> >>> print m
m1
m2
===raw文字列===
*文字列リテラルを ``raw'' 文字列にすると、\n のようなエスケープシーケンスは改行に変換されません
>>> >>> m = r"hello\nworld" >>> >>> print m
hello\nworld
===ヒアドキュメント===
*対になった三重クォート """ または ''' で文字列を囲むこともできます。三重クォートを使っているときには、行末をエスケープする必要はありません、しかし、行末の改行文字も文字列に含まれることになります。
>>> >>> print """line1
... line2
... line3"""
===文字列の連結(+)、反復(*)===
*文字列は + 演算子で連結させる (くっつけて一つにする) ことができ、 * 演算子で反復させることができます。
>>> >>> msg1 = "a" >>> >>> msg2 = "b" >>> >>> print msg1 + (msg2 * 3)
abbb
===セパレータで文字列を結合 : join()メソッド===
>>> >>> l = ['f1', 'f2', 'f3'] >>> >>> m = ','.join(l) >>> >>> m
'f1,f2,f3'
====インデクス表記====
*文字列は添字表記 (インデクス表記) することができます
>>> >>> msg1 = "abcde" >>> >>> print msg1[2]
c
====スライス表記====
*部分文字列を スライス表記: コロンで区切られた二つのインデクスで指定することができます。
>>> >>> num1 = "12345" >>> >>> print num1[1:3]
23
*インデクスを負の数にして、右から数える
>>> >>> msg = "012345" >>> >>> msg[-1] # 右端
'5'
>>> >>> msg[-2] # 右端から2桁目
'4'
>>> >>> msg[-2:] # 右端から2桁目以降
'45'
>>> >>> msg[:-2] # 右端から2桁目まで
'0123'
===文字列長 : len()関数===
*組込み関数 len() は文字列の長さを返す
>>> >>> len(msg)
6
===ユニコード===
*Unicode オブジェクトを利用
>>> >>> msg = u"矢木" >>> >>> msg
u'\u77e2\u6728'
>>> >>> print msg
矢木
===pass===
*passはなにもしない。構造的に文が必要な場合に、何もする必要がない場合
>>> >>> v = None >>> >>> if v == None:
... pass
... else:
===if...elif...else===
x = int(raw_input("please input int:"))
if x < < 0:
print "negative"
elif x == 0:
*空ではない文字列やリストは、真と評価される
>>> >>> l = ['','abc'] >>> >>> if l:
print 'list is not empty'
list is not empty
>>> >>> for i in l:
if i:
print 'item[%s] is not empty' % (i)
===for===
Pythonでは、forは、コレクションのイテレーターとして使う
>>> >>> alp = ['a','b','c','d'] >>> >>> for a in alp:
... print a
...
====指定回数繰り返す : range()関数====
>>> >>> print range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> >>> for i in range(10):
... print i
...
range([start,] stop[, step])
>>> >>> for i in range(9, 0, -1):
... print i
...
====インデックスと要素を同時に取得 : enumerate()関数====
=====リストで使う=====
>>> >>> itms = ['a','b','c'] >>> >>> for i, v in enumerate(itms):
... print '%d:%s' % (i, v)
...
=====辞書の場合=====
*iteritems() メソッドを使うと、キーとそれに対応する値を同時に取り出せる
>>> >>> m = {'a':1,'b':2,'c':1,'d':2} >>> >>> for k, v in m.iteritems():
... print '%s,%s' % (k, v)
...
d,2
====要素を組で取得 : zip()関数====
>>> >>> l1 = ['a','b','c'] >>> >>> l2 = ['1','2','3','4'] >>> >>> for v1, v2 in zip(l1, l2):
... print '%s:%s' % (v1, v2)
...
c:3
===while===
>>> >>> while i < < 10:
... print i
... i += 1
===break===
>>> >>> for i in range(10):
... if i == 3:
... break;
===continue===
>>> >>> for i in range(10):
... if i % 2 == 0:
... continue
===else(繰り返しでの) ===
====リスト終了時に呼び出される====
>>> >>> for i in range(3):
... print i
... else:
finished loop by range
====breakでの終了では__呼び出されない__====
>>> >>> for i in range(3):
... if i == 1:
... break
*要素をすべて同じ型にする必要はない
=====インデックス、スライス、連結なども可能=====
>>> >>> lst = ['a', 'b', 3, 4] >>> >>> lst
['a', 'b', 3, 4]
>>> >>> lst[0]
'a'
>>> >>> lst[-2]
3
>>> >>> lst[1:3]
['b', 3]
=====代入、スライスに対する代入も可能=====
>>> >>> lst[1:3] = ['c'] >>> >>> lst
['a', 'c', 4]
=====リストのリスト=====
>>> >>> lst[1] = [1,2,3] >>> >>> lst
['a', [1, 2, 3], 4]
|-
|}
>>> >>> l = ['a', 'b', 'c'] >>> >>> l.append('d') >>> >>> l
['a', 'b', 'c', 'd']
>>> >>> l2 = ['e','f','g'] >>> >>> l.extend(l2) >>> >>> l
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> >>> l.insert(2,'b') >>> >>> l
['a', 'b', 'b', 'c', 'd', 'e', 'f', 'g']
>>> >>> l.remove('b') >>> >>> l
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> >>> l.pop()
'g'
>>> >>> l
['a', 'b', 'c', 'd', 'e', 'f']
>>> >>> l.index('b')
1
>>> >>> l.count('c')
1
>>> >>> l.reverse() >>> >>> l
['f', 'e', 'd', 'c', 'b', 'a']
>>> >>> l.sort() >>> >>> l
['a', 'b', 'c', 'd', 'e', 'f']
====リストをスタックとして利用する====
>>> >>> stack = [] >>> >>> for i in range(5):
... stack.append(i)
...
>>> >>> for i in range(5):
... print stack.pop()
...
====リストをキューとして利用する====
>>> >>> que = [] >>> >>> for i in range(5):
... que.append(i)
...
>>> >>> for i in range(5):
... print que.pop(0)
...
def comparator(x, y):
if x == y: return 0
if x < < y: return -1
return 1
====リストを連結して文字列を作成====
>>> >>> l = ['hello','python','world'] >>> >>> ' '.join(l)
'hello python world'
====リストに含まれる値のインデックスを得る====
>>> >>> l = ['a','b','c','c'] >>> >>> l.index('c')
2
===シーケンスに対する反復処理===
====スライスで部分削除====
*Python スライス表記
>>> >>> l = range(10) >>> >>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> >>> del l[1:9] >>> >>> l
[0, 9]
====全要素を削除====
>>> >>> del l[:] >>> >>> l
[]
====リスト自体を削除====
>>> >>> del l >>> >>> l
Traceback (most recent call last):
File "<<stdin>>", line 1, in <<module>>
NameError: name 'l' is not defined
==例外==
===例===
====try / except====
>>> >>> l = [0,1,2] >>> >>> try:
... print l[3]
... except IndexError as e:
====raise====
>>> >>> class Bad:
... pass
...
>>> >>> try:
... raise Bad()
... except Bad:
*else は例外が発生しなかった場合のみ実行される
*finally は例外の有無にかかわらず実行される
>>> >>> l = [0,1,2] >>> >>> try:
... print l[1]
... except IndexError: