Windows用のPython 3.4.2(64bit版)をインストール。
PythonWebとページのデザインもなかなか良いサイトを見つけたので
Pythonのサンプルソースをテキストエディタにペタペタ貼って動かしてたら、ハマりました。
1.print “Hello, Wordl!” ではまった。
元々Pythonにはprint文があるので構文上はエラーにはならないハズ。
しかし、Windows用のPython 3.4.2(64bit版)では print (“Hello, Wordl!”) だけが正解らしい。
2.¥記号問題でハマった。
テキストエディタを開くと大抵のコードページはSJISだ。
キーボードから¥記号を入れ、カーソルを¥記号のところへ持っていくと、画面右下に 5C と表示してくれる。
エスケープシーケンスのサンプルを先のサイトのページから、コピペし、カーソルを文中の¥記号のところへ持っていくと、画面右下に U+00A5 と表示してくれる。
5CはASCIIではバックスラッシュ、JISでは¥記号。 ところが、UTF-8ではU+005Cはバックスラッシュ、U+00A5が¥記号になのだから、これで正しいと云えば正しい。
しかし、Pythonでのエスケープシーケンスはバックスラッシュを使うものだ。
UTF-8同士、シフトJIS同士なら問題なかったのだろうなどと思いつつも、先のサイトのページのHTMLのソースを見ると¥記号の部分は ¥ を使っていた。
見慣れないHTMLの特殊文字だったのでググってみると、 ¥ ¥ ¥ 円記号 165(10進数)⇒A5(16進数)。
なんてこったテキストエディタに濡れ衣を着せてしまったではないか!
おそらく、そのページは『そのサイトのお作法どおり』に作られているだけなのでしょう。
『コピペはダメ!絶対ダメ!手打ち推奨!』なのかもしれません。
というか、
お行儀が良ければ良い!(訳では無い
ということを思い知らされた。
しかし、¥記号問題という古くからあり今なお困惑する問題が残っていると云うことを知ってもらおうと云うなら秀作です。
※ # coding: utf-8と書きだした途端にハマりますからね。
※何でも¥記号には3種類あるらしい
5C アメリカではバックスラッシュだが、日本国内限定(JIS規格)で「¥」になってるため、IMEパッドの文字コード表でも日本語フォントならUTF-8でも「¥」になっている。 ※5Cの各国の状況はISO/IEC 646を参照
A5 Unicodeの円記号、HTMLの特殊記号(半角の¥記号)の16進数表記。
9D アメリカのMS-DOSで使っているIBM-PCの文字コード(現在のCP437)の円記号
HTMLで半角の¥記号を表示したい場合はA5を使えば確実らしい。
しかし、このページってエスケープシーケンス(A5ではなく5C)の話ですよね?というところがミソになっている。
3.wxPythonでハマる
実はまだ64ビット版は開発版しかなく、評価中の様で、今月に2度もUPされていました。
リリース版はもうちょっと先の様ですので、Pythonのインストールコマンドpipを使って、開発版をインストールすることにしました。
あるブログで
pip install –pre –f http://wxpython.org/Phoenix/snapshot-builds wxpython-phoenix
でイケた!と書いてあったのですが、失敗!
wxPythonの開発者ブログを見ると、今現在の開発版では
pip install –pre -f http://wxpython.org/Phoenix/snapshot-builds/ wxPython_Phoenix
と小細工が必要らしいです。
パッケージ名はwxpython-phoenixでも良いそうですが、
snapshot-builds とwxpython-phoenix の間に スラッシュ(/) と 半角スペース( ) が必要なようです。
と云っても回答者はその点をはっきりとは指摘していなかったので今週のパッチのみ有効なトリビアな気もします。
※来週には事情が変わってるかもしれません。(泣
4.インデントでハマった
何気にタブや4個の空白記号で、それっぽくインデントして、思った通り動いてくれたけど
タブや4個の空白記号を混在してもソレっぽく動いてくれます。
当たり前のことですが、テキストエディタの設定で タブの表記を空白記号何個分で表示するのか変えられますから、空白とタブを混在させると
- タブ=2個の空白記号
- タブ=4個の空白記号
の人で見え方が違うハズです。
その辺のところは入門編に解説があるハズもなく
美しい
と書いてはいないですが・・・そんな感じです。(入門編はそうあるベキですよね!
でも、いつかハマりそうです。
ただ、先の¥記号問題のISO/IEC 646を観れば判りますが
インデントでブロックを表現しているので
{や}が無い国では絶賛されている
んだろうなと思ったのですが、
[や]も無い国らしい
ので微妙かも?
C言語やJavaの { ・・・} や[・・・]の使用頻度は半端なく高いし、JavaScriptで無名のイベントを登録するには必須です。
そうなると最近のJavaで
前世期の遺物の代表であるラムダ表記が組み込まれた
のも、1行で宣言ができる!と云うより
{}を扱うのがメンドクサイ国向けのアピールなのかなと思いました。
5.for文でハマった
通常は
for 変数 in リストまたは配列:
なので、C言語風に
for ( i =0; i< list.length; i++)
と書くのは美しくないようです。
ま、それはいいのですが、デバッグ中に
ループの何周目で地雷を踏んだ
のかは知りたいところです。
CSVファイルの一気飲みするソースなら必須でしょう。
「カンマが足りない行があります!」とか曖昧なエラーしか出せないpythonソースなんて使わされられるのは勘弁してもらいたいです。
データが数万行もあってもEXCELに取り込めればCTRL+↓で何とかなるでしょうが、列数が256列もあったらEXCELはCSVを正しく読んでくれるでしょうか?
否、んーなものにEXCELを持ち出してくるあたりから間違っているような・・・
この場合はPythonの標準ライプラリィ(組み込み関数)のenumerate()を使い、
for (周回数をカウントする変数、内容を格納する変数) in enumerate(リストまたは配列):
で良いみたいですが
collections ライブラリィを使った方が何か付け加える度にソースをゴソゴソと書き換えることが減りそうな気がしました。
特定のCSVファイルなら
for (1列目の変数、2列目の変数・・・n列目の変数) in zip(リストまたは入れる):
が楽そうです。
6.いつかハマりそう
何も難しいコードではありません。
x, y = y,x
Pythonなら、 xとyの変数を、期待通りに入れ替えてくれます。
他の言語で似たようなコードを書いてバグった人は多いと思いますので、
Pythonぐらいでしか通用しないコードは美しくない
とか云われそうです。
しかし、先の式の実装は、初歩のアセンブラ言語で書けば
PUSH Y
PUSH X
POP Y
POP X
で、済む話です。
※高度なアセンブラ言語ではPOPの順番が間違っていると指摘される可能性があります。
こんな簡単なことがC言語やJavaでは一時変数を使う以外には判りやすい方法がなく、難解(パっと見、読みにくくなる)になってしまうのが今でも不思議です。
7.宣言文でハマった
def 関数名(引数1、引数2・・・):
変数=引数1+引数2
return 変数
はあまり違和感がない。
なぜか”標準”で定数がない。
一応、タブル (1,2,’A’) はあるけど、constではなく、Read Only属性が付いている変数なので、中身がいっぱいあると詰め込むのに時間がかかる。
8:スライスでハマる
変数名[n:m] で、n番目からm番目まで切り取ってくれるので便利。
- 変数名[n:] ※n番目以降を取り出す
- 変数名[:m] ※m番目までを取り出す
なんかも助かります。
但し、スライス表現のnやmは配列子の番号ではなく、配列の隙間に付けた番号のようです。
※配列をスライスするには指定された2か所の隙間にナイフを刺し込んでサっと取り出す・・・みたいなイメージなのでしょうね。
※大雑把なボクはどこから切り分ければ良いか考えずに配列を1個づつ切り分けてから、先頭から0,1,2と数えて取り出しそうです。⇒スプリット&マージ
※文化の相違なのかな?
※数式の書き方も世界共通ではないそうですけどね。
[0:1] は、(変数名[0])のことなので配列は0オリジンみたいだからと・・・
変数名[n]から変数名[m]までを取り出すなら
変数名[n:m] かと思ったら、変数名[n:m+1]としないといけない。
さらにCやJavaのよくやってしまいがちな無用な(・・・)を付け、変数名[n:(m+1)] などとすると、
Pythonだから、エラー?どう動くんだろう?とか悩ませてしまいそうです。
総括:
Pythonってよさげ?
{}を付け更に見やすいようにタブレーションまでするCやJavaでは面倒くさいので、Eclipseなどは保存時にフォーマッタで決め打ちの書式変換をかけるのが普通。
なので、Pythonのことは考えずJava専用に設定したEclipseのエディタでPythonのソースを開いて保存すると、あ¨~~~~~(声にならない悲鳴 が出そうで怖い気がしました。
スライスやenumerateなど、他の言語のソースでは微妙に意味が違うコードは意外と不味い味がするかもしれない。
総評:
「元はみんなアルゴルの系譜なのさ」などと思っているとハマることは間違いない。