[Python] Fonction qui renvoie vrai ou faux si une chaîne de caractères quelconque est un numéro de téléphone valide

a marqué ce sujet comme résolu.

Je pense être parvenu à éliminer une chaîne de caractères contenant - ou + de 10 caractères

def verification(n) :
    vrai =['0','1','2','3','4','5','6','7','8','9',' ',]
    if longueur != 10 :
        print('Ce numéro est invalide')
    else :
        print('Ce numéro est valide') 
numero = input('Taper un numéro')
longueur = len(n) 

Voilà ce que j’ai fait, je sais que c’est pas beaucoup mais j’ai vraiment des lacunes en programmation.

Je vous demande donc votre aide, merci d’avance.

Reymond

Non, du dois commencer par ce qui éliminerais de suite ton numéro. Tu la déjà fait dans ton code. Si une chaîne de caractère (puisque c’est de cela qu’il s’agit) ne fait pas au minimum 10 caractères c’est pas la peine d’aller plus loin tu peu le traduire comme ça :

if len(number_tel)<10:
        return false

ensuite tu peu devenir plus précis a t’il des points ou des espaces et si oui sont t’il au bon nombres

  if "." in tel or " " in tel:
        for i in tel:
            if i == ".":
                number +=1
            elif i == " ":
                number +=1

et on peu continué +33 ? etc…

tu vois ou je veux en venir comme ta dit elegance prend un crayon note toi tout se qui fait un numéro de téléphone un numéro valide ce sera tes conditions. Puis après tu pourras commencer à le coder. Il faut ensuite que tu te lance! Récupère ton numéro et fait déjà les tests essaie de tromper ton code et améliore le . Poste le ici on t’aidera à trouver ses faiblesses pour l’amélioré.

+0 -0

Je n’ai pas bien compris ce passage là également :

ensuite tu peu devenir plus précis a t’il des points ou des espaces et si oui sont t’il au bon nombres

  if "." in tel or " " in tel:
        for i in tel:
            if i == ".":
                number +=1
            elif i == " ":
                number +=1

S’il y a des espaces/points alors ils devraient normalement être au nombre de 4

Je suis vraiment nul en programmation :lol:

Je ne sais pas comment faire la traduction en Python.

Si on pouvait tout m’écrire puis me l’expliquer, ça m’arrangerait. C’est vrai que j’en demande beaucoup mais si c’était possible cela serait formidable.

Merci d’avance pour votre aide.

Je ne sais pas comment faire la traduction en Python.

Si on pouvait tout m’écrire puis me l’expliquer, ça m’arrangerait.

C’est trop facile ça :p

Fais la traduction en pseudo code français (ou même en pseudo Python) si tu n’es pas à l’aise en Python, et je suis sûr qu’on pourra t’indiquer les constructions Python adéquates.

Le problème en question n’est pas Python en soi, mais l’algorithme de vérification des numéros. C’est, je pense, le truc principal que le prof veut évaluer.

+3 -0

Si je vous dis que :

Le numéro commence par '+’,alors vérifier que le numéro commence par '+33’, et si oui, remplacer ce '+33' par le caractère '0’, pour rentrer dans le cas général.

Vous pouvez m’aider à le traduire ?

Préférez-vous faire un par un ou que j’envoie tout mon algorithme ?

Merci d’avance pour votre aide.

Poste l’algorithme complet, oui.

Mais la « traduction » ne te sera pas servie sur un plateau, ce sont des indications qui te seront données.

Par exemple, pour le cas que tu exposes, il faudra que tu utilises une structure conditionnelle if. Pour le traitement de la chaîne, tu peux accéder au premier caractère avec s[0], tester si une chaîne commence par une autre à l’aide de la méthode startswith.
Les chaînes possèdent aussi une méthode replace qui renvoie une nouvelle chaîne modifiée, tu as aussi le slicing qui permet d’extraire des sous-chaînes (s[3:] pour récupérer une copie de s sans les 3 premiers caractères).

Algorithme:

Le numéro contient t-il 10 caractères minimum ?

Le numéro contient t’il des lettres ?

Si le numéro commence par '+’,alors vérifier que le numéro commence par '+33’, et si oui, remplacer ce '+33' par le caractère '0’, pour rentrer dans le cas général.

Si le numéro ne contient ni espace ni point, alors vérifier que le numéro a bien 10 chiffres.

Si le numéro contient des espaces ou des points alors vérifier que le numéro en a 4.

