Date:  Wed, 01 Nov 2006 17:25:52 +0900
Subject:  【オブジェクト倶楽部: 2006-41号】
X-Mail-Count: 00168

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.162 2006/11/01

■ I N D E X
┃
┣【プログラミング】TurboGearsでPythonを始めてみよう![6]
┣【PF】たまには仕事に役立つコミュニケーションのヒント[4]
┗【アンケート】気になるシステム業界 ホントのところ
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃  ★★ 『 Solaris 10 』が使われる理由、ご存知ですか?  ★★  ┃
┃              http://sdc.sun.co.jp/solaris/              ┃
┃ 全世界で500万件以上ものライセンス出荷数!今すぐ使える無償OS!  ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【プログラミング】TurboGearsでPythonを始めてみよう![6]

こんにちは、オブジェクト倶楽部のももんがあ、やっとむです。
ひらりひらりと木から木へと、身軽に飛び移るのがモモンガです。
言語から言語へ、技術から技術へと、気軽に移行したいもの。

前回は、Pythonのクラスとオブジェクトについての解説をしました[1]。実装
の裏側が垣間見えてしまうため、そこをうまく使ってメタプログラミングがで
きるという話をしました。今回は、Pythonの別のプログラミングパラダイムで
ある、関数型プログラミング[2]を紹介したいと思います。

■□ 関数型プログラミングとラムダ式 ■□

Pythonの関数型プログラミングは、Lispの機能を取り込む形で実現されていま
す。Lispには基本的な言語要素としてラムダ式がありますが、Pythonにもラム
ダ式があります。ただし、Lispのものほど重要でも、強力でもありません。イ
ンタープリタで試してみます。

 >>> f = lambda x, y: x * y
 >>> f(2, 3)
 6
 >>> f
 <function <lambda> at 0x00BDAE30>

「lambda x, y: x * y」がラムダ式です(1行目)。ここでは「xとyを引数とし
て取り、x*yを返す式」を定義しています。このラムダ式を変数fに格納する
と、fを関数のように呼び出すことができます(2行目)。実質的には、新しい関
数を作ってそれにfという名前を付けていることになります(4行目)。

これでは、単に関数定義を簡略化しただけで、あまり面白くありません。ラム
ダ式が便利なのは、map()、reduce()、filter()などの関数と組み合わせて使
うときです。

  map(f, seq[, seq, ...])
    リストなどの各要素にfを適用して、結果をリストにする。

  reduce(f, seq[, initial])
    リストなどの先頭から2つの要素を取り、それをfに適用して、さらにその
    結果とリストの次の要素に適用して…と繰り返す。

  filter(f, seq)
    リストなどの要素から、fがTrueを返すもの以外を取り除く。

map()を使って、リストの各要素を2倍にするには、次のように書けます。

 >>> map(lambda x: x*2, [1,2,3,4,5])
 [2, 4, 6, 8, 10]

引数fとして、ラムダ式を渡しています。ラムダ式を使わないと、次のように
いったん関数を宣言しなくてはなりません。

 >>> def f(x): return x*2
 ...
 >>> map(f, [1,2,3,4,5])
 [2, 4, 6, 8, 10]

手間がだいぶ…そんなに変わりませんが、ラムダ式を使ったほうがシンプルに
書けることがわかります。

他の例も見てみましょう。

 >>> reduce(lambda x,y: x+y, [1,2,3,4,5])
 15  ←(((1+2)+3)+4)+5
 >>> filter(lambda x: x%2==0, [1,2,3,4,5])
 [2, 4]  ←2で割って余りがゼロのもの=偶数のみ
 >>> filter(lambda x: x!=' ', "monty python's flying circus")
 "montypython'sflyingcircus"  ←空白を取り除く

■□ 関数でプログラムを書くために ■□

関数型のパラダイムでプログラムを書くには、いくつか工夫も必要です。たと
えば、単純な関数では条件分岐ができません。条件分岐がないと普通の再帰も
できません。Pythonでは、条件分岐を式で表現する方法がいくつかあります。
「もしAならばB、さもなければC」という式を書く、いくつかのイディオムを
紹介します[3]。

  A and B or C
    BがFalse、0、None、空シーケンスになると機能しない。

  (A and [B] or [C])[0]
    一般的。[B]または[C]というリストを作って、その要素を取り出す。

  (A and (lambda:B) or (lambda:C))()
    上の書き方の別法。BまたはCを返すラムダ式を作って、呼び出す。
    やや読みにくい。ラムダ式の使い方が怪しげに見える。

  (C, B)[A]
    (C, B)というタプルから、Aをインデックスに使って取り出す。
    True=1、False=0になるのを利用。

  B if A else C
    Python2.5から導入された新しい文法。とても素直。

