環境設定
プログラム作成
変数
tkinter
|
Python変数プログラミングに必要な変数について,説明します. 目次はじめにPython の変数名と値(メモリーのデータ)の対応関係は,オブジェクト参照と呼ばれる方法が使われています. 変数の生成と消滅,スコープ生成Python では変数宣言はありません.変数に値が代入された時点で変数のオブジェクトが生成されます.プログラムのどこで,どんなタイミングで変数が生成されるかが重要です.それにより,変数の有効範囲 (スコープ) が決まります. 消滅値を表すオブジェクトは,変数で参照されなくなると役に立たなくなります.その値を操作することができなくなるからです.そうなると,ガベージコレクション(ゴミ収集)の対象になり,適当なタイミングで,Python がメモリーから消去します. スコープ変数や関数が使える範囲をスコープと言い,それはこれらが属する名前空間により決まります.名前空間は,これらの変数や関数が作られた場所とタイミングにより決まります.ここでは,変数のオブジェクトを用いて,スコープについて説明します.オブジェクトが関数やクラスでも同じように振る舞います. LEGBルールPython の基本的なスコープは次の4つ,(1)ローカルスコープ:Local Scope,(2)外側の関数のスコープ:Enclosing function's scope,(3)グローバルスコープ:Global,(4)ビルトインスコープ:Built-inに分類できます.これらはプログラムの階層構造内側から順序付けられ,その順序通りにオブジェクトの名前の検索が行われます.これを LEGB ルールと呼びます.名前が見つかればオブジェクトと対応付けられます.そして,検索は終わります.このルールは特に変わったことはなく,他のプログラミング言語と同じように振る舞います. LEGB ルールの振る舞いを以下のプログラムで示します.このプログラムには3つの同じ名前の変数 variable があります.それぞれは,ローカルスコープ,外側の関数のスコープ,グローバルスコープです.また,ビルトインスコープの例として,__name__ の値を表示します. 001 #!/usr/bin/python3 002 003 variable = 33 # Global scope 004 005 def func(): 006 variable = 22 # Enclosing function's scope 007 print(variable) 008 def func(): 009 variable =11 # Local scope 010 print(variable) 011 return func 012 013 print(__name__) # show builtin variable: __main__ 014 print(variable) # show global variable: 33 015 f=func() # show enclosing function's scope variable: 22 016 f() # show local variable: 11 このプログラムを実行すると,以下の結果が得られます.最初の __main__ は変数 __name__ の値で,プログラム実行時に代入されます.続く 33 はグローバルスコープの variable の値,22 外側の関数のスコープの variable の値,11 はローカルスコープ variable の値です.同じ名前の変数 (オブジェクト) があっても,衝突することがありません. __main__ 33 22 11 モジュールを使う場合モジュールをインポートすると,それも名前空間の一つの階層になります.そのモジュール毎の階層内では,LEGB ルールが適用されます.モジュールはインポート方法により,名前空間が変わることがあります.詳細は,別ページのモジュールを参照ください. モジュールを使った場合のスコープの例を以下に示します. 001 #!/usr/bin/python3 002 003 variable = 44 # gloval 004 005 def func(): 006 variable =33 007 return variable 008 009 import mod 010 011 print(variable) # Global 44 012 print(func()) # Lolcal 33 013 print(mod.variable) # Global in module 22 014 print(mod.func()) # Local in module 11 001 #!/usr/bin/python3 002 003 variable = 22 # Global in module 004 005 def func(): 006 variable = 11 # Local in module 007 return variable このプログラム(scope02.py)を実行すると,以下の結果が得られます.まずは,003 行目でグローバル変数が作成され,値が代入されます.そして,009 行目でモジュール (mod.py) がインポートされます.011 行目では LEGB ルールに則り検索が行われ,最初に見つかるグローバル変数の variable の値が表示されます.012 行目は関数 func() が実行され,戻り値であるそのローカル変数の値が表示されます.013 行目ではモジュール内で,LEGB ルールが適用され,そのグローバル変数が表示されます.014 行目では,モジュールの関数 func() が実行され,戻り値であるそのローカル変数の値が表示されます. 44 33 22 11 クラスを使う場合クラス内の変数のスコープも LEGB ルールに従います.クラスもモジュール同様に名前空間のツリーのひとつブランチのように振る舞います.そこで,このルールが適用します.クラスの変数については,別ページの変数のところに詳細を示します. クラスを使った場合のスコープの例を以下に示します. 001 #!/usr/bin/python3 002 003 variable = 33 # Global scope 004 005 class Ex_Class: 006 variable = 22 # calass variable 007 def __init__(self): 008 self.variable =11 # instance variable 009 def get(self): 010 return self.variable 011 012 013 a = Ex_Class() 014 015 print(variable) # Global 33 016 print(Ex_Class.variable) # Class variable 22 017 print(a.get()) # Instance variable 11 このプログラムを実行すると,以下の結果が得られます.まずは,003 行目でグローバル変数が作成され,値が代入されます.そして,013 行目でクラスのインスタンスが作成されます.その際,006 行目でクラス変数と呼ばれるクラス内のグローバル変数が作成されます.次に,007 &ndash 008 行目で,インスタンスのローカル変数が作成されます.015 行目では LEGB ルールに則り検索が行われ,最初に見つかるグローバル変数の variable の値が表示されます.016 行目はクラス変数 variable の値が表示されます.017 行目ではインスタンス内で,LEGB ルールが適用され,そのローカル変数が表示されます. 33 22 11 変数の型数値Python には変数の宣言がありませんが,数値型を持ちます.
ちょっと気持ち悪いですが,虚数単位は「j」あるいは「J」です. 時々,文字列→整数,あるいは文字→浮動小数点の型の変換が必要なことがあります.そのためには,int() あるいは float()関数,complex()関数を使います.具体的には,次のようにします.ひとつの文字列や文字列のリストを数値に変換し,二倍しています. 001 #!/usr/bin/python3 002 003 if __name__ == "__main__": 004 005 i = "123" 006 il = ["1", "2", "3"] 007 008 f = "1.23" 009 fl = ["2.45", "3.4e-45"] 010 011 c = "1.2+3.4j" 012 cl = ["1.2+3.4j", "3.14e-3+2.71e3j"] 013 014 015 print("\n-- to int ---") 016 print("\t", int(i)*2) 017 print("\t", list(map(lambda x: 2*int(x), il))) 018 019 print("\n-- to float ---") 020 print("\t", float(f)*2) 021 print("\t", list(map(lambda x: 2*float(x), fl))) 022 023 print("\n-- to complex ---") 024 print("\t", complex(c)*2) 025 print("\t", list(map(lambda x: 2*complex(x), cl))) 文字列のリストを数値に変換するために,map() 関数を使っています.その中で,ラムダ式(無名関数)を使って,要素毎に操作します.そして,list() でリストにします(??).実行結果は,次のとおりです. -- to int --- 246 [2, 4, 6] -- to float --- 2.46 [4.9, 6.8e-45] -- to complex --- (2.4+6.8j) [(2.4+6.8j), (0.00628+5420j)] コレクション型リストリストの要素数は len(リスト名) で取得できます. クラスを使い構造体を表現構造体は大変便利な機能です.私は実験や計算のデータ処理をすることが多く,構造体が使えないと,いろいろと困ります.そこで,クラスを使った構造体の実現方法を示します. ほとんど構造体メソッド (関数) のないクラスを使うとC言語の構造体とほとんど同じことができます.書き方も C 言語と似ています.以下のプログラムで使い方を示します.
001 #!/usr/bin/python3 002 003 #========================================= 004 # like a structure by usging class 005 #========================================= 006 class structure: 007 memberT = "" 008 memberN = float("nan") 009 memberA = [float("nan")]*100 010 011 #========================================= 012 # main function 013 #========================================= 014 if __name__ == "__main__": 015 st = structure 016 st.memberT = "10th prime number" 017 st.memberN = "29" 018 st.memberA[29] = 3.141592653589793 019 020 print(st.memberT) 021 print(st.memberN) 022 print(st.memberA[29]) このプログラムを実行すると,以下の結果が得られます.006行目からクライスの定義の開始です.007&ndash:009行目で,構造体のメンバーであるクラス変数を定義し初期値を代入します.nan は not a number で,値がないことを明示します.015–022 では,ドットを使うことにより,構造体のメンバーへのアクセス(代入と呼び出し)ができることを示しています.C言語の構造体とほとんど同じ使い方ができます. ただし,この方法には大きな欠点が有ります.クラス変数を使っているため 1 つの構造体しか利用できません.複数のインスタンスを作っても,全てのクラス変数の値は同一になります. 10th prime number 29 3.141592653589793 クラスに見えるページ作成情報参考資料
更新履歴
|