Python構文特性
4161 ワード
Python構文特性
Pythonを使って書くのも長い間、自分のコードをどのように最適化するかを考えて、いくつかの問題を探しました.その中で印象的だったのがstackoverflowの質問の一つです.
Argument Unpacking
*と**を使用して、1つのリストと1つの辞書をそれぞれ関数パラメータとして解くことができます.
Decorators
アクセラレータの役割は、元の関数コードを変更する必要がない前提で新しい機能を追加し、元の関数を呼び出すときにまずアクセラレータを実行することです.
Dictionary default .get value
辞書には
Enumerationはenumerationを使用して反復可能なオブジェクトをパッケージ化し、indexとitemを結合し、enumerationオブジェクトを返します.たとえば、次のようにします.
インデックスと値を同時に必要とする場合に便利です
For/else構文は次のとおりです.
この文法は混同されやすいので、他の仲間に意味を間違えられないように注意したほうがいいです.
上のコードも次のように等価です.
Generator expressionsこう書けば
ジェネレータが得られ、変数xに支払うことができます.次のようにジェネレータを使用できます.
このようなメリットは、メモリを節約することです.中間ストレージは必要ありませんが、次のようにすると、次のようになります.
場合によっては、これは極めて重要な速度の向上をもたらします.
多くのif文をジェネレータの末端に追加し、forループネストを基本的にコピーすることができます.
ジェネレータを使用する最大のメリットは、メモリを節約することです.各値は、リストの導出のようにすべての結果を一度に生成するのではなく、必要に応じて生成されます.
List steppingスライスオペレータのステップ長(step)パラメータ.例:
特殊な例
もちろん、
Name string formatting%-フォーマット辞書を受信(%i%sなどにも適用)
try/except/elseelse文ブロックは、try文が正常に実行されている(すなわち、except文が実行されていない)場合にのみ実行されます.finallyは異常の有無にかかわらず実行されます.
参考記事:Hidden features of 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