Python制御構造2

任意引数

大方の言語と同じように任意引数を定義できる。任意引数の位置に渡した引数はタプルに変換される。
複数の変数を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を使う。