2010年05月たのしいPython今夜コードを書いているすべてのヒトへプロフィールAuthor:辻真吾(つじしんご)www.tsjshg.infoいまは、大学の研究室を主な拠点に、色々やってます。このブログはPythonの話題が中心ですが、どちらかというと日々の仕事で使う知識を、自分のためにメモしたものです。万が一どなたかの役に立てば光栄です。githubgoogle-code-prettify管理者ページこのブログをリンクに追加するタプルのいろいろPythonにおけるタプル(tuple)は、丸括弧でオブジェクトをくくると定義出来ました。3)リスト(list)と何が違うのかというと、一度定義したら変更できないところでした。3)ちなみに、変更できるオブジェクトをmutable、変更できないオブジェクトをimmutableと言ったりします。変更出来ない代わりに、タプルは辞書のキーになれるというメリットがあります。'a'}さらに、タプルのカンマは結構省略できるという事実をご存知でしょうか?こんな感じです。d[0,0]'a'まあ、ちょっとだけ楽だというだけなんですが、PythonからExcelのファイルを扱うことができるpyExceleratorなどで見られる書き方です。ちなみに、このpyExceleratorもかなり便利です。top↑Pythonと日本語文字Python2.x系で文字列を使おうとする場合、実は二つの型があります。str型とunicode型です。3.xでは文字列はunicode型になるということで、混乱を避けるために、先日出させていただいた本にはunicode型についてまったく触れていません。しようか悩んだ末にばっさりシンプルにしてみたのですが、本格的にプログラミングをしようと思ったら、2.x系を使っている段階ではunicode型とstr型の違いを把握しておく必要はあります。以下は、2.x系のための文字列型のお話です。文字列は普通に定義するとstr型になります。'str'>しかし、じつはこれでは困ったことがおきます。文字列の長さがちゃんとわかりません。len(test_kanji)12'abcd_1234'は9文字でOKですが、'ごり押し'はどう見ても4文字ですが12文字とか言われてしまいます。インタラクティブシェルでそのまま中身を表示すると理由がわかります。ちなみに、これはMacOSXでの実行例です。Windowsの場合は「ごり押し」は8文字だと言われるでしょう。test_kanji'\xe3\x81\x94\xe3\x82\x8a\xe6\x8a\xbc\xe3\x81\x97'日本語にはいくつか文字コードがありますが、MacOSXのデフォルトはUTF-8です。これは日本語の一文字分で3バイト必要になるので、4文字の日本語で12バイト分となりlen関数の戻り値が12となったわけです。str型は文字列というよりバイト列という感じになります。Windowsでは文字コードが違うのでlen関数の戻り値が変わるわけですが、それでは困ります。そこで出てくるのがunicode型です。リテラル表現は、頭にuをつけます。print(test_unicode)ごり押しという感じになって、よい具合です。いつもunicodeだけでいいんじゃね?という話になりそうで、実際3.x系からそうなるわけですが、2.x系でよく嵌まるのが次のエラーです。range(128)ただ、ファイルに書き出そうとしただけなのに、なんかひどいことになってしまいました。これは、「unicode型の文字列をasciiコーデックを使ってエンコードしようとしたら出来ませんでしたすいません」という意味なんですが、和訳できても意味がわからないことにかわりはありません。そもそもなんで、ごりごりの日本語である「ごり押し」をasciiコーデックでエンコードしようとしているのでしょうか?それは簡単で、そう設定されているからです。次のコマンドで確認できます。sys.getdefaultencoding()'ascii'なるほど。言われても、unicode文字列が何で書き出せないんだ?と思うところですが、Pythonのunicode型はその名前からイメージされる代物ではありません。なんとなく自動的にutf-8あたりになってくれそうですが、それは間違いでunicode型からどのエンコードで出力するかは別に指定する必要があります。逆に言うと、どんな環境にも対応できるということも出来ます。print(gori_sjis)???艟??最後の行は、このコードを実行したのがMacなので文字化けします。Windows環境ではちゃんと出るかわりにそのひとつ上が文字化けします。unicode型が持っているencodeメソッドは、引数にコーデックをとって、unicode型をstr型に変換します。その逆のメソッド、つまりstr型のメソッドで引数にコーデックをとってunicode型を返すdecodeメソッドもあります。gori_utf.decode('utf-8')u'\u3054\u308a\u62bc\u3057'だんだん話がややこしくなってきましたので、まとめておきましょう。Python2.x系では文字列には二つの種類がありますが、内部的にはunicode型を使って、入出力で適当な文字コードにしたがって変換するようにするというのが、基本的な方針になるかと思います。ファイルを読み込んでタブで区切って返すくらいのスクリプトであれば、あんまり気にすることもありませんが、XMLやデータベースをいじるアプリの場合は注意が必要かと思います。