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