いくつかの機会に、リスト内包表記またはジェネレーター式を短絡するための Python 構文が必要でした。
これは単純なリスト内包表記であり、Python での同等の for ループです。
my_list = [1, 2, 3, 'potato', 4, 5]
[x for x in my_list if x != 'potato']
result = []
for element in my_list:
if element != 'potato':
result.append(element)
この言語では、短絡する内包表記はサポートされていません。提案された構文、および Python の同等の for ループ:
[x for x in my_list while x != 'potato']
# --> [1, 2, 3]
result = []
for element in my_list:
if element != 'potato':
result.append(element)
else:
break
無限シーケンスを含む任意のイテラブルで動作し、ジェネレータ式の構文に拡張できる必要があります。私はlist(itertools.takewhile(lambda x: x != 'potato'), my_list)
オプションとして認識していますが、
- それは特にpythonicではありません-しばらく理解するほど読みやすくはありません
- おそらくCPythonの理解ほど効率的でも高速でもありません
- 出力を変換するには追加のステップが必要ですが、それは直接内包することができます。
[x.lower() for x in mylist]
- 原作者でさえあまり好きではないようです。
私の質問は、なぜ文法をこのユースケースに拡張するのが良い考えではないのか、それともPython開発者がめったに役に立たないと考えているためにそれが不可能なのかについて、理論的なしわがありましたか? これは言語への単純な追加であり、便利な機能のように思えますが、隠れた機微や複雑さを見落としている可能性があります。