関数型プログラミングでは再帰も頻繁に使用します。再帰とは、ある関数から
自分自身を呼び出すことです。例として、階乗(1*2*3*...*n)を計算する再帰
関数を書いてみましょう[4]。

 >>> f = lambda x: x>1 and x*f(x-1) or 1
 >>>
 >>> f(1)
 1
 >>> f(5)
 120  ←5*4*3*2*1

■□ おわりに ■□

関数型言語で有名な遅延評価はPythonにはありませんが、ジェネレータを使う
と部分的には再現することができます。またカリー化はPython2.5から標準で
サポートされました。

Pythonで完全な関数型プログラミングをする必要はないかもしれませんが、関
数型のテクニックを知っていると、Pythonでスマートなコードを書くことがで
きる場合がよくあります。たとえ役にはたたないとしても、違ったパラダイム
を学ぶのもまたひとつの楽しみです。(やっとむ)

[1] http://www.ObjectClub.jp/ml-arch/magazine/163.html

[2] http://www.sampou.org/haskell/article/whyfp.html

[3] 詳しくはこちらに情報があります。
http://www.python.org/doc/faq/programming/#is-there-an-equivalent-of-c-s-ternary-operator
http://mail.python.org/pipermail/python-list/2001-September/064041.html

[4] 関係ないですが、再帰の例としてはフィボナッチ数が有名です。
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E009-5&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E009-5&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E009-5&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【PF】たまには仕事に役立つコミュニケーションのヒント[4]
          -「なぜ」ではなくて「なに」を聞く

遅ればせながら『デトックス』がマイブームの上田雅美です。
『デトックス』とは英語で表記すると『detox』。解毒を意味する言葉だそうで
すが、一番のデトックスは飲んで愚痴を言うことだったりして(笑)

●「なぜ」と「なに」の違い

さて、今日はちょっとした言葉遣いについて考えてみたいと思います。
私はコーチの仕事をしていますが、今日はクライアント(コーチを受ける人)に
エピソードを紹介する許可をいただいたので、題材として考えてみましょう。
皆さんにとっても身近な出来事ではないでしょうか?

Aさん。男性。37歳。ソフトウェア開発現場のプロジェクトマネージャ(以下
PM)。チームはおよそ30名。今まではリーダとして活躍していたが、いよい
よPMとして仕事をすることになる。技術力が高いことや面倒見が良いことか
ら、メンバーからの信頼は厚い様子。今週の会議でメンバーから大幅に工程が
遅れていることを聞かされたそうです。その遅れは深刻で、納期にもかなり影
響がありそうです。毎週行われるミーティングで報告が無かったので、つい見
過ごしていたようです。「今後このような事態が起きないようにするためには、
どんなことをしたらいいのか?」そんなことがテーマとなりました。
Aさんはどんなことも気軽に相談して欲しいのです。
実際にはなんとかその場をしのぎ、事態はさほど悪化せずにことなきを得たそ
うですが、Aさんは彼らとの間に未だすっきりしないものを抱えていました。

この話をし始めたとき、Aさんはしきりに「なんですぐに言ってくれなかった
のか?」「なんで一言相談してくれなかったんだろう。」しきりに「なぜ?」
と、その出来事を引き起こす原因となったメンバー達の話ばかりしていました。
話しをしてゆくうちにAさんはどんどん彼らを心の中で責めているように見え
ました。私にはAさんはとても辛そうに見え、一向に問題が解決するような気
がしませんでした。

そこで、「なにが問題になっているのですか?」そう質問してみると、色々な
要素が浮かんできたようです。思いつくことを沢山話してくれました。メンバー
が途中で何名か代わったこと、気になっていることをそのままにしてしまった
こと、Aさんご自身が会議などで忙しくしていて、それも原因のひとつではな
かったのか?など。
色々と心当たりが見えてくると、一つ一つに対応が出来るようになってきます。
Aさんはこれからやってみようと思うことについて話し始めました。

