Pythonの関数(引数の指定方法)
キーワード引数
引数に名前をつけて渡す。順番が関係なくなる。
>>> def hoge(a1, a2, a3): ... print(a1,a2,a3) ... >>> hoge(1,2,3) 1 2 3 >>> hoge(a3=1,a2=2,a1=3) 3 2 1 >>>
引数をまとめて渡す方法
リストの要素を引数で渡す場合(*を付ける)
>>> def hoge(a1, a2, a3): ... print(a1,a2,a3) ... >>> hoge(1,2,3) 1 2 3 >>> a = [5,6,7] >>> hoge(*a) 5 6 7 >>> hoge(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: hoge() missing 2 required positional arguments: 'a2' and 'a3' >>>
hoge(a)で渡すと、リストオブジェクト1つだけが引数扱い。関数側で引数不足になる。
hoge(*a)で渡せば要素が引数となる。
ディクショナリのKey,Valueをキーワード引数で渡す場合(**をつける**)
>>> def hoge(a1, a2, a3): ... print(a1,a2,a3) ... >>> a = {'a1':1, 'a2':2, 'a3':3} >>> hoge(**a) 1 2 3 >>> hoge(*a) a2 a3 a1 >>>
アスタリスク(*)2個の場合はkey,valueがキーワード引数で渡される。
1個の場合は、キーが渡される
デフォルト引数
引数の省略が可能。デフォルト値が利用される。
>>> def hoge(a1,a2,a3=3): ... print(a1,a2,a3) ... >>> hoge(1,2) 1 2 3 >>>
可変長引数
引数の数を事前に決めない方法
タプルで受ける場合(*をつける)
>>> def hoge(a1,*b): ... print(a1,b) ... >>> hoge(1,2,3,4,5) 1 (2, 3, 4, 5) >>>
ディクショナリで受ける場合(**をつける)
>>> def hoge(a1,**b): ... print(a1,b) ... >>> hoge(1,2,3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: hoge() takes 1 positional argument but 3 were given >>> hoge(1,a2=2,a3=3) 1 {'a2': 2, 'a3': 3} >>>
他記述(*だけ)
キーワード引数限定にする
>>> def hoge(a1, *, k1='huga'): ... print(a1,k1) ... >>> hoge(1) 1 huga >>> hoge(1,2) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: hoge() takes 1 positional argument but 2 were given >>> hoge(1,k1=1) 1 1 >>> hoge(1,k2=1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: hoge() got an unexpected keyword argument 'k2' >>>
a1の後に、*を記述すると、以降はキーワード引数以外だと例外発生する指示になる。(上記1つ目の例外)
ただキーワード引数でも、関数側で定義ないキーワードでは受けない。(上記2つ目の例外)
Pythonの内包表記
リスト
>>> a = [ x**2 for x in range(1,11)] >>> a [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] >>>
※rangeの2個目の引数は終了点。range(1,11)1は1〜10
セット
>>> a = { x**2 for x in range(1,11)} >>> a {64, 1, 4, 36, 100, 9, 16, 49, 81, 25} >>>
ディクショナリ
>>> a = {i+1:i**2 for i in range(1,11)} >>> a {2: 1, 3: 4, 4: 9, 5: 16, 6: 25, 7: 36, 8: 49, 9: 64, 10: 81, 11: 100} >>>
ジェネレータ
>>> a = (i**2 for i in range(1,11)) >>> next(a) 1 >>> next(a) 4 >>>
2重ループ
>>> v = [[1,2],[3,4],[5,6]] >>> v [[1, 2], [3, 4], [5, 6]] >>> [i for a in v for i in a] [1, 2, 3, 4, 5, 6] >>>
左のループ(for a in v)が親ループ。ループで書くと以下
>>> v = [[1,2],[3,4],[5,6]] >>> w = list() >>> for a in v: ... for i in a: ... w.append(i) ... >>> w [1, 2, 3, 4, 5, 6] >>>
PythonのオブジェクトID
オブジェクトIDとは?
インタプリタがオブジェクトを管理するID
メモリ上のオブジェクトの場所を示す情報
2つのオブジェクトが同じかは、is で判定可能
id関数で確認できる
>>> a = [1,2] >>> b = [1,2] >>> id(a) 4391089224 >>> id(b) 4391101704 >>> a == b True >>> a is b False >>>
リストは可変。2つのオブジェクトは別ものとして管理。
イミュータブル(不変)なオブジェクトのstringで値が同じ場合は同一のIDとなる。
省メモリ効果がある。
>>> a = 'abc' >>> b = 'abc' >>> id(a) 4389672752 >>> id(b) 4389672752 >>> a == b True >>> a is b True >>>
PythonのNone型
値が存在しないことを表す特別な値
>>> a = ['',None,1,2] >>> a ['', None, 1, 2] >>> a[0] is None False >>> a[1] is None True >>> a[0] '' >>> if a[0]: ... print('test') ... >>> if a[1]: ... print('test') ... >>>
NoneはFalseと判定される
is NoneでNoneであるか判定する。
Pythonのディクショナリ操作
定義方法
>>> a = {'a':1,'b':2} >>> a {'b': 2, 'a': 1} >>> a['c'] = 3 >>> a {'b': 2, 'a': 1, 'c': 3} >>>
キーの存在チェック
>>> a {'b': 2, 'a': 1, 'c': 3} >>> 'a' in a True >>> 'd' in a False >>>
インデックスアクセス時に存在しない場合にデフォルト値を返す
>>> a {'b': 2, 'a': 1, 'c': 3} >>> a['d'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'd' >>> a.get('d') >>> a.get('d','hoge') 'hoge' >>>
getメソッドは引数でデフォルト値を設定できる。引数がない場合は、Noneを返す。
イテレーションアクセス
キーにアクセスする場合
>>> a {'b': 2, 'a': 1, 'c': 3} >>> for k in a: ... print(k) ... b a c >>>
値にアクセスする場合
>>> a {'b': 2, 'a': 1, 'c': 3} >>> for v in a.values(): ... print(v) ... 2 1 3 >>>
両方にアクセスする場合
>>> a {'b': 2, 'a': 1, 'c': 3} >>> for k,v in a.items(): ... print(k,v) ... b 2 a 1 c 3 >>>
データの追加と削除
追加
>>> a {'b': 2, 'a': 1, 'c': 3} >>> a['d'] = 4 >>> a {'b': 2, 'a': 1, 'd': 4, 'c': 3} >>>
定義時と同じ
削除
>>> a {'b': 2, 'a': 1, 'd': 4, 'c': 3} >>> del a['a'] >>> a {'b': 2, 'd': 4, 'c': 3} >>> a.pop('b') 2 >>> a {'d': 4, 'c': 3} >>>
delとpopの違いは、popの場合は値を返す点
存在しないキーを指定してアクセスするとKeyErrorが発生する。
popを使うとKeyErrorは発生させないことが可能。
>>> a {'d': 4, 'c': 3} >>> del a['a'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'a' >>> a.pop('a') Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'a' >>> a.pop('a', 'hoge') 'hoge' >>> a {'d': 4, 'c': 3} >>>
Pythonのセット操作
要素の追加削除
discardは該当要素がなくても例外発生しない
>>> a = {1,2,3,4,5} >>> a.add(6) >>> a {1, 2, 3, 4, 5, 6} >>> a.remove(3) >>> a {1, 2, 4, 5, 6} >>> a.remove(7) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 7 >>> a {1, 2, 4, 5, 6} >>> a.discard(7) >>> a {1, 2, 4, 5, 6} >>> a.discard(1) >>> a {2, 4, 5, 6} >>>
合併
>>> a = {1,2} >>> b = {1,3} >>> c = {1,4} >>> a | b | c {1, 2, 3, 4} >>>
共通要素の抽出
>>> a {1, 2} >>> b {1, 3} >>> c {1, 4} >>> a & b & c {1} >>>
差の抽出
>>> a {1, 2} >>> b {1, 3} >>> c {1, 4} >>> a - b - c {2} >>>
独自要素の抽出
>>> a {1, 2} >>> b {1, 3} >>> c {1, 4} >>> a ^ b {2, 3} >>> a ^ b ^ c {1, 2, 3, 4} >>> a ^ (b | c) {2, 3, 4} >>>
要素の全てを含んでいるか確認
>>> a {1, 2} >>> b {1, 2, 3} >>> c {2, 4} >>> a <= b True >>> a <= c False >>> b >= a True >>> b >= c False >>>