Python is and is not

Inscrit
12 Avril 2017
Messages
72
Reactions
2
#1
Salut tlm,

Savez vous pourquoi lorsque je lance ce programme :

Python:
# Ce programme détermine le nombre de voyelle et de consonne dans une phrase.

sentence = input("Entrer votre mot : \n")
string = "str"
counterOfVowel = 0
counterOfConsonant = 0
if sentence is not string : print("Erreur, le type de donnée est incorrect. Veuillez saisir un string et non ce type :",type(sentence))
else :
    for letter in sentence :
        if letter in "AEIOUYaeiouy" :
            print(letter," : voyelle")
            counterOfVowel += 1
        else :
            print(letter,": consonne")
            counterOfConsonant += 1
print("Cette phrase comporte :",counterOfVowel,"voyelles\nCette phrase comporte :",counterOfConsonant,"consonnes.")
J'obtiens à chaque fois :

Erreur, le type de donnée est incorrect. Veuillez saisir un string et non ce type : <class 'str'>
Cette phrase comporte : 0 voyelles
Cette phrase comporte : 0 consonnes.
Pourtant la condition sentence is not string est false ??? Ou j'ai du mal saisir le keyword is et is not ??

J'ai également essayé if sentence is not str: print("Erreur, le type de donnée est incorrect. Veuillez saisir un string et non ce type :",type(sentence))
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#2
Python:
if sentence is not string
string doit être un mot clé réservé par python, donc il y a conflit avec la variable string que tu déclare.
Change le nom de ta variable.
 
Inscrit
12 Avril 2017
Messages
72
Reactions
2
#3
Python:
if sentence is not string
string doit être un mot clé réservé par python, donc il y a conflit avec la variable string que tu déclare.
Change le nom de ta variable.
Enfaite non, string n est pas un keyword en python c est str, de plus même si je remplace string par type(str) j aurais toujours la même erreur.
Python:
if sentence is not type(str) : print("Erreur, le type de donnée est incorrect. Veuillez saisir un string et non ce type :",type(sentence))
 
Dernière édition:
Inscrit
19 Juillet 2017
Messages
18
Reactions
1
#6
Python:
while True:
    sentence = input("Entrer votre mot : \n")
    if isinstance(sentence, str):
        break
    print("Erreur, le type de donnée est incorrect. Veuillez saisir un string et non ce type :", type(sentence))

a = {'vowel': {'elt': 'aeiouy',
               'count': 0},

     "consonant": {'elt': 'bcdfghjklmnpqrstvwxz',
                   'count': 0}
     }

for letter in sentence:
    for typeOfSound, info in a.items():
        if letter.lower() in info['elt']:
            print(letter.lower())
            info['count'] += 1
            break # si on a trouver le type ça sert à rien de tester les autres types

print('Cette phrase comporte :')
for typeOfSound, info in a.items():
    print(typeOfSound, ':', info['count'])
J'ai refait le code pour te montrer quelque point :

Dans cette example ça sert à rien de tester si ce que retourne input est un str puisque c'est le cas !
input() renvoie toujours une chaîne de caractères.

Cependant dans d'autre cas (si tu veux par example un int) il faut proceder un peu différemment:
On utilise generalement la structure try/except.

Python:
try :
    sentence = int(sentece)
except ValueError:
    print('Veuillez entrer un entier relatif')
else :
    break
apres j'ai changer la manière de tester : j'ai utiliser un dictionnaire ce qui te permet de tester de nombreuse appartenance avec une boucle au lieu de tester avec une succession de if / elif.

A noté aussi ici que ta structure fonctionne pas :

Python:
  if letter in "AEIOUYaeiouy" :
            print(letter," : voyelle")
            counterOfVowel += 1
        else :
            print(letter,": consonne")
            counterOfConsonant += 1
Puisque dans le cas ou tu des chiffres ou de la ponctuation ca va incrémenter ton counterOfConsonant.

Petite astuce si tu veux simplement tester si ton caractère est une lettre et que tu te fiche de la Maj tu peux simplement convertir ta chaine
en maj avec .upper() ou .lower() pour mettre en minuscule.

Voila en ésperant t'avoir aider ^^
 
Inscrit
28 Juin 2013
Messages
37
Reactions
29
#7
Sinon une autre façon de faire:
Python:
def count_voyels(string):
    return sum([letter.lower() in "aeiouy" for letter in string])
Si vraiment tu veux aussi compter les consonnes, voici ce qui pourrait faire l'affaire (sans la gestion des entrées, le message précédent gère déjà bien ce point):
Python:
# Toutes les lettres en minuscules
min_letters     = set([chr(ascii_code) for ascii_code in range(ord('a'), ord('z')+1)])

# Toutes les voyelles et consonnes en minuscules
min_vowels      = set("aeiouy")
min_consonants  = min_letters - min_vowels

def is_vowel(letter):
    return letter in min_vowels;

def is_consonant(letter):
    return letter in min_consonants

# Ensuite on compte
def vowels_number(string):
    return sum([is_vowel(letter) for letter in string])

def consonants_numbers(string):
    return sum([is_consonant(letter) for letter in string])

def vowels_and_consonant_number(string):
    # On pourrait ré-utiliser les deux fonctions précédentes ici mais
    # ça implique de parcourir 2 fois la chaîne.
    vowels_count, consonant_count = 0, 0
    for letter in string.lower():
        if is_vowel(letter):
            vowels_count += 1
        elif is_consonant(letter):
            consonant_count += 1
    return vowels_count, consonant_count
 
Inscrit
12 Avril 2017
Messages
72
Reactions
2
#8
Merci après je ne savais pas qu'on pouvait renvoyer plusieurs choses. Je vais y aller molo je débute en python ^^'
 
Inscrit
19 Juillet 2017
Messages
18
Reactions
1
#9
Dernière édition:
Inscrit
12 Avril 2017
Messages
72
Reactions
2
#10
Haut Bas