他言語,多言語プログラマーの初めてのPython
せっそうもなくいろいろな言語に手を出すプログラマーが感じたPythonの気になった点をあげてみた。
【 目次 】
ソースファイルの文字コードと日本語
最初につまずくのは文字コードの問題。 python2系の場合、文字コードに注意が必要。
エンコード宣言というのがあって、エンコード宣言をせずに日本語をソースコードに記述すると python2系の場合、デフォルトのエンコードがasciiであるため、以下のようなエラーになってしまう。 (コメントに日本語が使われているだけでエラーになってしまう)
SyntaxError: Non-ASCII character
エンコード宣言については
そのためpythonにソースコードの文字コードを教えてあげる必要がある。
エンコード宣言はソースコードの1行目,shebang行がある場合は2行目に以下のように記述する。
# -*- coding: エンコーディング -*-
最近はutf-8が使われる事が多いが。
以下のように記述しても良い。(utf-8の場合)
#coding: UTF-8
utf-8 を表示できない Windows のコマンドプロンプトではUnicode文字列を使うかcp932 エンコーディングを使う必要があるとの事。
Unicode文字列で出力
print u"こんにちは pytho2"
python3系の場合、デフォルトのエンコードがutf-8に変更されておりソースコードがutf-8の場合は特にエンコード宣言は不要。
文字列も標準の文字列がunicode文字列に変更になっており、uを文字列の前につけなくて良くなっている。
文字列の連結
すなおに+演算子で良い
コンソールへの出力に良く使うのがprint
python2とpython3の大きな違いはprint
pytho2では
print "hello pytho2"
pytho3では
print("hello pytho3")
printで複数の項目を出力する場合はカンマで区切る。
カンマで区切ると各項目は空白文字で区切られて出力される。
print "a","b","c"
空白文字で区切りたくない場合は文字列連結する。
print "a"+"b"+"c"
printは通常最後に改行を出力するが、改行させたくない場合は最後にカンマを付ける。
print "a","b","c",
文
文の区切りは改行だが、c言語のように区切り文字としてセミコロンを使用することも可能。
だが、セミコロンは可読性が悪くなるため使わない方が良い。
タブと半角スペースが混じったインデントはエラー。
見た目、悪いところが無さそうなのにエラーになってしまう場合は、インデントがおかしいのカモ。
行末の\記号は文の区切りの改行をキャンセルできる。
括弧が閉じられていない場合、閉じられるまで複数行に渡って括弧の中身を記述できる。
「やりかたはひとつ」というpythonの哲学に反するが。
さまざまなpythonの文の記述
#coding: UTF-8 # 普通のpython var="hello" print var # 掟破りのPython 1行に複数の文を記述 var="xxx"; print var # 掟破りのPython 文を複数行に記述 var=\ "xxx" print\ var # 複数同時の代入 (multiple assignment) が可能 a,b,c = "a", "b" ,"c" print a,b,c # 一つの変数にカンマで区切って複数の値を代入するとタプルとして代入されることになる。 a= 5, "a",12.34 print a # 文字列を続けると連結された文字列になる。 print 'abc''bcd' print 'abc' 'bcd' x='xxx' 'yyyy' print x #変数や関数を定義する前に使用したらエラーになる ''' print x x=5 func13() def func13(): print "func13" ''' # コロンの後に次の処理を書いても良い def func(arg): print arg; return; func("xxx") if var : print "if" else: print "else" i=0 while i<10 : print i; i+=1 # 多重代入 x,y,z = 1,2,3 print x,y,z # シーケンスのアンパック seq=("a","b","c") x,y,z=seq print x,y,z # 真ん中の要素のみを取り出す(正確には使わない値はダミー変数に代入) _, y, _ = seq print y # 使わない値は「_」という変数名の変数に2回代入しているので、_には最後に代入した値が入っている # [Python で使わないタプルの値は "_" (アンダーバー) に代入するというプラクティス | CUBE SUGAR STORAGE](http://momijiame.tumblr.com/post/28130976849/python) # "_" (アンダーバー)で始まる変数名には、特殊な意味がある。 # 予約済みの識別子種 (reserved classes of identifiers) # [字句解析 — Python 2.7ja1 documentation](http://docs.python.jp/2.7/reference/lexical_analysis.html#reserved-classes-of-identifiers) print _ # シーケンスのアンパックをデクショナリに適用してみる。 dict_={"key0" : "value0", "key1" : "value1", "key2" : "value2"} tpl0,tpl1,tpl2=dict_ print x, y, z #こんな代入文も許される。 x=y=10 # => y=10; x=y print x, y # 可読性を高めるための、こういうインデントは許されるようだ SRC_PATH=( (r"C:\home\user1\python_src", "/python/src/user1"), (r"C:\home\common\python_src", "/python/src/common") )
文字列はシングルまたはダブルのクォートで囲む。
シングルとダブルクォートの区別は無い。(unixのshellやperl,php,rubyのようなシングルとダブルクォートの区別はpythonにはない。)
コメント と ヒアドキュメント
コメントは#
、unixのshellの文化を感じさせる。
複数行コメントは無いが、ヒアドキュメントを利用して記述できる。
ヒアドキュメントとは、文字列リテラルをプログラミング言語の中に埋め込むため方法。
改行を含む文字列を記述する時にも使われる。
Pythonのヒアドキュメントは文字列をシングルクォートまたはダブルクォート3つで囲んで記述する。
ヒアドキュメントを使ってsql文を変数に代入する例。
sql_text=''' select * from table '''
pythonのヒアドキュメントはshellスクリプト等の他の言語と違って変数展開はできないが、名前付きのテンプレート文字列を使うなどpythonの文字列フォーマットの機能を使えば、変数展開と同等の事をおこなえる。
次の例は名前付きのテンプレート文字列を利用してヒアドキュメントを変数展開する例。
sql=''' select * form Table where row1={param}''' print sql.format(param="value1")
ヒアドキュメントを利用して複数行コメントを記述するという事は、pythonの文法に沿う形で使われない複数行文字列を定義するという事か。
''' この文章はコメントです。 プログラムでは使われない文字列を定義しています。 '''
ヒアドキュメントを利用したコメントはインデントに注意が必要。
複数行コメントを記述する場合は、pythonの文法に添った形でインデントを付ける必要がある。
以下の例はエラーになる。
print u"以下のコメントはインデントがあるためエラー" ''' このコメントはエラーになる。 '''
演算子
ここも参照
「切り捨て除算」なんてのもある。
整数の切り捨て除算はでは普通の除算と結果は変わらないが、実数の切り捨て除算の場合は値が異なるよう。
#coding: UTF-8 a = 3 b = 2 print a,u"割る",b print u"商",a / b print u"余り",a % b print a,"//",b,"=",a // b a = 3.0 print a,"//",b,"=",a // b
比較演算子もだいたいc言語と同じだがis
なんてのもあってオブジェクトの比較(参照先の比較)に使うらしい。
inを使うとリスト等の集合に値が含まれているかを判断できる。
インクリメント演算子
インクリメント演算子は使えない。
test_num++
=> エラーになる。
しかしこれはできる。
test_num+=1
=> これはOK
定数
pythonには定数は定義できないが組込みの定数は存在する。
論理値はtrue,falseでは無くTrue,Falseと最初の文字は大文字なので注意。
値が無いことを示すNone
なんてのもある。
真か偽かの判定は
定数は定義できないので、「慣習的には値を変えない変数をすべて大文字で記載し、定数のつもりで書く。」みたい。
しいて定数のようなものを定義するとすれば
グローバル変数 __name__とモジュール
pythonプログラムのサンプルで以下のようなコードをよくみかける。
if __name__ == '__main__': # メインモジュールとして実行されるコードをここに記述
このif __name__ == '__main__':
とはいったい何だろう。
pythonから直接起動されるメインモジュールの場合、__name__には常に__main__が代入されている。
一方、メインモジュールからimport文で呼び出されるモジュール(サブモジュール)の中では
モジュール名が格納されている。
javaのmainメソッドみたいなものかな。
次のmain.pyとsub.pyはこれを検証するためのプログラムである。
#coding: UTF-8 import sub if __name__ == "__main__": print __name__,"はメインモジュールです(main.py)" else: print __name__,"はサブモジュールです(main.py)"
#coding: UTF-8 if __name__ == "__main__": print __name__,"はメインモジュールです(sub.py)" else: print __name__,"はサブモジュールです(sub.py)"
pythonよりmain.pyを起動した場合には以下の結果となる.
sub はサブモジュールです(sub.py) __main__ はメインモジュールです(main.py)
一方、sub.pyを起動した場合には以下の結果となる.
__main__ はメインモジュールです(sub.py)