●解説

コーチングでは極力「なぜ+否定形」の質問は、「なに?」に置き換えて質問
をするようにします。それは、「なに?」のほうが原因となっていることを引
き出しやすいからです。これは、自分がその当事者であった場合などに効果的
です。
「なに?」と質問されることによって、物事を少し客観的に捉えられるからだ
といわれています。客観的に捉えることが出来ることによって、冷静にその要
素を考えることが出来るからなのですね。

それに対して「なぜ+否定形」の質問は、その「人」に焦点を当てた理由を尋
ねる質問の形です。「なぜ連絡が出来なかったの?」「なぜすぐに言わなかっ
たの?」「なぜ宿題をやらなかったの?」など。

親や先生が子供たちを叱るときは、たいていこの言葉を使っています。
「人」を責めるだけでは問題は解決しません。人は責められると、自分を防衛
しようとする本能が働き、どんどん心を開かなくなります。
「なぜ?」から「なに?」に質問を切り替えることで、問題を人から切り離し、
人間の防衛本能を抑えて、問題に対する攻撃本能を活かせるようになります。
例えば、この場面でAさんはこんな風に聞くことができたかも知れません。
「報告が遅れた原因はなにかな?」
「なにがあったの?」
「障害になっていたものはなん(なに)ですか?」
「なにが変われば、無くなると思いますか?」

●まとめ
質問の形をちょっと工夫することによって、相手の受け止め方やその後の反応
が変わってきます。「なぜ+否定形」が出そうになったときにはちょっと意識
して、「なに?」の質問に変えてみてください。
意識するコツは特にありませんが、少し冷静な目で会話の流れを見るようにし
ています。「なぜ+否定形」の質問が出たときに、はっとして言い直すことも
あります。皆さんもどんどんチャレンジしてみてください。そして、コツがわ
かったら教えてくだ
さいね。(上田雅美)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=M003-3&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=M003-3&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=M003-3&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【アンケート】気になるシステム業界 ホントのところ

今週は「今まで買った一番高価なものはいくら?」のホントのところ。先週に
引き続き、お金というキーワードからこのテーマを考えてみました。趣味で買っ
た一番高額なものはいったいいくらでしたか?(ドキドキ)

  1〜100,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=0
  100,001〜300,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=1
  300,001〜500,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=2
  500,001〜1,000,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=3
  1,000,001〜3,000,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=4
  3,000,001〜5,000,000円
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=5
  5,000,000〜10,000,000。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=6
  10,000,000以上。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=7
  ただより高いものはありません。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=8
  それは秘密です。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=128&choice=9
  ちょっと語らせて!
     詳細をこのメールに返信ください!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「1ヶ月のお小遣いいくらですか?」の結果は公開中。ぜひご覧くだ
さい。
⇒http://www.ObjectClub.jp/special/kininaru/vol127/PlonePopoll_results2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。おまたせのここだけ情報です。事務局長にとうとう
許可を頂きました!既に満員となってしまったオブジェクト倶楽部秋イベント
ですが、追加で10名の皆さんにお申し込みいただけるようなりました。
11月2日(木)12:00ごろより、先着10名様のみお申し込みを受け付けます。
(お申込 : http://www.ObjectClub.jp/event/entry20061117/)
また、既に予定が変更になり参加できなくなっている皆さまは、席を譲るか、
キャンセルをしてくださいね。お願いします。

今週の強引な一言
***三つ子の魂百まで(ことわざ)***
そうやって諦めてしまったら、何も変わりません。変化は自分次第でいつだって
起こせます。(上田雅美)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
● ご意見、ご感想は         ⇒このメールに返信ください
〇 配信中止、アドレス変更は ⇒http://www.ObjectClub.jp/community/object_ml/help/
〇 免責事項、過去の記事は   ⇒http://www.ObjectClub.jp/community/object_ml/
■ 発行:オブジェクト倶楽部 ⇒http://www.ObjectClub.jp/
■ 編集代表:平鍋  健児
Copyright (c)2003-2006 オブジェクト倶楽部. All Rights Reserved.
powered by Eiwa System Management, Inc.