みろりHP


緑色さんの多目的ブログ
みろりえいちぴー
ごゆるりとおくつろぎあさーせ。
<< アニバーサリ絵 | main | ダークソウル2 忘れられた罪人まで >>
| カテゴリ:プログラミング |
Brett Slatkin『Effective Python』その2 関数



前回に続いて、関数のパートで楽しめたとこをノートしていく。



関数返り値にNoneを設定するのはヤメて、例外を飛ばせ。
try:
    return a/b
except ZeroDivisionError as e:
    raise ValueError('えらぁだよ') from e
てかこうやってエラーの種類を変えられるの知らなかったわ。

Pythonはクロージャをサポートしてる。
クロージャってのは、定義されたスコープの変数を参照する関数のこと。ああ、関数の中から外の変数を使えるもんね。アレのことか。

タプルの比較規則。
(0, b) (1, a)
の場合、まず[0]の0と1、そのつぎに[1]のbとaの比較になる。

nonlocal宣言でローカル変数の参照渡しみたいなことができる。
def foo():
    a = 'fooのa'

    def bar():
        nonlocal a
        a += 'なぁんつって'

    bar()
    print(a)  # fooのaなぁんつって

foo()
こういうことか。aがグローバル変数だった場合 nonlocal じゃなくて global になるところが注意。

リストを作成して返す関数は、もしかしたらジェネレータ関数にできるんじゃない?
やり方は
lis.append(x)
していたところを
yield x
にするだけ。
これはかなりいいのでは? プログラミング問題とかでよくでかいリストを返す関数を作ってたけど、あれは全部エコなジェネレータにできるってことか。

可変長位置引数で見た目をすっきりさせよう。
def foo(message, *args):

こういうやつね!
foo('メッセージ', 1, 2, 3, 4)

って呼び出せば、1以降がリストになって args に代入される。……ん? いや別に、最初からリストで渡せばよくね?
ちなみにすでにリストになってるなら
foo('メッセージ', *list)

って渡せる。いや、最初からリストでよくね???
可変長位置引数を使うとき注意しないといけないことがあって、たとえば上の foo を
foo(message, message2, *args)

に定義変更しても呼出でエラーは起こらない。これは発見困難バグを生むのでやばい。さらに、これにジェネレータを渡すと勝手にタプルにするからメモリ爆発することがある。いやメンドくせーよ! 最初からリストで渡せばいいだろ!

キーワード引数、デフォルト引数は良い。
def foo(message, option1=1, option2=2):
見るからに使い勝手いい。

デフォルト引数には罠がある。
def foo(message, when=datetime.now()):
こうするとwhenのデフォルト値は定義時の時間で固定されちゃう。fooを呼び出すたびにその時間を取得してほしいなら、デフォルト引数Noneを使う。
def foo(message, when=None):
    when = datetime.now() if when is None else when

こんな罠もあるよ♪
def foo(x, dic={}):
    dic[x] = 1
    return dic

print(foo('a'))  # {a:1}
print(foo('b'))  # {a:1, b:1}  クソワロタww
定義時にひとつのディクショナリが定義されちゃってて、以降デフォルト引数にはそのディクショナリオブジェクトが使われ続けるので、こーゆーことになる。これも上と同じで None を使う。

キーワード専用引数。
これはすげぃ。
def foo(a, b, *, option1=False, option2=False):
こうすると、option1以降の引数はキーワードでしか指定できなくなる。完全にオプション専用の引数ができるってことじゃん。
Python2ではこの構文がないのだけど、同じ動作を作ることはできる。
def foo(a, b, **kwargs):
    option1 = kwargs.pop('option1', False)
    option2 = kwargs.pop('option2', False)
    if kwargs:
        raise TypeError('Unexpected **kwargs')




今回のフェイバリットは最後のキーワード専用引数かな。すげえ便利そう。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:- |
スポンサーサイト
| スポンサードリンク | - | - |









    123
45678910
11121314151617
18192021222324
25262728   
<< February 2018 >>
+ みろりHP内検索
+ 閲覧記事
+ 過去記事アーカイブ
+ カテゴリ
+ 年月選択
  • 2018年 02月 (6)
  • 2018年 01月 (8)
  • 2017年 12月 (9)
  • 2017年 11月 (9)
  • 2017年 10月 (4)
  • 2017年 09月 (6)
  • 2017年 08月 (6)
  • 2017年 07月 (8)
  • 2017年 06月 (4)
  • 2017年 05月 (7)
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (9)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2009年 04月 (1)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • 2006年 01月 (21)
  • + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…