Si le numéro contient des espaces ou des points alors vérifier qu’ils sont bien situés entre chaque paire de caractères.

Si le numéro commence par '+’,alors vérifier que le numéro commence par '+33’, et si oui, remplacer ce '+33' par le caractère '0’, pour rentrer dans le cas général.

Tu peux faire plus simple : si le numéro ne commence pas par '+33' ou par '0', alors il est invalide. Pas besoin de vérifier s’il y a un '+', pour ensuite vérifier s’il y a un '+33'. Ces deux vérifications peuvent se faire simplement avec les slicing dont entwanne a parlé. Voici un exemple de slicing. Je t’invite à jouer un peu avec ça dans un REPL.

>>> 'Bonjour'[0]
'B'
>>> 'Bonjour'[0:3]
'Bon'
>>> 'Bonjour'[:3] # Même chose que [0:3], c'est un raccourci syntaxique
'Bon'
>>> 'Bonjour'[3:] # Attention, pas la même chose que [:3] !
'jour'

À partir de là, tu dois pouvoir vérifier les premiers caractères de la chaîne. Tu devrais aussi pouvoir extraire la partie qui t’intéresse sans le préfixe.

Si le numéro ne contient ni espace ni point, alors vérifier que le numéro a bien 10 chiffres.

Il y a une construction Python pour vérifier si une chaîne contient au moins une fois un certain caractère. Voici un exemple :

>>> 'a' in 'abcde'
True
>>> 'z' in 'abcde'
False

Comme tu peux le remarquer, une expression avec in renvoie True ou False. Tu peux donc les utiliser directement dans tes condition if.

Une autre méthode qui te sera utile : replace. Cette méthode remplace tous les caractères par un autre. Voici un exemple où je remplace les 'e' par des 'x' :

>>> 'Zeste de savoir'.replace('e', 'x')
'Zxstx dx savoir'

Le petit truc à savoir, c’est que '' (la chaîne vide, de longueur 0) est aussi un caractère. Du coup, tu peux utiliser replace pour remplace un caractère par la chaîne vide. Je t’invite à essayer par toi-même pour découvrir le résultat ;)

Fais l’effort de reformuler ton algorithme.

Tu commences par : Le numéro contient t-il 10 caractères minimum ?

Ok. Mais la ligne d’en-dessous devrait être du type : Si Oui, alors faire telle action, et si Non, alors faire telle autre action. Ca ne devrait pas être une nouvelle question.

Pareil pour la 2ème question … chaque test, chaque question devrait être suivi d’une action : si Réponse 1 alors sinon…

