Python 3kにはどの機能ツールが残っていますか?
-
08-07-2019 - |
質問
mapやreduceなど、将来のpythonからいくつかの機能関数を削除することに関するいくつかのエントリを読みました。
機能拡張に関する公式ポリシーは何ですか?
ラムダ関数は残りますか?
解決
まあ、Python 3.0と3.1はすでにリリースされているので、自分でこれを確認できます。最終結果として、マップとフィルターはビルトインとして保持され、ラムダも保持されました。唯一の変更点は、reduceがfunctoolsモジュールに移動したことです。あなたがする必要があるのは
from functools import reduce
それを使用します。
Future 3.xリリースでは、この点で3.0および3.1との下位互換性が維持されると予想されます。
他のヒント
Python 3.xでは、Pythonには、リスト内包表記、ジェネレータ式、イテレータとジェネレータ、および any()
や可能な限り短絡評価を行うall()
。
Pythonの" Benevolent Dictator For Life" map()
を削除するというアイデアを浮かびました。リストの内包表記でその効果を簡単に再現できるからです。
lst2 = map(foo, lst)
lst3 = [foo(x) for x in lst]
lst2 == lst3 # evaluates True
Pythonの lambda
機能は削除または名前変更されておらず、おそらく削除されることはありません。ただし、おそらくより強力になることはありません。 Pythonの lambda
は単一の式に制限されています。ステートメントを含めることはできず、複数行のPythonコードを含めることはできません。
Pythonの平凡で標準的な def
は、 lambda
オブジェクトと同じくらい簡単に渡すことができる関数オブジェクトを定義します。本当にしたい場合は、定義後に関数の名前を解除することもできます。
例:
# NOT LEGAL PYTHON
lst2 = map(lambda x: if foo(x): x**2; else: x, lst)
# perfectly legal Python
def lambda_function(x):
if foo(x):
return x**2
else:
return x
lst2 = map(lambda_function, lst)
del(lambda_function) # can unbind the name if you wish
実際に「三項演算子」を使用できることに注意してください。 lambda
で上記の例は少し工夫されています。
lst2 = map(lambda x: x**2 if foo(x) else x, lst)
ただし、一部の複数行関数は lambda
に強制するのが難しく、単純な通常の複数行関数としてより適切に処理されます。
Python 3.xの機能は失われていません。リストの内包表記とジェネレーター式はおそらく map()
よりも好ましいという一般的な感覚があります。特に、ジェネレータ式を使用して map()
と同等の処理を行うことができますが、リストを割り当ててから再び解放する必要はありません。例:
total = sum(map(lst, foo))
total2 = sum(foo(x) for x in lst)
assert total == total2 # same result
Python 2.xでは、 map()
は新しいリストを割り当てます。このリストは合計され、すぐに解放されます。ジェネレーター式は、一度に1つの値を取得し、値のリスト全体のメモリーを決して占有しません。
Python 3.xでは、 map()
は" lazy"です。したがって、どちらもほぼ同じくらい効率的です。しかし、結果として、Python 3.xでは、3項ラムダの例をリストに展開する必要があります。
lst2 = list(map(lambda x: x**2 if foo(x) else x, lst))
リストの内包表記を書くのが簡単になりました!
lst2 = [x**2 if foo(x) else x for x in lst]