Python構文の詳細#1


※Postのすべての内容は、朴相吉氏の「Pythonアルゴリズムインタビュー」で参考にしたものです.
•発電機
発電機とは、サイクル繰返し動作を制御できるプログラム形式である.たとえば、100万個の数字を作成すると、メモリのどこかに100万個の数字を保存します.ただし、発電機を使用する場合は、100万個のメモリを使用する必要はなく、発電機を作成し、必要に応じて数字を使用します.ジェネレータでは、yeild構文を使用します.これは、既存の関数で使用されているreturnとは異なり、関数の前の値を導出し、関数の残りの部分を実行します.サンプルコードを次に示します.
>>> def get_numbers():
... 	 n = 0
...	 while n <= 1000000:
...    	 n += 1
...         yeild n
この場合、関数の戻り値はJennerレーダになります.ここで以下の値を生成するには、next()関数で抽出します.次のサンプルコードのように、1つの関数に複数のタイプの値を作成することもできます.
>>> def generator():
... 	yeild 1
... 	yeild 'string'
... 	yeild True
>>> g = generate()
>>> g
<generator object generator at 0x10a47c678>
>>> next(g)
1
>>> next(g)
'string'
>>> next(g)
True
• rangerange()関数は、前述したジェネレータの方式を利用する.サンプルコードを見て
>>> list(range(4))
[0, 1, 2, 3]
>>>range(4)
range(0, 4)
>>> type(range(4))
<class 'range'>
>>> for i in range(4):
... 	print(i, end=" ")
...
0 1 2 3 
以上のように、range()関数はrangeクラスを返し、反復文では、サードパーティがnext()関数を介して次の値を1つずつ呼び出す.
生成したい数が100万個であれば,2つの生成方法がある.
>>> a = [n for n in range(1000000)]
>>> b = range(1000000)
aおよびblen()関数として用いて長さ測定を行った場合、その値は両方とも1000000に等しい.しかし、異なるのは、aが1000000の数字に相当する値を含み、bが生成しなければならないという条件だけが存在する.メモリ使用率の比較
>>> sys.getsizeof(a)
8697464
>>> sys.getsizeof(b)
48
同じ100000個の数字を持つが、2つの変数のメモリ占有率bは圧倒的に小さい.bのメモリ占有率は、生成条件のみが格納されるため、常に同じである.さらに、これらのrange()はインデックスによってアクセスすることもできる.
>>> b[14]
14
したがって、リストとほぼ同じように使用できますが、メモリではリストよりも効率的です.
• enumerateenumerate()は、リスト、set、tupleなどの複数のデータ型をインデックスを含む列挙オブジェクトに返す.次のコードの例を示します.
>>> ex1 = [1, 2, 3, 14, 23, 91, 7]
>>> ex1
[1, 2, 3, 14, 23, 91, 7]
>>> enumerate(ex1)
<enumerate object at 0x1001a24c7>
>>> list(enumerate(ex1))
[(0,1), (1, 2), (2, 3), (3, 14), (4, 23), (5, 91), (6, 7)]
enumerate()が使用される場合、各値はインデックスとして表される.では、それを利用する方法は何でしょうか.利用できるのは以下の通りです.
for i, v in enumerate(ex1):
	print(i, v)
• printprint()は、符号化テスト時にデバッグに提供される唯一の機能と見なすことができる.だから、それをよく利用すると役に立ちます.
まず、複数の値を一度に出力する場合、各値を区別するためのデフォルト値は空です.
>>> print("a", "b")
a b
区切り記号を別の値に設定するには、sepパラメータを使用します.
>>> print("a", "b", sep = ",")
a,b
>>> print("a", "b", sep = " / ")
a / b
print()関数は、基本的に常に改行されます.ロングループを使用したデバッグでは、endパラメータを使用することで、いくつかの不便が発生します.
>>> for i in range(7):
... 	print(i, end = " ") # 출력 후 마지막을 공백으로 처리
...
0 1 2 3 4 5 6
リスト出力は、join()を用いて一括要約処理することができる.
>>> list = [0, 1, 2, 3, "apple"]
>>> print(' '.join(list))
0 1 2 3 "apple"
• pass
符号化を行う場合、大きなフレームを作成し、詳細を記述し、実装するという考えで、次のように符号化することがある.
class ExClass():
	def method_ex1:

    def method_ex2:
    	print("hello")

a = ExClass()
しかし、この場合、ピンエラーで動作しません.これはmethod_ex1を実現せずに直接スキップしたエラーです.このような面倒なエラーを防止するために使用できるのがpassです.使用方法は次のとおりです.
class ExClass():
	def method_ex1:
		pass # pass 추가하여 오류 발생 조치
    def method_ex2:
    	print("hello")

a = ExClass()
ここで、passはブール演算を使用し、何の機能もありません.この機能を使用すると、元の計画の大きなフレームワークを作成してから、詳細を実装できます.これはオンラインエンコードテストでもよく利用できます.