ソフトウェアエンジニアの勉強ログ

興味があるのは、computer vision, three.js, python, 深層学習, emacs

自分用メモ:C,C++経験者がpythonを一から勉強する1

基本事項

  • ブール、整数、float、文字列
  • //は整数の除算
  • **は指数
  • 基数は、0bが2進数、0oが8進、0xが16進
  • 整数型への変換はint()関数で、浮動小数点への変換がfloat()関数、文字列への変換はstr()関数
  • int型はpython3では任意のサイズなので大きさの上限を気にしなくて良い

文字列について

  • 文字列リテラルに関して、”と'の両方を表現したいときに、"""もしくは'''で囲うことができる。さらに、改行文字を入れることができる。
  • +を使った連結
  • *を使って繰り返し
  • []による文字の抽出
  • [start:end:step]による文字の切り出し
  • len関数による文字列の長さ
  • splitとjoin、joinは感覚と使い方が違うので注意が必要
  • strip関数は、デフォルトで空白などを削除する。文字を指定した削除も可能。
  • Cでprintf("%10d", x)などとするが、文字列に対して、str.center(30), str.ljust(30), str.rjust(30)
  • replace関数で文字を書き換える。正規表現は後ほど。数を指定しないと最初の一回のみの置換になってしまう。

リスト、タプル、辞書、集合

リスト

  • ほぼ配列
  • [ ]もしくはlist()で作成
  • array.append(new_elem)で末尾に要素追加
  • extend()関数もしくは+=や+で、リストを連結
  • insertで場所を指定して挿入
  • delで要素を指定した削除。del array[-1]のように使う。
  • removeでmatchする要素を削除
  • popでオフセットして切り出しながら削除
  • index()で要素のオフセットを知る
  • list.index(query, index)で0始まりの順番を指定できる。マイナスも指定できる
  • inで有無のテスト、countで個数を数える
  • copyの方法は、list.copy(), list(list), list[:]
    • copyのリスト関数はpython3からのようだ

タプル

  • 要するに、定数リストで初期化したら変更不可
  • ()
  • タプルのアンパック
    • そもそも、pthyonは、a,b,c = 1,2,3のような記述ができる
  • tupple(list)関数でタプルを作れる

辞書

  • 要するにstd::mapに近い
  • {}
  • dict()汎用関数を使って、タプルやリストを辞書にできる
  • [key]による追加、アクセス
  • get関数でアクセスできる。無い場合はNoneが返ってくる。C++のatと挙動が異なるので要注意。
  • update()辞書関数によって、辞書の結合ができる。
  • del ditct[key], dict.clear(), key in dictが使える
    • joinといいちょっと気になるが仕方がない
  • keys(), values, items()
    • 全て参照用の特殊な型(dict_keysなど)になるので注意

集合

  • 初期化にはset()関数を使う。
    • リストやタプル、辞書(キー)を使える
  • 集合演算を使えるのが良さそう。
演算子 意味
& 積集合
| 和集合
- 差集合
^ 排他的OR
<= 部分集合チェック
>= 上位集合チェック
> 真上位集合チェック

コードの書き方

  • \によって行を継続できる。逆にいうと、1行に意味がある。
  • ネストする場合は、:を使う?
  • if, elif, else
  • while
    • whileの弟にelseを用意すると、breakが呼ばれなかった場合の処理を記述できる
  • for文
    • for letter in wordやfor item dict.items()のように使う
    • for文に対してもelseが使える
    • zip()を使えば、複数のシーケンスを並列的に反復処理を行えるし、それ以外にもlist(zip(list1, list2))みたいなことができる
    • range()関数は便利なので使いこなせたほうが良い
  • リスト内包
    • 結構なれない感じ
    • [expression for item in iterable]
    • [expression for item in iterable if conidtion]
    • [[val1, val2] for val1 in hoge for val2 in fuga]
  • 辞書内包や集合内包もある

  • 関数

    • 関数の定義にはdefを使う
    • 位置引数でも良いし、キーワード引数でも良い
    • デフォルト引数もできるが、実行時ではなく、「定義」されたときであることに注意
    • 以下のように返り値を複数持てる
def func2():
    return 1, 2, 3
a, b, c = func2()
  • *によって位置引数をタプル化して渡せる
  • **によって、キーワード引数を辞書化できる
  • 関数の戦闘にそのまま文字列をいれれば、関数の説明を入れられるらしい。これは良い。docstringというらしい。
  • 関数もオブジェクトなので、引数に渡せる。コールバックみたいなことがすぐにできる。
  • 関数の中に関数を定義できる(関数内関数)
  • 関数内関数はクロージャーとして機能する
  • ラムダ関数
    • lambda args : contentesで書く、直接関数オブジェクトとして渡すときに使うのだろう
  • ジェネレータ関数
    • 書くときは、returnの代わりにyieldを書く
    • 呼ばれる毎に最後にyieldした続きから始まる。
    • 記述の最後までいったら何も返さなくなって終わるということ
    • 馴染みはないがかなり面白い考え方で、巨大なシーケンスを扱えるようになる
    • ジェネレータ関数はvar in generatorになって初めて評価される
  • デコレータ
    • 関数を装飾するイメージ
    • 関数をラッピングする関数を用意する
    • ラッピングしたい対象の関数の上に@を使った記述をする(マクロみたい)
def doc_func(func):
  def new_function(*args, **kwargs):
    result = func(*args, **kwargs)
    print("result:", result)
    return result 

@doc_func
def my_func1(....)..
* さらに関数に対するデコレータは複数持てるらしい
  • 名前空間
    • 基本的にローカルからグローバル変数の変更は許容していない
      • 代入から始まる処理が書かれると同じ変数名であって、別の変数として扱われる
      • ただし、グローバルへのアクセスは普通にできる
        • グローバル変数にアクセスしたあとに代入しようとすると、グローバルへの代入とみなしエラーが起きる
    • global variableと宣言することで、代入雨も行えるようになる
    • 名前空間の状態をデバッグしたかったら、globals()とlocals()という関数があってチェックできる
  • 変数名について
    • 予約後は使ってはだめ、から始まりで終わる単語も予約語
  • try, except
    • C++ではtry,catchだった処理が、try, exceptとしてそれぞれのブロックで処理を行う
      • C++では、throwでエラーを出力するが、pythonではraiseのようだ
      • もちろん、独自のException型を用意することもできる