世の中、潜在ゼブラーマンな人が案外多いと思う。
白黒つけたい気持ちはあるが、白黒つけられない現実があるから、波風たてないように生きているような人。
そのギャップがストレスになっていくのかな。
そういえば、映画「ゼブラーマン」は渋谷駅のビックカメラがあるビルの映画館で見たのだが、映画が終わった後、外に出たら音楽デモみたいなのを大規模にやっていたため、少しの時間、現実に戻れなかった覚えがある。
リファレンス見ないで昨日のスクリプトをクラスで実装してみた。
"ナベアツ問題" class nabeatsuQuestion: def createReader(self): "ナベアツ問題を読み上げる人を作る" def reader(): "読み上げる人" def isFool(value): "3の倍数と3の付くときあほである" if value % 3 == 0: return True if str(value).find('3') >= 0: return True def isDog(value): "5の倍数で犬である" return value % 5 == 0 outputValue = '' if isFool(reader.value): outputValue += 'fool!' if isDog(reader.value): outputValue += 'bow-wow!' if outputValue == '': outputValue += str(reader.value) print outputValue reader.value += 1 return reader reader.value = 1 return reader instance = nabeatsuQuestion() runner = instance.createReader() for i in xrange(1,40,1): runner()
そうしたら、instance. createReader()のところで引数がどうのこうのって言われたので、小3分くらい悩んだ。
どうも、引数にselfを用意しておかないといけないようで。
"ナベアツ問題" class nabeatsuQuestion: def createReader(self): "ナベアツ問題を読み上げる人を作る" def reader(): "読み上げる人" def isFool(value): "3の倍数と3の付くときあほである" if value % 3 == 0: return True if str(value).find('3') >= 0: return True def isDog(value): "5の倍数で犬である" return value % 5 == 0 outputValue = '' if isFool(reader.value): outputValue += 'fool!' if isDog(reader.value): outputValue += 'bow-wow!' if outputValue == '': outputValue += str(reader.value) print outputValue reader.value += 1 return reader reader.value = 1 return reader instance = nabeatsuQuestion() runner = instance.createReader() for i in xrange(1,40,1): runner()
としたら動いた。
リファレンスはちゃんと読もうという教訓。
#はてな記法って便利
と言われてしまった。
どうも、このままだと外側のコードブロックにある変数を見てくれないらしい。
だから、どうやってやるんだろうといろいろと調べていたら、どうも、下記コードのように配列とすると、外側のコードブロックにある変数にアクセスできるっぽい。
で悩んでいた問題は
ある名前がブロック内で束縛されている場合、名前はそのブロックに おけるローカル変数 (local variable) です。 ある名前がモジュールレベルで束縛されている場合、名前は グローバル変数 (global variable) です。 (モジュールコードブロックの変数は、ローカル変数でもあるし、 グローバル変数でもあります。) ある変数がコードブロック内で使われているが、そのブロックでは定義 されていない場合、変数は 自由変数 (free variable)です。
という事で、同じ名前の変数を使うと、そのブロックで新しく作られ、そのブロック全体で有効になるんですね。
4月8日昼、Impress WatchでGoogle App Engineの情報を入手し、早速アクセスしてみたものの時既に遅く待ち行列入り。やはり7時間の時差は痛かった。。未だinvitation届かない、そんな切なさを紛らす為にイントロページの日本語訳を作ってみた。
解説とか、読むの大嫌いなんだけど、一気に読ませてくれた。
参考になります。
Pythonでリファレンスを見ながら初めてコーディングしたためクロージャの実装で悩んだ。
最初、C#とかと同じ乗りで
def nabeatsu(): value = 1 def reader(): isAho = value % 3 == 0 or str(value).find('3') >= 0 isDog = value % 5 == 0 if isAho: print 'あほ' if isDog: print 'わん!' if not isAho and not isDog: print value value = value + 1 #5/10まで間違ったサンプルになっていたのを修正(5/11) return reader runner = nabeatsu() for value in xrange(1,40,1): runner()
としたら、runner()を実行したときに、
valueなんてローカル変数無いよ。
と言われてしまった。
どうも、このままだと外側のコードブロックにある変数を見てくれないらしい。
だから、どうやってやるんだろうといろいろと調べていたら、どうも、下記コードのように配列とすると、外側のコードブロックにある変数にアクセスできるっぽい。
def nabeatsu(): value = [0] value[0] = 1 def reader(): isAho = value[0] % 3 == 0 or str(value[0]).find('3') >= 0 isDog = value[0] % 5 == 0 if isAho: print 'あほ' if isDog: print 'わん!' if not isAho and not isDog: print value[0] value[0] = value[0] + 1 return reader runner = nabeatsu() for value in xrange(1,40,1): runner()
でも、配列にする必要が無いので、ちょっと気持ち悪いと思って更に調べたら定義した関数にプロパティを持つことが可能らしく、結局下記のコードで落ち着いた。
追記:
下記の例でPythonのクロージャとして落ち着いたと書きましたが、runner = nabea2()でファンクションを取得した後、runner.value = 値で外部から変更できてしまうので(つまりvalueのスコープが広すぎる。)、結局、二つ目の配列を使った例が(気持ち悪いけど)クロージャなのかなと。
def nabea2(): def reader(): isAho = reader.value % 3 == 0 or str(reader.value).find('3') >= 0 isDog = reader.value % 5 == 0 if isAho: print 'あほ' if isDog: print 'わん!' if not isAho and not isDog: print reader.value reader.value += 1 reader.value= 1 return reader runner = nabea2() for value in xrange(1,40,1): runner()
nabea2メソッドの中でreaderメソッドを定義し、その後readerメソッドをreaderメソッドのvalueという名前のプロパティを1に初期化した上で戻り値として返しています。
スーパーアグリF1チーム(SAF1)は、本日、F1世界選手権から撤退することを決定した。2006年からプライベーターチームとしてF1に参戦し、昨年はチーム結成22戦目(スペインGP)で初ポイントを獲得、2007年のランキング9位という成績を残したSAF1のF1における活動は本日、その幕を閉じることになる。
GW中にあった一番悪いニュースである。
今年は、最初から財政難で初戦の参加すら危ぶまれていただけに、スペインGPまで見られた事は嬉しかった。
それでも、残念の一言しか出てこない。
「んー。」という感想だ。
もう少し、あと少しだけ彼らの雄姿を見届けたかったが、とりあえずは「お疲れさま。」といいたい。
EMOBILEのアウトレットで買ったemチャージ用のD02HWが届いた。
最初から14000円分チャージがついて、17980円で購入したので、実質モデムの代金は3980円だ。
D01HWなら14980円だったんだけど。
早速MacBookで接続してみようと思い、ユーティリティをインストールしてみたのだが、どうも起動すると即強制終了する。
困ったなと思いつつ、ネットを検索したら、どうも同じ現象に悩んでいる人が結構いたみたいで回避方法が載っていた。
OSのネットワーク環境設定で新しくモデムが追加されているから、それのダイアルアップの設定をすれば良いらしい。
というわけで、早速やってみたら、ユーティリティが強制終了しなくなった。
(ダイアルアップの設定がNullだと駄目なのかな?)
その流れでemチャージ用の設定変更をし、emチャージのサイトに接続して、サービスの利用開始をして、スピードテストをしてみたら、
下り2.4Mbps 上り320Kbps
だった。
7.2Mbpsが上限なので、それには足りないけど、ネットで調べた感じだと悪くない数字っぽい。
とりあえず、満足。
たまにしか使わないので、使う時は1日定額640円プランで使えば良いかなと思う。
1MBあたり63円なので、1日定額で使った方が明らかに安全だ。
ちょっとスピードテストしただけで、5MBだったので、既に315円。
今日はもう使わないからいいけどね。