最初のアイテムまたはNoneを返すPythonイディオム?
最もPython的なアプローチは、最も支持された回答が示したものであり、質問を読んだときに最初に頭に浮かんだことでした. 最初に空のリストが関数に渡された場合の使用方法は次のとおりです。
def get_first(l):
return l[0] if l else None
リストがget_list
関数から返された場合:
l = get_list()
return l[0] if l else None
Python 3.8 の新機能、代入式
代入式は、インプレース代入演算子 (非公式に wallus 演算子と呼ばれます) を:=
使用します。これは Python 3.8 で新しく導入されたもので、チェックと代入をインプレースで行うことができ、ワンライナーが可能になります。
return l[0] if (l := get_list()) else None
長年の Python ユーザーとして、これは 1 つの行で多くのことをしようとしているように感じます。パフォーマンスが同等であると推定される方がより良いスタイルだと思います。
if l := get_list():
return l[0]
return None
この定式化を支持するのは、言語へのこの変更を提案する PEPの Tim Peter のエッセイです。彼は最初の定式化については言及しませんでしたが、彼が気に入った他の定式化に基づいて、彼は気にしないと思います.
ここでこれを行うために実証された他の方法と説明
for
これを行うための賢い方法を考え始めたとき、これが私が考えた2番目のことです:
for item in get_list():
return item
これは、関数がここで終了すると仮定し、空のリストを返すNone
場合は暗黙的に返します。get_list
以下の明示的なコードはまったく同等です。
for item in get_list():
return item
return None
if some_list
以下も提案されました (間違った変数名を修正しました)。これも暗黙の を使用しNone
ます。これは、発生しない可能性のある反復の代わりに論理チェックを使用するため、上記よりも望ましいでしょう。これにより、何が起こっているのかをすぐに理解できるようになります。しかし、可読性と保守性のために書いている場合はreturn None
、最後に明示的に追加する必要があります。
some_list = get_list()
if some_list:
return some_list[0]
スライスor [None]
してゼロ番目のインデックスを選択
これは、最も投票された回答にもあります。
return (get_list()[:1] or [None])[0]
スライスは不要で、メモリ内に追加の 1 項目リストを作成します。以下は、よりパフォーマンスが向上するはずです。説明すると、最初の要素がブール コンテキストにあるor
場合は 2 番目の要素を返すため、空のリストを返す場合、括弧に含まれる式は「なし」のリストを返し、インデックスによってアクセスされます。False
get_list
0
return (get_list() or [None])[0]
次のものは、最初の項目がブール コンテキストにある場合に 2 番目の項目を返すという事実を使用しますTrue
。これは my_list を 2 回参照するため、三項式よりも優れているわけではありません (技術的にはワンライナーではありません)。
my_list = get_list()
return (my_list and my_list[0]) or None
next
次に、ビルトインnext
とiter
return next(iter(get_list()), None)
説明するために、メソッドiter
を持つイテレータを返します。.next
( .__next__
Python 3.) 次に、ビルトインnext
がそのメソッドを呼び出し.next
、イテレータが使い果たされた場合、与えられたデフォルトの を返しますNone
。
冗長な三項式 ( a if b else c
) と折り返し
以下が提案されましたが、論理は通常、否定的ではなく肯定的に理解されるため、逆の方が望ましいでしょう。は 2 回呼び出されるためget_list
、結果が何らかの方法でメモ化されない限り、パフォーマンスが低下します。
return None if not get_list() else get_list()[0]
より良い逆:
return get_list()[0] if get_list() else None
さらに良いことに、ローカル変数を使用してget_list
一度だけ呼び出されるようにすると、最初に説明した推奨される Pythonic ソリューションが得られます。
l = get_list()
return l[0] if l else None