Un coffre-fort (max) de la fonction pour vider les listes
De l'évaluation,
max_val = max(a)
sera la cause de l'erreur,
ValueError: max() arg is an empty sequence
Est-il un meilleur moyen de protection contre cette erreur autre que try
, except
attraper?
a = []
try:
max_val = max(a)
except ValueError:
max_val = default
- Le
default
argument spécifie un objet de la déclaration si la condition itérable est vide. - Pourquoi vous ne post réponse comme réponse?!
- parce que c'est trop simple.
- Quel est le problème avec l'affichage des réponses qui sont "trop simple"? Maintenant, quelqu'un d'autre...
- De toute façon si vous allez gérer l'erreur, vous devez utiliser
except ValueError:
, pasexcept:
. Dans votre exemple, vous pourrez attraperTypeError: 'builtin_function_or_method' object is not subscriptable
, alors peu importe quelle valeura
a,max_val
sera à la finFalse
. - c'est vrai que je n'avais pas considéré que
InformationsquelleAutor Alexander McFarlane | 2016-03-22
Vous devez vous connecter pour publier un commentaire.
En Python 3.4+, vous pouvez utiliser
default
argument mot-clé:Dans la version inférieure, vous pouvez utiliser
or
:REMARQUE: La deuxième approche ne fonctionne pas pour tous les iterables. surtout pour itérateur qui donnera rien, mais considéré comme valeur de vérité.
my_max
fonction qui imite le plus récent comportement.max(iter([]) or 0)
est précisément ce qui m'a donné le chagrin à la première place... avez-vous d'autres suggestions sur quoi faire avec elle? Deuxièmement, il n'est jamais venu à moi pour vérifier les docs... j'ai supposé que tel d'une fonction simple qui était l'un-en-un processus deone-in-one-out process
. Signifie-t-il une tâche commune?Dans les versions de Python âgés de plus de 3.4 vous pouvez utiliser
itertools.chain()
pour ajouter une autre valeur à la éventuellement séquence vide. Cela permettra de gérer tout vide itérable mais notez que ce n'est pas exactement la même que la fourniture de ladefault
argument de la plus-value est toujours inclus:Mais en Python 3.4, la valeur par défaut est ignoré si la séquence n'est pas vide:
chain
plus simple liste de concaténation par exemplemax( [42], [] )
où la valeur par défaut est42
?max
avec plusieurs arguments ont un sens différent que de l'appeler avec un seul argument. Avec un seul objet iterable argumentmax
sera de retour le plus grand élément qu'il contient, mais avec de multiples arguments, il les compare directement (c'est à dire ne pas effectuer une itération). par exemple,max([42], [])
une liste[42]
maismax(chain([42], []))
etmax([], default=42)
à la fois donner42
.Une autre solution pourrait être en utilisant des opérateurs ternaires:
ou
Le max d'une séquence vide "devraient" être un infiniment petit chose quel que soit le type des éléments de la séquence. Malheureusement, (1) avec une séquence vide vous ne pouvez pas dire quel est le type de ces éléments signifient, et (2) il n'y a, par exemple, aucune une telle chose comme la plus négative entier en Python.
Si vous avez besoin d'aide
max
si vous souhaitez faire quelque chose d'intelligent dans ce cas. Dans les dernières versions de Python il y a undefault
argumentmax
(qui me semble un nom trompeur, mais jamais l'esprit) qui sera utilisé si vous passez dans une séquence vide. Dans les anciennes versions, vous avez simplement à s'assurer que la séquence que vous transmettez n'est pas vide (par exemple, paror
ing avec une séquence singleton contenant la valeur que vous souhaitez utiliser dans ce cas.[ÉDITÉ longtemps après la publication parce que Yaakov Rot aimablement fait remarquer dans les commentaires que j'avais écrit "l'infiniment grand", où j'aurais écrit "l'infiniment petit".]
Compte tenu de tous les commentaires ci-dessus, il peut être un wrapper comme ceci: