サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Nintendo Direct
blog.livedoor.jp/kikwai
新人プログラマのA君が、Python3で以下のようなコードを書いていました。 x1 = f1(x) x2 = f2(x1) x3 = f3(x2) x4 = f4(x3) x5 = f5(x4) print(x5) そこへ通りかかったB先輩は、「x1〜x5は、後で使うのかね?」と聞きました。A君が「いいえ計算の為の変数です」と答えると、「仮変数が多すぎる」と言って次のように書き直すよう勧めました。 x0 = f1(x) x0 = f2(x0) x0 = f3(x0) x0 = f4(x0) x0 = f5(x0) print(x0) 「取り敢えずこれで、仮変数は少なくて済むだろう」とB先輩は言いましたが、そこへ通りかかったのは面倒が嫌いなC先輩。「バグの元になる仮変数なんて一つも要らない」と、次のように書き直しました。 print(f5(f4(f3(f2(f1(x)))))) 「これが一番
Pythonの知名度もそこそこ出てきたので、今更「Pythonには多分岐構文(switch文)が無い」とか言う人は居ないとは思うけど……居ないよね? もし、そんな人が居たのなら、教えてやろうPythonの底力(笑) とりあえず、0〜6の数値を入力してもらって、それを曜日(SUN MON TUE WED THU FRI SAT)のどれかを画面に出力する方法(出力でないと面白く無いので) >>> def weekPrint1(): ... n = input("0-6?:") ... if n == "0": print("SUN") ... elif n == "1": print("MON") ... elif n == "2": print("TUE") ... elif n == "3": print("WED") ... elif n == "4": print("THU") ...
Pythonは関数をファーストクラスオブジェクト(つまり普通にオブジェクト)として扱う。 これは紛れも無い事実であり、Pythonにある程度なじんだ人なら『関数オブジェクト』を引数として取る関数を作ったり、『関数オブジェクト』を返す関数を作ったりすることに何の抵抗も無くなる(というか、使えないと一旦思考停止してしまうようにさえすらなる) しかし、だからといって関数が普通のクラスインスタンスのオブジェクトと同じかといえば、実はかなり特殊なオブジェクトであるといわざるを得ない。 いやむしろ、言葉どおり『関数』という特殊な存在を、通常のデータと同様に『オブジェクト』として扱っているだけであるといった方が良いかもしれない。 それではまず、関数と、呼び出しメソッドフックを備えた(つまりobj()の形で使える)オブジェクトとはどこが違うのか、少し見てみることにしよう。 比較する関数は以下の通りだ。 >
思えば、私はPythonに標準で組み込まれていた頃、reduceという関数が何をするものか、さっぱりわからなかった。 引数のタプル/辞書展開構文で、初めてapply関数が何をするものか知った。 リスト内包表記で、mapとfilterの使い方を知った。 で、再帰を弄っていて、reduceの存在をおぼろげながらつかめた頃、Python 3でのlambda構文の廃止が噂され、ついでにapply, reduce, map, filterの四関数の削除も噂された。 そして……結果として、lambda文、map, filter関数は残り、applyは削除、reduceはfunctoolsに隔離された。 applyは、代替構文があるのだから、別に問題はない。 map, とfilterは、代替構文があるにもかかわらず残った。 reduceはGuido師の『醜い』の一言で隔離された。 が、果たしてreduc
関数型プログラミング言語Haskellは色々と面白い特徴があるのだが、その中でも関数適用で f1(f2(f3(arg))) を f1 $ f2 $ f3 $ arg と書けてしまう'$'演算子が結構良い感じだ。 Pythonではあいにく'$'は演算子として認められていないので、他の演算子を選ぼうとしたのだが、実は候補は一つしかなかった。 それは'**'だ。 Pythonの微妙な仕様の一つに、演算子のオーバーロードは出来ても、演算子の演算順序を変えることは出来ないという法則がある。 そして調べたところ、同一の演算子で$演算子のように「右結合」の演算子は、Pythonでは'**'しかなかった。 これを調べる方法は簡単だ。 まず、前に書いたシンボルを応用して、演算子結合調査用のクラスを書く。 #sss.py class S: def __init__(self, s): self.s = s d
lambdaを使っててどうも気になるのが、ループ(再帰)するために一時的に関数に名前をつけなければならないところだ。 一時的なローカル変数が簡単に設定できる言語ならともかく、Pythonではそれも結構面倒だ。 ところが、つらつらとネットを探していくと、妙なモノを発見。 『Yコンビネータ(Y combinator)』とか『不動点コンビネータ (fixed point combinator)』あるいは『不動点演算子』とか呼ばれるモノで、コレを使うと、どうやら関数に名前を付けなくとも再帰できるという代物らしい。 喜びいさんで見てみたが……書けはしたものの、理解するのに苦労した。 今回はその解説を、私のようにλ表記になじみの無い人でもわかるように、基本的に一般の関数式とPython式で書いてみることにした。 さらに、同じ式を2回書いて、次にドコにドコを適用させるかを色分けし、その結果も色分けして書
前にも何度かexec関数や旧exec構文を取り上げたのだが、今回は少し徹底的にやろうと思う。 なぜかといえば、そもそもPython 3で新たに加えられたexec関数とlambdaの『最凶』タッグによるイタズラ記事を書こうと思って調べていたのだが、どうもその前に、exec関数の性質や、特に判り難い名前空間やスコープルールについて整理をしておく必要性が出てきたのだ(読んでいる人のためもあるが、主に自分向け) そのために、内容的には以前と重複する箇所も多々あるが、情報整理のためと思ってご容赦ねがいたい。 ■はじめに execは以前はprint同様構文扱いだったが、printが関数になってもさした変化は無いのに対し(昔だって、sys.stdout.writeを呼び出せば同等のことができた)execの構文から関数への移動は、はっきり言って危険なほど変化が大きい。 ※もちろんexecのラッパ関数を書け
この世の中には、「やってはならない」ことがたくさんある。 しかし、今回やるような「いけないプログラミング遊び」は大いにすべきだと思う。 もちろんあなたがプロのプログラマで、仕事でPythonを使うなら、ここでやるようなコトをコードの中に埋め込んでは決してならない。 でも、あなたが何に使うでもなく手慰みにプログラムを書くのであれば、誰も文句は言うまい。 プログラミングで色々遊んでおくことは、結果的にはその言語/環境のポテンシャルを知ることになり、いざという時に(避ける、というネガティブな利用法を含め)役に立つかもしれない。 まぁ、プロのプログラマでもなく、プログラミングは九分九厘まで趣味である私には関係のない話だが…… というわけで、いつものラクガキスクリプト。 今回はPython 3になって「オイシク」成長したexec関数と、lambda式(文)の組み合わせで遊んでみよう。 ※今までPyt
しっかりと読み進めた結果、この本は私としてはとてもではないが自身を持って薦められる本ではないことが判明。 内容と発売時期のギャップは確かにあるが、それ以上に内容自身に問題がある。 ■まず、本文 「Pythonの基礎について余すところなく解説する」とあるが、説明、というより「仕様に対するいいわけ」がやたらと目につく。 Pythonの流儀であればどうどうとそれを書けばよいのに、他言語と比較して劣ると言わせたくないばかりに「Pythonはこう考えてこうだ」とか書くから、非常にいいわけがましい。 そしてそのいいわけに「膨大なページ」が使われている。 翻訳者のブログには「分厚い」ことをレヴューとして挙げることのつまらなさを書いておられたようだが(それ自身にも反論はあるのだけど)その内容が「冗長」であるのなら、言い訳の余地はない。 つまりページ数が内容に全然比例していないのだ。 ■恥知らずな「練習問題
■いろいろ調べてみると 出版されている本の中で紹介されていることは少ないデコレータなのだが、ネットを調べてみると、やはり色々な人が書いている。 ただ、なんだか難しいモノが多い…… 私は複雑なモノは判らないレジスタの少ない頭を持っているので、バラバラにして、とりあえずワンステップづつ見ていこうと思う。 ■基本形 引数を取らないデコレータの基本形は次の通り。 def decorator(f): def wrapper(*args,**kwd): return f(*args, **kwd) return wrapper ちなみに、何の効果も無いが、func_nameが'wrapper'になってしまうので、気になる人はwrapperのfunc_nameを変えておくと良いかも。 仕組みは比較的簡単。 とりあえず前回話した通り、デコレータの戻り値がそのままデコレートされた関数なりクラスなりと入れ替わ
実は前回は、メタクラス(カスタムメタクラス)で一番力を発揮する__new__メソッドの話と、__call__メソッドの話をわざと省いた。 いや、えらそうなコトを言っておきながら、自分でも少し混乱していたので、こっそりと色々試していたのだ。 で、確認終了したので、ここにまとめる。 (2007.3.2修正しました) ■__new__メソッドについて メタクラスの話に入る前に、確認を兼ねて__new__組み込みメソッドについて。 Pythonでクラスを定義する場合は、__init__メソッドで初期化するのが普通だが、生成過程を制御したい場合には、__new__組み込みメソッドを使用する。 __new__は、__init__と全く同様に引数を設定し、クラスオブジェクトの関数呼び出しの形で使用される。 ただし、二点ほど注意することがある。 一点は「戻り値を設定しない」__init__とは異なり、__
今の世の中、オブジェクト指向プログラミングは当たり前だ。 しかし、じゃ「メタクラスは?」と聞かれて即答できる人は、ある程度の勉強家だろう。 なぜか……昨今の「オブジェクト指向プログラミング言語」の主流格であるC++にもJavaにも、メタクラスは存在しないからだ。 無論、Smalltalkerなら「当然」なので、鼻で笑われるだろう。 なんせ、クラスを作るには、メタクラスのインスタンスを作らなければならないからだ。 つまり、メタクラスとは、クラスオブジェクトのクラス、すなわち「クラスのクラス」だ。 正式には、あるオブジェクトがあると、そのクラスのクラスがメタクラス、ということになる。 クラス自身がオブジェクトである言語でなければ、メタクラスが存在するわけない、という意味はご了解できただろうか。 Perl風Smalltalkを標榜するRubyには、メタクラスは当然ある。 では、我らがPython
本サイトは、著作権期間延長に反対します 本Blogの『機械伯爵』の文書は、GFDL( 原文/日本語訳)に準拠します。 Copyright (c) 2005 COUNT KIKWAI Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included
このページを最初にブックマークしてみませんか?
『blog.livedoor.jp』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く