~Pythonistaより愛をこめて贈るPython入門者のためのTips③~

  • 5
    いいね
  • 0
    コメント

はじめに

この記事は Python Advent Calendar 2016 の25日目の記事です。
恐れ多くも最終日!!

はじめに②

普段は Liaro という会社で代表をやりつつエンジニアとしてはサーバーサイドを主に書いてます。
昔書いた Tips② の続きですが、色々追われていて前ほど分量がありませんがご了承下さい。
曖昧な知識で書いている部分も多いと思うのでツッコミよろしくお願い致します!

map,filter,reduce,lambdaというフォース

他の言語でもありますが、Pythonにもmap/filter/reduceがあり無名関数(ラムダ式)のlambdaに用意されています。
※reduceに関しては、3系では明示的にimportしなければ使えなくなりました。

Python3.5.2
>>> f = lambda x:x**2
>>> f(3)
9
>>> 
>>> a = [i for i in range(10)]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = map(lambda x:x*x, a)
>>> b = map(lambda x:x*x, a)
>>> for i in b:
...     print(i)
... 
0
1
4
9
16
25
36
49
64
81
>>> c = filter(lambda x:x%2==0, a)
>>> for i in c:
...     print(i)
... 
0
2
4
6
8
>>> from functools import reduce #reduceをimport
>>> d = reduce(lambda x,y:x+y, a)
>>> d
45
>>> 

デコレータ

Pythonにはデコレータという機能がありまして、メソッド名の上に@hogeみたいな感じでメソッドを拡張できます(こちらが詳しいです)。
リンク先の例が良くて、それ以外あまり思いつかず似たものになってしまいますが、
fooという関数を拡張する際に以下のように書いたとします。

Python3.5.2
>>> def foo(x, y):
...     return x ** y
... 
>>>
>>> def hoge(func): 
...     def inner(x, y):
...         if x == y == 0:
...             return "不定"
...         return func(x, y)
...     return inner
... 
>>>
>>> foo = hoge(foo)

それがPythonでは @ 記号を用いて以下の用に書き換えることが出来る。

Python3.5.2
>>> @hoge
... def foo(x, y):
...     return x ** y
... 
>>>

例えば、クラス内のメソッドは基本的にインスタンスメソッドですが @classmethod と書くとクラスメソッドになったり @staticmethod と書くとスタティックメソッドになったりします。

関数のデフォルト値について

以前のTipsで基本的な関数での引数の扱いは書いたのですがいくつか注意点を書いてなかったのでここに書きたいと思います。

Python3.5.2
>>> def foo(x, y):
...     return x ** y
... 
>>> foo(y=5, x=2) # 引数は順序より名前の一致が優先される
32
>>> 
>>> def hoge(a=[]):
...     a.append(1)
...     return a
...
>>> b = hoge()
>>> print(b)
[1]
>>> b = hoge()
>>> print(b) # デフォルト値は呼び出し時に毎回生成されるのではない
[1, 1]

pycodestyleという経典

これはPythonのコーディング規約のことです。Pythonでは言語で推奨のコーディング規約があり多くのPythonユーザーがこれに従っていると思います。
以前はPEP8と呼ばれていましたが変更されました。
ただ、いきなり英語辛いなって人はPEP8でググって出てきたので基本的には問題ないです(PEP8)
いくつか列挙すると
・インデントはスペース4文字
・1行の長さは基本的には79文字
・変数や関数は小文字(スネーク)、クラス名はキャメルで書く
・importは行を分ける
などなどです。一度読んでみるといいかと思います!

最後に

とても内容が薄いですが…また続編書きたいな…
それでは Merry Xmas!! & 良いお年を〜〜!!!!!!!

Tips①はこちら
Tips②はこちら