タグ

ブックマーク / jutememo.blogspot.com (20)

  • レキシカルスコープとダイナミックスコープ

    1. レキシカルスコープとダイナミックスコープの違い 言語によって、変数のスコープに関する仕様が異なる。スコープには、レキシカルスコープとダイナミックスコープがある。採用しているスコープにより、変数の参照の仕方が違う。 レキシカルスコープでは、プログラムとして書かれた字句を解析すれば、変数のスコープを把握できる。実行時のことは考えなくて良い。これに対して、ダイナミックスコープでは、実行時における関数の呼び出され方により、参照できる変数が異なる。 用語の説明を見る前に、具体例を見た方が理解しやすい。 Scope (computer science) - Wikipedia の Lexical scoping and dynamic scoping によると、 … if function f invokes a separately-defined function g, then under

  • Python の map, filter, reduce とリスト内包表記

    1. リストを操作する関数で重要なのはどれ? リスト内包表記は慣れたら使いやすい Python のリスト内包表記に出会って 4 ヶ月が経った。 「Python のリスト内包表記」を読みなおしてみると、 … 同じく数値のリストから、特定の条件に合う要素を抽出する。 print [x for x in [1,2,3,4,5] if x > 3] これまた読みにくい。 (@_@;) と書いていたけれど、今では「シンプルで読みやすく、また書きやすい」と思える。慣れとは恐ろしい。 ^^; (リスト内包表記がネストしてたりすると、すぐに理解出来ないけれど。) Ruby の Enumerable モジュールにはたくさんのメソッドが定義されている Java しか知らなかった頃、Ruby の 配列に定義されているメソッドを見て、「便利なメソッドがたくさんあるなぁ」と思った。Ruby の配列は、Enumera

    agw
    agw 2012/02/28
    なるほど > 配列をfoldして配列を返す
  • Firefox 4 へ移行するための設定

    Firefox 3.6 から 4 への移行は、対応してないアドオンがいくつもあるので当分お預けだな。… と舌の根の乾かぬうちに、どうにも我慢できなくなり Firefox 4 へ移行した。 Firefox 4 は外観の変化も去ることながら、Google Chrome と同じように、複数のタブを開いているときに、Youtube で動画を再生しているタブを D&D してウィンドウとして独立させても、再生が止まることがない点が魅力的。自分としては新しく追加された機能、 Firefox 4 に対応していないアドオンを動かすため、「Firefox 4のアドオンの互換性チェックをスキップする方法」 で紹介されていた Add-on Compatibility Reporter をインストールして再起動。 Configuration Mania 追記 (2011.5.10) : Configuration

    Firefox 4 へ移行するための設定
    agw
    agw 2011/03/25
  • Python で変数の型 (クラス) を調べる – types モジュール

    1. type, isinstance 関数で、変数の型を調べる Python で、変数の中身が、どのクラスに所属するのか、または、関数なのか調べたい。 2.1 組み込み関数 によると、 (装飾は、引用者による) type(object) object の型を返します。返される値は型オブジェクトです。 isinstance(object, classinfo) 引数 object が引数 classinfo のインスタンスであるか、 (直接または間接的な) サブクラスのインスタンスの場合に真を返します。 例えば、「数値」の場合、次のようにして、数値に対して type 関数を適用する。 print type(100)    #=> <type 'int'> type 関数の結果を用いて、isinstance 関数の引数に指定した。 print isinstance(100, int)   

  • Python で二進数、十進数の変換

    1. 二進数から十進数へ Python で、数値を 2 進数から十進数に変換したい。 2.1 組み込み関数 によると、 int([x[, radix]]) 文字列または数値を通常の整数に変換します。…radix 引数は変換の基数を表し、範囲 [2, 36] の整数またはゼロをとることができます。 long([x[, radix]]) 文字列または数値を長整数値に変換します。…radix 引数は int() と同じように解釈され、x が文字列の時だけ与えることができます。 int() 関数を、このような目的で使えることを知らなかった。(@_@;) 例えば、2進数を表す文字列 1010 を、十進数に変更する。 >>> print int('1010',2) 10 2. 十進数から二進数へ 十進数から2進数へ変換するには format 関数を使う。 PEP 3101: Advanced Stri

    agw
    agw 2009/04/15
    なるほど > 「十進法」は漢数字のほうが曖昧さがない。
  • Python のジェネレータ (3) - 数字にコンマを振る

    Python のジェネレータ (2) のつづき 1. ジェネレータを使う方法 前回と同じく、ジェネレータを使う例を考える。 数字にコンマを振る (via 巡回 - 常山日記) Python のチュートリアル 5.5.7 レシピ に、moneyfmt() という関数が書かれている。とりあえず、これは横に置いておく。 「数字にコンマを振る」ために、ジェネレータを使うことをイメージする。 数をリストに見たて、末尾から 3 つずつ要素を返すジェネレータを作成。 そのジェネレータからリストを生成し、 要素を逆順にして、 最後にコンマで要素をくっつける。 実装。 def gCommaStr(num): result = "" for i,e in enumerate(reversed(str(num))): if not i == 0 and i % 3 == 0: yield result resu

    Python のジェネレータ (3) - 数字にコンマを振る
  • Python のジェネレータ (2) - リストの走査

    Python のジェネレータ (1) - 動作を試す のつづき 1. ジェネレータをどこで使うのか? ジェネレータの動作について、何となく雰囲気を理解できた。しかし、どのような目的に使うのか、今一分からない 「あ!これはジェネレータを使うと、問題を解くのが楽だ。」 「ジェネレータを使った方がシンプルに書ける」 ということが分かるようになりたい。 イテレータを置き換えるジェネレータ 最初に覚えたことは、 ジェネレータを使うと、イテレータを簡単に作成できる。 ということ。イテレータとは、複数のオブジェクトに対して、要素を一つづつ辿るための手段。よって、ジェネレータは、複数の要素を辿るために利用できる。 例えば、Group クラスが Person クラスに対して責務があるとする。イテレータを自前で実装するには、境界条件を考えながら、イテレータプロトコルに沿うようにする。 Python のイテレー

    Python のジェネレータ (2) - リストの走査
  • Python のジェネレータ (1) - 動作を試す

    1. イテレータとはコンテナの要素を走査するためのオブジェクト これまでに Python の リスト内包表記、イテレータ について調べた。 次は、「ジェネーレータ」。 Python のジェネレータを理解するには、イテレータの理解が不可欠。ジェネレータについて調べる前に、イテレータの復習から行う。 a. イテレータの役割 Python のドキュメント「9. クラス」 における「9.8 イテレータ」の説明を確認すると、 イテレータの使用は Python 全体に普及していて、統一性をもたらしています。背後では、for 文は コンテナオブジェクトの iter() を呼び出しています。… イテレータは、Python において特別扱いされており、for 文と密接な関わりを持っている。 … この関数は next() メソッドの定義されたイテレータオブジェクトを返します。 next() メソッドは一度コン

    Python のジェネレータ (1) - 動作を試す
    agw
    agw 2009/02/11
    yieldは式という話。
  • Google の検索結果がおかしかった日

  • Python のイテレータ

    1. ジェネレータを理解するためには、イテレータから Python における リスト内包表記 を理解したので、次は、9.9 ジェネレータ (generator)。 ジェネレータは、イテレータを作成するための簡潔で強力なツールです。 と説明があるので、ジェネレータを理解する前に、 イテレータ について確認する。 2. イテレータ の実装方法と使い方 9.8 イテレータ (iterator) によると、その役割は for 文と連携することにある。 for 文を使うとほとんどの コンテナオブジェクトにわたってループを行うことができます Python のイテレータは、Java の For-each Loop に似ている。 cf. Java: For-each Loop CCC Ruby のイテレータ (2) - Enumerable で考えた同じ例を、Python のイテレータで実装してみる。例の

    Python のイテレータ
  • Python でハッシュに相当するもの - マップ型の「辞書」に対する操作

    1. マップ型を実装した辞書 Python において、ハッシュに相当するものはマップ型と呼ばれる。 2.3.8 マップ型 によると、 現在のところは標準のマップ型、dictionary だけです。 インターフェスがマップ型で、その実装が辞書。 ただし、Python ではインターフェイスと言わずに、プロトコルと呼ぶ。 cf. 6.4 マップ型プロトコル (mapping protocol) 2.3.8 マップ型に定義されているメソッドを適当に分類しておく。 最初にマップ型のオブジェクトを作成する。 # 辞書: key は変更不能でなければならない。 persons = {"Tarou" : 20, "Hanako" : 15, "Jiro" : 30} 2. 基的な操作 # 要素の値をキーで取得 print persons['Hanako'] # 要素の追加 persons['Saburo

  • Python における関数型プログラミング のための functools, itertools (1) – Haskell と同じ名前の関数たち

    1. 関数型プログラミングのための functools, itertools モジュール Python 2.7 Python の標準ライブラリには、関数型プログラミングにとって重要なモジュールがある。 9.7. itertools — Functions creating iterators for efficient looping 9.8. functools — Higher-order functions and operations on callable objects itertools, functools は、 The Python Standard Library — Python v2.7.3 documentation 9. Numeric and Mathematical Modules の階層の中にある。 9. Numeric and Mathematical

    Python における関数型プログラミング のための functools, itertools (1) – Haskell と同じ名前の関数たち
  • Python で順列を生成

    1. 順列の意味 順列 – Wikipedia によると、 組合せ数学における順列(じゅんれつ、permutation)は、あるひとつの集合から要素を選び出して、順番に意味を持たせて並べる (ordering) ときの、その並び(ordered list, sequence; 有限列)のことである。 うーん、ややこしそう。 (+_+) 数学苦手。どうやって生成するんだろう。 2. アルゴリズム 順列の生成とList内包表記 - 趣味的にっき によると、 与えられたリストから要素を1つ取り出して、残りの要素から再帰的に順列を求めて、それらを結合するアルゴリズムです。 (…) まずHaskellの場合。 (…) perms :: Eq a => [a] -> [[a]] perms [] = [[]] perms xs = [ h : t | h <- xs, t <- perms (xs \

    Python で順列を生成
  • 配列を「集計」するときの手順のわかりにくさ

    1. 配列の要素を集計をするときに感じた違和感 配列の要素を集計をすることを考える。 例えば、1 ~ 5 までの整数に対して、 1 + 2 + 3 + 4 + 5 の答えを求める場合、次のような手順を踏む。 Ruby で書くなら、 ary = [1, 2, 3, 4, 5] total = 0 for elem in ary total += elem end puts total もちろん、慣れているので、この計算の方法に抵抗は感じない。 しかし、この手順を初めて見たとき、 「わかりにくい」 と感じた。極めてシンプルなコードなんだけれど、どこか頭が混乱するような、そんな感覚に陥ったことを覚えている。 では、その原因はどこにあったのだろうか? 2. わかりにくい理由は、「要素の走査」「計算」「変数の再代入」を行なっているから 頭が混乱する印象を受けたのは、以下の箇所。 total += e

    配列を「集計」するときの手順のわかりにくさ
  • Python のデコレータ式 (3) - デコレートする側とデコレートされる側に引数がある場合

    Python のデコレータ式 (2) のつづき 1. デコレートされる関数に引数がある場合を考える これまで試したデコレータ式は、デコレートされる側の関数が引数を取らなかった。 Python のデコレータ式 (1) より、 def D(f): print u"デコレータが実行された" return f # デコレータを適用したときに、関数 D が適用される。 @D def hoge(): print "hoge" hoge() 前回は `デコレートする側に引数がある’ 場合について考えた。 Python のデコレータ式 (2) より、 def D(arg): def _(f): def __(): print "*--" * arg f() print "--*" * arg return __ return _ @D(5) def hoge(): print "hoge" hoge()

    Python のデコレータ式 (3) - デコレートする側とデコレートされる側に引数がある場合
  • Python のデコレータ式 (2) - デコレータに引数があり、複数のデコレータを適用する場合

    Python のデコレータ式 (1) のつづき 1. 前回のデコレータ式の復習 前回は、引数のないデコレータ式について試した。今回はデコレータ式に引数がある場合について考える。 最初に、引数のないデコレータについて復習する。 def D(f): def _(): print "*--" * 10 f() print "--*" * 10 return _ @D def hoge(): print "hoge" ##hoge = D(hoge) hoge() コメントアウトしてあるコードは、デコレータ式を使わない場合の書き方。デコレータ式は、このシンタクティックシュガー。 デコレートしたときに、関数 D が実行され、デコレートした関数をラップした関数が返される。上記では、デコレートされた後、関数 hoge は、hoge 関数がセットされた、関数 D にネストされた `_ 関数’ を指す。 2

  • Python のデコレータ式 (1)

    1. デコレータの仕組みについて知りたい Python を使っていて、これまでに所々でデコレータを目にしてきた。 関数のネストと f()() 可変引数 クラスメソッド – デコレータ @classmethod, @staticmethod を使って デコレータの仕組みについて理解してないので、そろそろ確認しておくことにする。 デコレータと等価な関数定義 7.5 関数定義 には、デコレータを使った関数定義と、それと同等の式の例が書かれている。 関数定義は一つまたは複数のデコレータ式 (decorator expression) でラップできます。… 例えば、以下のようなコード: @f1(arg) @f2 def func(): pass は、 def func(): pass func = f1(arg)(f2(func)) と同じです。 これを元に、いくつか例を考えてみる。 2. デコレー

  • Python でネストした関数の定義と、呼び出し

    1. 関数の中の関数 Python では、関数の中に、関数を定義することができる。 例えば、ITmedia エンタープライズ:2.4への機能強化で広がるPythonの世界 (3/4) には、以下のような例が書かれている。 def declareArgs(*argTypes): def checkArguments(func): assert func.func_code.co_argcount == len(argTypes) def wrapper(*args, **kwargs): ... ネストした関数を呼び出すには、関数の呼び出しで、順に引数を与えれば良い。 7.5 関数定義 に、呼び出し方の例が書かれている。 func = f1(arg)(f2(func)) 2. 関数のネストと、スコープ E. 用語集 によると、 ネストされたスコープ (nested scope) ある文が何ら

    Python でネストした関数の定義と、呼び出し
  • Python でリスト内のリストを連結 - Haskell の concat 関数を真似る

    1. ネストしたリストの要素を結合したい Python で、リスト内のリストを結合したい。 [[1,2,3],[4]] → [1,2,3,4] Haskell の concat 関数 に相当する関数を探したが、見つからなかった。 Prelude> concat [[1,2,3],[4]] [1,2,3,4] 自分で書くしかないのかな ? 2. Haskell の concat 関数は、型に注意 最初に、Haskell の concat 関数の動作を確認する。 Prelude によると、concat 関数の型は、 concat :: [[a]] -> [a] いくつかの例を試す。 test1a = [[1,2,3],[4]] test1b = [[1,2,3],4] test2a = [[[1,2,3]],[[4]]] test2b = [[[1,2,3]],[4]] main = prin

  • Python のクラスメソッド – デコレータ @classmethod, @staticmethod を使って

    1. メソッドをクラスメソッドにするときは、デコレータを使う あるメソッドをクラスメソッドにするとき、 Python ではデコレータを使うことができる。 2.1 組み込み関数 によると、(太字は引用者による) classmethod( function) function のクラスメソッドを返します。 クラスメソッドは、インスタンスメソッドが暗黙の第一引数としてインスタンスをとるように、第一引数としてクラスをとります。クラスメソッドを宣言するには、以下の書きならわしを使います: class C: @classmethod def f(cls, arg1, arg2, ...): ... ふーむ、ここでも第一引数が必須で、それがクラスを参照するということか。Python のこういう書き方は、最初とっつきにくいと感じた。 (+_+) デコレータの書き方としては、関数の前に @classmeth

    Python のクラスメソッド – デコレータ @classmethod, @staticmethod を使って
    agw
    agw 2008/12/02
    クラスメソッドとスタティックメソッドの違いを大変丁寧に解説している良質なエントリ。
  • 1