J'ai écrit beaucoup de constructions comme celle-ci les deux derniers jours:
list = get_list()
if list:
for i in list:
pass # do something with the list
else:
pass # do something if the list was empty
Beaucoup de déchets et j'identifie la liste à une véritable variable (la garder en mémoire plus longtemps que nécessaire). Python a simplifié beaucoup de mon code jusqu'à maintenant ... Y a-t-il un moyen facile de faire cela?
(Ma compréhension est que le else
dans le for: else:
construire toujours des déclencheurs après avoir bouclé, vide ou pas - donc pas ce que je veux)
Utilisez une compréhension de la liste:
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]
Basé sur les autres réponses, je pense que les solutions les plus propres sont
#Handles None return from get_list
for item in get_list() or []:
pass #do something
ou la compréhension équivime
result = [item*item for item in get_list() or []]
Légèrement plus terres est:
for i in my_list:
# got a list
if not my_list:
# not a list
en supposant que vous ne changez pas la longueur de la liste dans la boucle.
Modifier d'OLI: Pour compenser mes soucis d'utilisation de la mémoire, il voudrait with
ing:
with get_list() as my_list:
for i in my_list:
# got a list
if not my_list:
# not a list
Mais oui, c'est un moyen assez simple autour de la question.
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())
Vous pouvez même extraire les actions à faire:
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)
Modifier de OLI: Ou allez-y un autre:
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)
Si vos actions sont différent, je ferais:
list_ = get_list() # underscore to keep built-in list
if not list_:
# do something
for i in list_: #
# do something for each item
Si vos actions sont similaires, c'est plus beau:
for i in list_ or [None]:
# do something for list item or None
ou si vous pourriez avoir None
comme élément de liste,
for i in list_ or [...]:
# do something for list item or built-in constant Ellipsis
Je pense que votre chemin va bien en général, mais vous pouvez envisager cette approche:
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()