Python構文特性

4161 ワード

Python構文特性
Pythonを使って書くのも長い間、自分のコードをどのように最適化するかを考えて、いくつかの問題を探しました.その中で印象的だったのがstackoverflowの質問の一つです.
 
Argument Unpacking
*と**を使用して、1つのリストと1つの辞書をそれぞれ関数パラメータとして解くことができます.
def draw_point(x, y):
	# do something


tuple = (6, 8)
dir = {'x': 6, 'y': 8}

draw_point(*tuple)
draw_point(**dir)

Decorators 
アクセラレータの役割は、元の関数コードを変更する必要がない前提で新しい機能を追加し、元の関数を呼び出すときにまずアクセラレータを実行することです.
def print_before_func(func):
	def wrapper(*args, **kwargs):
		print("print before func")
		return func(*args, **kwargs)
	return wrapper


@print_befor_func
def write(text):
	print(text)


write(Hello world)

  :
print before func
Hello world

Dictionary default .get value 
辞書にはget()の方法があります.dict['key']の方法でkeyが存在しない場合は異常が発生します.dict.get('key')を使用するとkeyが存在しなければNoneに戻るだけです.もちろん、get()メソッドは2番目のパラメータを提供し、Noneを返すと2番目のパラメータの値が返されます.
num = dict.get('num', 0)

 
Enumerationはenumerationを使用して反復可能なオブジェクトをパッケージ化し、indexとitemを結合し、enumerationオブジェクトを返します.たとえば、次のようにします.
a = ['a', 'b', 'c', 'd']
for index, item in enumeration(a):
	print(index, item)


···
0 a
1 b
2 c
3 d
···

 
インデックスと値を同時に必要とする場合に便利です
 
For/else構文は次のとおりです.
for i in foo:
	if i == 0:
		break
else:
	print("it was never 0")

  elseコードブロックは、ループが正常に終了した後に実行されます.つまり、breakが表示されなくてもelseコードブロックが呼び出されます.上のコードは、
found = False
for i in foo:
	if i == 0:
		found = True
		break

if not found:
	print("it was never 0")

この文法は混同されやすいので、他の仲間に意味を間違えられないように注意したほうがいいです. 
上のコードも次のように等価です.
if any(i == 0 for i in foo):
	pass
else:
	print("it was never 0")

Generator expressionsこう書けば
x = (n for n in foo if bar(n))

ジェネレータが得られ、変数xに支払うことができます.次のようにジェネレータを使用できます.
for n in x:
	print(n)

このようなメリットは、メモリを節約することです.中間ストレージは必要ありませんが、次のようにすると、次のようになります.
x = [n for n in foo if bar(n)]
#     

場合によっては、これは極めて重要な速度の向上をもたらします. 
多くのif文をジェネレータの末端に追加し、forループネストを基本的にコピーすることができます.
>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
...   print i 

(0, 4)
(0, 5)
(1, 4)
(1, 5)

 
ジェネレータを使用する最大のメリットは、メモリを節約することです.各値は、リストの導出のようにすべての結果を一度に生成するのではなく、必要に応じて生成されます.
 
List steppingスライスオペレータのステップ長(step)パラメータ.例:
a = [1,2,3,4,5]
>>> a[::2]  		# iterate over the whole list in 2-increments
[1,3,5]

特殊な例x[::-1]は、「x反転」にとってかなり有用である.
>>> a[::-1]
[5,4,3,2,1]

 
もちろん、reversed()関数を使用して反転を実現することができます.違いは、reversed()が反復器を返すため、結果を必要なオブジェクトタイプに変換する追加のステップが必要です.この特性は例えば返事を判断するときによく役に立ち、一言で済む.
True if someseq == someseq[::-1] else False

 
Name string formatting%-フォーマット辞書を受信(%i%sなどにも適用)
>>> print "The %(foo)s is %(bar)i." % {'foo': 'answer', 'bar':42}
The answer is 42.

 
 
try/except/elseelse文ブロックは、try文が正常に実行されている(すなわち、except文が実行されていない)場合にのみ実行されます.finallyは異常の有無にかかわらず実行されます.
try:
     Normal execution block
except A:
     Exception A handle
except B:
     Exception B handle
except:
     Other exception handle
else:
     if no exception,get here
finally:
     this block will be excuted no matter how it goes above

 
参考記事:Hidden features of Python