Python 習得中 – その5
業務が始まったこともあり、間が空いてしまいました。余談ですが、業務でもすでに段階的に Python を使い始めておりまして、 selenium と BeautifulSoup を使って Web スクレイピングでクローリングする script kiddy な感じのツールをメンテする準備を進めたりしています。
「入門Python3」は電子版を購入したのですが、 O’reilly の電子書籍は一度購入してしまえば O’reilly のサイトからいつでもどこでもダウンロードできます。閲覧規制が若干厳しい職場の環境でもダウンロードできたので何気に便利で快適です^^。
今回は 4章の 4.6節から。手元ではすでに 8章の途中ぐらいまで概ね読み終わっているのですが、今回は 4章までの内容について記述します。
内包表記
Python をして、もっともスクリプト言語らしい機能のひとつであるように思います。ザ・構文糖衣。
number_list = [n for n in range(0, 10)]
ちなみにこれ、Perl で書くとこうなります。
@number_list = (0..9)
他の LL を学べば学ぶほど、 Perl が如何にスクリプト然としているかがよく分かるという一例です…。
なお、 Python は range
にしてもスライスにしても、終端値は含まれないことに注意する必要があります。
range
自体にも step が指定できますが、内包表記の後ろに if
文を入れることでデータに含める値の条件を指定することもできます。下は凡庸な例ですが、既存のリストから条件を指定して値を抽出したいケースは多々あります。
even_list = [num for num in range(0, 6) if num % 2 == 0] # 0, 2, 4
C# の Linq みたいなことをやりたい場合はジェネレータ内包表記でいろいろとできそうです… (例が思いつかないですが
可変長引数
で始まる仮引数は位置引数のタプル、*
で始まる仮引数はキーワード引数の辞書になる、というもの。**
python の性質として面白いなと思うのは、位置引数とキーワード引数がこの仕組みによって完全に分離しうるということ。キーワード引数として指定しないと有効にならないパラメータ、なんてのも書こうと思えば書けてしまえるわけです。実際使うかは別として。
ラムダ
lambda a, b: b - a
のような構文で書けるみたいです。 (ソートの比較条件を指定する場面ってあるのかしら…?)
ジェネレータ
C# でいうところの IEnumerable
みたいなもんですね。 yield
キーワードは他の言語でもよく使われていてまぁまぁありふれた存在となりつつあります…。
デコレータ
可変長引数が最も活躍するやつです。 C# の Attribute みたいなもんですかね。
スコープと global
宣言
関数内で変数を使用する際、同じ名前の変数がすでにグローバル名前空間に存在するときの挙動が、最初に値を代入するのか、値を参照するのかで変わるという、実に気持ち悪い内容に困惑するなど。
グローバル変数にアクセスしたい場合は global
宣言を使え、はいいんですが、関数内で閉じたスコープで使いたい場合に特別な宣言が必要ないというのがどうにもしっくりこないですね。
例外
…については、 catch
ではなく except
であることと、 throw
ではなく raise
であること以外は普通だと思います。
2017 年 3 月 22 日 by 村山 俊之