過去数日間、私はこのような多くの構成を書いてきました:
list = get_list()
if list:
for i in list:
pass # do something with the list
else:
pass # do something if the list was empty
ジャンクがたくさんあるので、リストを実際の変数に割り当てます(必要以上に長くメモリに保持します)。 Pythonは、これまでに私のコードの多くを簡略化しています...これを行う簡単な方法はありますか?
(私の理解では、for: else:
構文のelse
は、ループした後、常に、空であるかどうかにかかわらずトリガーされるので、私が望んでいるものではありません)
リスト内包表記を使用します。
def do_something(x):
return x**2
list = []
result = [do_something(x) for x in list if list]
print result # []
list = [1, 2, 3]
result = [do_something(x) for x in list if list]
print result # [1, 4, 9]
他の答えに基づいて、私は最もきれいな解決策は
#Handles None return from get_list
for item in get_list() or []:
pass #do something
または理解力と同等
result = [item*item for item in get_list() or []]
もう少し簡潔です:
for i in my_list:
# got a list
if not my_list:
# not a list
ループ内のリストの長さを変更していないと仮定します。
Oliから編集:メモリ使用の心配を補うために、with
ingが必要になります。
with get_list() as my_list:
for i in my_list:
# got a list
if not my_list:
# not a list
しかし、はい、それは問題を回避する非常に簡単な方法です。
def do_something_with_maybe_list(maybe_list):
if maybe_list:
for x in list:
do_something(x)
else:
do_something_else()
do_something_with_maybe_list(get_list())
実行するアクションを抽出することもできます。
def do_something_with_maybe_list(maybe_list, process_item, none_action):
if maybe_list:
for x in list:
process_item(x)
else:
none_action()
do_something_with_maybe_list(get_list(), do_something, do_something_else)
do_something_with_maybe_list(get_otherlist(), do_other, do_still_other)
Oliから編集:またはさらに進んでください:
def do_something_with_maybe_list(maybe_list, process_item, none_action):
if maybe_list:
return process_list(maybe_list)
return none_action()
do_something_with_maybe_list(get_list(), do_something, do_something_else)
do_something_with_maybe_list(get_otherlist(), do_other, do_still_other)
あなたの行動が異なるの場合、私はそうします:
list_ = get_list() # underscore to keep built-in list
if not list_:
# do something
for i in list_: #
# do something for each item
アクションがsimilarの場合、これはより美しくなります。
for i in list_ or [None]:
# do something for list item or None
または、リスト要素としてNone
がある場合は、
for i in list_ or [...]:
# do something for list item or built-in constant Ellipsis
私はあなたの方法は一般的に大丈夫だと思いますが、あなたはこのアプローチを考えるかもしれません:
def do_something(item):
pass # do something with the list
def action_when_empty():
pass # do something if the list was empty
# and here goes your example
yourlist = get_list() or []
another_list = [do_something(x) for x in yourlist] or action_when_empty()