Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

A quoi sert -1 ici ?

+4 votes

Afin de décider, en anglais, si on utilisera "an" ou "a" comme article avant une string "noun" qui sera donc un nom.

Si le premier caractère de noun contient une voyelle (a, e, i, o, u) alorsi il faudra utiliser "an".

ex. "A dog" "An affair"

Le code :

if "aeiou".find(noun[0]) != -1:  # first letter is a vowel
    article = "An"
else:
    article = "A"

C'est le != -1 qui me pose problème.

On aurait très bien pu faire sans d'après ma logique (si on trouve n'importe quelle voyelle ça retourne True normalement non ?) mais Python me démontre que non. Et je ne comprends pas pourquoi.

Et en plus, à quoi il se réfère ce -1 ? -1 normalement c'est le tout dernier élément d'une liste ou d'une string.
Mais ici on ne précise même pas si -1 se réfère à "noun" ou... juste à l'int -1 ?
Pourquoi en ce cas ?

EDIT: Py2

demandé 16-Fev-2015 par Hoglob (258 points)
reclassée 17-Fev-2015 par foxmask

3 Réponses

+6 votes
 
Meilleure réponse

Quand find trouve quelque chose dans la chaine de caractères, ça renvoie l'indice du début de la sous-chaine : "aaabcd".find("bc") renvoie 3. Donc str.find renvoie un entier quand il y a quelque chose à trouver, et comme c'est plus facile (en python) ou nécessaire (en C, d'où vient cette fonction) qu'une fonction renvoie toujours le même type, quand find ne trouve rien on veut renvoyer un entier qui ne puisse pas être confondu avec un résultat du type "j'ai trouvé quelque chose", donc pas un entier positif ou nul. Il reste donc les entier négatifs... et on a choisi -1 plutôt que -42 ou -132456789.

Pour savoir si un mot commence par une voyelle, ce code-ci est plus simple :

VOWELS = "aeiou" # ou set("aeiou") mais ça ne change pas grand'chose
if noun[0].lower() in VOWELS:
    # do something
répondu 16-Fev-2015 par Phynx (298 points)
sélectionné 16-Fev-2015 par Hoglob
+7 votes

C'est d'une "vieille" méthode de Python 2 qu'il s'agît ici en l'occurrence, un relicat des fonctions de C :
https://docs.python.org/2/library/string.html#string.find

Je cite :

Return the lowest index in s where the substring sub is found such that sub is wholly contained in s[start:end]. Return -1 on failure.

En gros, ça retourne la position du premier élément trouvé qui correspond et -1 en cas d'échec.

Personnellement, j'utiliserai plutôt string.startswith.
https://docs.python.org/2/library/stdtypes.html#str.startswith

répondu 16-Fev-2015 par debnet (1,002 points)
+8 votes

Suffit de tester calmement:

>>> "aeiou".find("a")
0
>>> "aeiou".find("e")
1
>>> "aeiou".find("i")
2
>>> "aeiou".find("o")
3
>>> "aeiou".find("u")
4
>>> "aeiou".find("d")
-1
>>> "aeiou".find("z")
-1
>>> 

Tu remarques que l'index est renvoyé si la lettre existe dans ta chaine, autrement, -1 est renvoyé.
Et pour confirmer, help est ton ami:

Help on built-in function find:

find(...)
    S.find(sub [,start [,end]]) -> int

    Return the lowest index in S where substring sub is found,
    such that sub is contained within S[start:end].  Optional
    arguments start and end are interpreted as in slice notation.

    Return -1 on failure.
(END)

Donc, si -1 est retourné c'est que je n'ai pas de voyelle.

Conclusion:
Oui, c'est une maniere de faire. Non, ce n'est pas la seule maniere de faire. Comme le precise bien @debnet, startswith fait bien l'affaire et est de loin plus pythonique.

répondu 16-Fev-2015 par Nsukami_ (1,976 points)
...