Sinon, il y a un cas où on peut avoir 5 points et le numéro est valide : +33.1.23.45.67.89 (en tout cas, je le considère valide, alors que je considère +331.23.45.67.89 comme non valide.

+33.1.23.45.67.89 (en tout cas, je le considère valide, alors que je considère +331.23.45.67.89 comme non valide.

elegance

J’aurais tendance à considérer que le +33 se mets en lieu et place du zéro. Soit +331. => valide et +33.1 => non valide , pour moi Mais bon c’est hors sujet pour le moment . :)

+0 -0

Merci elegance,je pense avoir reformuler mon algorithme:

Le numéro contient t-il 10 caractères minimum ?

Sinon afficher "Ce numéro est invalide".

Si oui alors vérifier que ce numéro contient des lettres.

Si oui alors afficher "Ce numéro est invalide".

Sinon vérifier que le numéro commence par '+33' ou '0’.

Si oui remplacer ce '+33' par le caractère '0’, pour rentrer dans le cas général.

Sinon afficher "Ce numéro est invalide".

Vérifier si le numéro contient des espaces ou points.

Si oui alors vérifier que le numéro en a bien 4 entre chaque paire de chiffres. (XX.XX.XX.XX.XX)

Sinon afficher "Ce numéro est valide"

Si le numéro a des espaces ou points mais qui ne sont pas au nombre de 4 alors afficher "Ce numéro est invalide"

Voilà. Tu as fait le plus difficile. Ou quasiment.

Si une chaine est comme celle-ci: "01.23.45 67 89" (donc quelques points et quelques espaces), tu veux que ta procédure renvoie Vrai ou Faux ?

En lisant ton algorithme, ce n’est pas clair.

Il faut te poser toutes ces questions maintenant. Si tu entreprends la traduction en Python ou en n’importe quel langage sans avoir clairement tranché des cas comme ça, tu vas te poser des questions plus loin. Et plus ces questions arrivent tard dans le processus, plus elles peuvent te poser des problèmes.

Dans un monde idéal, il y a la personne qui comprend le sujet et qui fait l’algorithme, et ensuite, il y a une autre personne qui se moque complètement de savoir de quoi on parle, elle ne fait qu’un travail de traduction : traduire les règles données par l’algorithme vers une langue autre (la langue Python)

Une fois que ton algorithme est complet, que tous les cas sont prévus, la traduction en Python sera quasiment une traduction mot-à-mot.

Sinon vérifier que le numéro commence par '+33' ou '0’.

Pas besoin du "ou" si tu exécute la ligne juste en bas.

Si oui remplacer ce '+33' par le caractère '0’, pour rentrer dans le cas général.

Si le numéro a des espaces ou points mais qui ne sont pas au nombre de 4 alors afficher "Ce numéro est invalide"

Reymond

Dois-tu afficher "Numéro valide" ou tu dois renvoyer un vrai ou un faux ?

Mais c’est pas mal je pense que tu déjà coder cela. Il te suffi juste de remplacer les "si" => if et "sinon" => else et poste tes problèmes et code au fur et à mesure

+0 -0

Ce qui pourrait t’être utile, c’est d’établir une liste de différents cas emblématiques, en notant pour chaque élément si la fonction doit renvoyer vrai ou faux.

Et par la suite tu pourras transformer ça en tests pour vérifier le bon déroulement de la fonction.

Donc modifie ton algorithme :

Si le numero contient à la fois des points et des espaces, renvoyer faux
Vérifier si le numéro contient des espaces ou points.

L’algorithme me semble fini. Maintenant, traduction quasi mot-à-mot en Python.

Et comme suggéré par Entwanne, prépare une liste de cas emblématiques pour vérifier que la fonction obtenue fait bien ce qu’on attend d’elle.

Une liste de cas emblématiques comme ça ?

Point :

+331.12.34.56.78 : Valide

01.23.45.67.89 : Valide

01.234.567.89 : Invalide

01.23.4a.bc.56 : Invalide

01.23.45.67.899:Invalide

01.23.45.67 :Invalide

01.23.45.678.9:Invalide

Espace:

+331 12.34 56 78 : Valide

01 23 45 67 89 : Valide

01 234 567 89 : Invalide

01 23 4a bc 56 : Invalide

01 23 45 67 899: Invalide

01 23 45 67:Invalide

01 23 45 678 9: Invalide

Sans point ni espace:

+33123456789 : Valide

0123456789 : Valide

01234abc56 : Invalide

01234567899 : Invalide

0123456 : Invalide

Salut, avec une liste des caractères autorisés ?

liste_caracteres_autorises = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '.',  ' ']

J’ai peut être oublié des caractères que tu peux accepter.

Si le caractère testé n’est pas dans la liste, ça part en erreur.

+0 -0

@Reymond c’est là que python est super ( par rapport au c++ que j’apprend actuellement qui est une tanass!!)

sur google il y auras très souvent une réponse claire à tes problèmes

Tout est *objet en python donc si tu prend ta chaîne de caractère ( qui est donc un *objet ) tu lui applique une méthode qui est déjà *instancier et elle te rendra un grand service ex:

"1".isdigit()
//True

"1.5".isdigit()
//False

"1,5".isdigit()
//False

"3b".isdigit()
//False

" ".isdigit()
//False

source : https://python.doctor/page-builtin-built-in-fonctions-internes-python

*objet : Tu ne la certaine pas vu mais je pense qu’il a du t’en parler. Je te le dit avec mes mots au lieu de copier une définition bateau ( mais va chercher la définition quand même :lol: ). Chaque variable que tu écris, se crée selon un modèle déjà écrie dans ton compilateur ( ces modèles sont dans des librairies qui s’importe la plupart du temps sans rien faire ) du coup quand tu ecris

ma_variable = "blabla" //ce sera un objet de la classe `str`
ma_variable2 = 15 // sera un objet de la classe des `int`

*instencier : quand tu crée ta variable elle est instancier d’une classe aura toutes les caractéristiques et méthode de celle ci : (’str' ou 'int' en fonction de comment tu l’instancie). 'input' par exemple renvoie toujours un objet de classe 'str' mais si tu peux le convertir si cela ne te convient pas. :) .

Du coup sa te rend bien service tu va pourvoir contrôler facilement une bonne partie boulot est déjà fait :-°

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte