任意引数
大方の言語と同じように任意引数を定義できる。任意引数の位置に渡した引数はタプルに変換される。
複数の変数を1つのタプルに変換する操作を、詰める(pack)と言ったりする。
もちろん任意引数の後はキーワード引数しか置けない。
1 2 3 4 5 6 7 |
def concat(*args,sep="/"): return sep.join(args) val=concat('hoge','fuga','hogehoge','fugafuga') print(val) hoge/fuga/hogehoge/fugafuga |
unpack
逆に1つのタプルなりリストを複数の変数にバラすことをunpackと言ったりする。
1 2 3 4 5 6 7 8 9 10 |
hoge = [1,2,3] x,y,z = hoge print(x) print(y) print(z) 1 2 3 |
lambda
大方の言語と同じように無名関数を書ける。lambdaは1行しか書けない。
中では関数になっている。関数が関数外の変数を参照できるのと同様に
lambdaからlambda外の変数を参照できる。
1 2 3 4 5 6 7 8 9 10 11 |
def make_incrementor(n): return lambda x:x+n f = make_incrementor(42) v =f(0) print(v) 42 r =f(10) print(r) 52 |
関数アノテーション
関数の引数、戻り値に付加情報を付けることができる。
PHPのTypeHintingみたいに、引数の型,戻り値の型を書ける。
型として実在しないクラスを指定するとエラーになる。
1 2 3 4 5 6 7 8 9 |
def f(hoge: str, fuga: str = 'fuga') -> str: print("Annotations:", f.__annotations__) print("Arguments:", hoge, fuga) return hoge + ' and ' + fuga f('1','2') Annotations: {'hoge': <class 'str'>, 'fuga': <class 'str'>, 'return': <class 'str'>} Arguments: 1 2 |
コーディングスタイル
Pythonのコーディングスタイル。なんだかその理由がどうでも良い感じ。
やるのであればRubyのように外れたらエラーにするべきだし。
- インデントはスペース4個。タブは使わない。
- 79文字以下で折り返す。
- 関数、クラス、関数内の大きめのブロックを分離するために空白行を使用
- コメントは文末ではなく行として独立すべき
- docstringを使う
- 演算子の周囲やカンマの後ろはスペースをいれる。
- 括弧のすぐ内側にはスペースをいれない。
- 関数名、メソッドはlower_case_with_underscores
- UTF-8を使う。