J'ai ce code qui trouve le plus grand index d'un caractère spécifique dans une chaîne, mais je voudrais qu'il déclenche un ValueError
lorsque le caractère spécifié ne se produit pas dans une chaîne.
Donc quelque chose comme ça:
contains('bababa', 'k')
entraînerait un:
→ ValueError: could not find k in bababa
Comment puis-je faire ceci?
Voici le code actuel de ma fonction:
def contains(string,char):
list = []
for i in range(0,len(string)):
if string[i] == char:
list = list + [i]
return list[-1]
Réponses:
raise ValueError('could not find %c in %s' % (ch,str))
la source
raise ValueError
placeraise ValueError()
?Voici une version révisée de votre code qui fonctionne toujours et qui illustre comment élever un
ValueError
comme vous le souhaitez. À propos, je pensefind_last()
,find_last_index()
ou quelque chose de similaire serait un nom plus descriptif pour cette fonction. Ajout à la confusion possible est le fait que Python a déjà une méthode d'objet conteneur nommée__contains__()
qui fait quelque chose d'un peu différent, en ce qui concerne les tests d'appartenance.Mise à jour - Un moyen nettement plus simple
Hou la la! Voici une version beaucoup plus-essentiellement en une ligne qui est probablement plus rapide concise car elle inverse (via
[::-1]
) la chaîne avant de faire une recherche en avant à travers elle pour le premier caractère correspondant et il le fait en utilisant la chaîne intégrée rapideindex()
méthode . En ce qui concerne votre question réelle, un petit avantage supplémentaire qui vient avec l'utilisationindex()
est qu'il déclenche déjà unValueError
lorsque la sous-chaîne de caractères n'est pas trouvée, donc rien de plus n'est nécessaire pour que cela se produise.Le voici avec un test unitaire rapide:
la source
for
boucle. 1ère fonction: FAIL pourcontains('foo', 'f')
.for
boucle dans une réponse, bien que l'une apparaisse dans leur propre code. Quoi qu'il en soit ma 1ère leur montre comment la fonction d'raise
unValueError
lorsque le personnage ne se trouve pas qui est ce qu'ils ont demandé. et j'ai illustré comment faire dans le contexte d'unfor
. Même s'ils en veulentfor
pour une raison quelconque, je pense que d'autres pourraient trouver la 2ème version sans une au moins assez intéressante.for
boucle, il ne d'une manière de répondre à la question réelle sur la façon d'raise
unValueError
lorsque le personnage ne se trouve pas dans la chaîne - à savoir en appelant quelque chose d' autre qui le fait pour vous. Il y a aussi la possibilité que l'OP puisse surmonter leurfor
-fixation ou quoi que ce soit après avoir vu unefor
solution sans-solution ou se familiariser plus tard avec Python.la source
la source