Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Filtrer un nombre saisi

13 réponses
Avatar
Lulu
Yo !

Ceci est mon premier post sur ce ng...

Je me lance dans Python.
Pour l'instant, je tape des petits morceaux de scripts pour me
familiariser avec la syntaxe (et geany, l'IDE conseillé par Doug).
J'ai aussi le Swinnen ouvert en PDF pour y glaner des exemples.

Pour vous montrer le niveau, voici un morceau de script:

#! /usr/bin/python3
# -*- coding: utf-8 -*-
print("\n Hellllllllo world !!!!!!\n")

from math import *

def surfCercle(r):
"Surface d'un cercle de rayon r"
return pi * r**2

def filter_is_number(LaString):
La_String_To_Return="0"
for character in LaString:
print(character," : ",end="")
if character in [".","0","1","2","3","4","5","6","7","8","9"]:
print("0K, in list",end="")
La_String_To_Return=La_String_To_Return+character
print(", La_String_To_Return =",La_String_To_Return)
else:
print("not in the list")
return La_String_To_Return

rayon = input("Rayon du cercle ? ")
print(type(rayon))

rayon_filtered=filter_is_number(rayon)
print("filtered : ***",rayon_filtered,"***")


rayon = float(rayon_filtered)
#rayon = float(input("Rayon du cercle ? "))
print("rayon du cercle = ",rayon,"m")
print("surface du cercle =",surfCercle(rayon),"m²")


J'ai bien compris que la réponse à un input est forcément de type string
et évidemment, la ligne 'rayon = float(input("Rayon du cercle ? "))'
plante si l'utilisateur saisi des caractères alphabétiques dans le
rayon.

J'ai donc écrit la fonction filter_is_number pour filter les caractères
de la chaîne saisie et ne laisser passer que le numérique...

Avant d'écrire cette fonction, j'ai cherché en vain sur le web une
fonction qui permette de "nettoyer" la saisie d'un utilisateur.

Et je suis très étonné de n'avoir rien trouvé : mon besoin n'est tout de
même pas très original...

Sans parler du fait que ma fonction doit être une véritable horreur à
vos yeux ;-)

Il doit bien exister une fonction "built in" qui m'aurait permis
d'arriver à mes fins, non ?

Merci de vos avis

3 réponses

1 2
Avatar
Lulu
Le 12-02-2019, Benoit Izac a écrit :
Le 11/02/2019 à 23:40, Lulu a écrit dans le message
Avant d'écrire cette fonction, j'ai cherché en vain sur le web une
fonction qui permette de "nettoyer" la saisie d'un utilisateur.

Une façon de faire, c'est d'utiliser try ... except :
rayon = input("Rayon du cercle ? ")
try:
float(rayon)
except ValueError:
print("Saisissez un nombre, s'il vous plaît")

je vais tester ça.

Ah...
Ouiménon... Dans ma grande naïveté de débutant, je pensais que mon
script allait revenir de lui-même à la ligne qui demande un nombre...
Mais non, j'ai juste le message d'erreur et mon script plante puisque
la chaîne saisie contenait un caractère alphabétique ;-(
Il faudrait mettre ça dans une boucle, mais je n'en voie pas la
structure.
Any help ?

n = 'NaN'
while True:
r = input('Entrez un nombre : ')
try:
n = float(r)
break
except ValueError:
pass
print('La valeur de votre saisi est', n)

Merci.
Je ne connaissais pas l'instruction 'break'
Avatar
Lulu
Le 12-02-2019, Benoit Izac a écrit :
Le 11/02/2019 à 23:26, Lulu a écrit dans le message
def filter_is_number(s):
return ''.join([c for c in s if c in '.0123456789'])

Plus lisible ?
J'ai googlé la méthode 'join', mais ta ligne reste obscure.
Peux-tu expliquer comment ça marche ?

Il faut regarder la fonction join dans la classe str (« '' » est de
type str).
pydoc str.join

J'ai aussi tapé 'pydoc str.join' dans mon navigateur web pour arriver
sur https://docs.python.org/fr/2/library/string.html
join est dans le paragraphe "7.1.6. Deprecated string functions"
Je fais 'pydoc3 str.join' et ça n'indique pas que c'est obsolète...
Pour la compréhension de liste, continue ton apprentissage, tu vas
forcément la rencontrer tellement c'est incontournable en Python.

Oui.
[...]
Le truc c'est que ta fonction retire tout ce qui n'est pas un
chiffre ou un ".". Déjà c'est pas terrible car si on rentre "1e2",
on ne cherche pas à avoir 12 mais 100. Ensuite, si tu rentres
"1..2", ça va planter derrière. Enfin, un float peut être négatif
ou commencer par un « + ».

Effectivement, je n'avais pas pensé au '1e2'.
J'ai corrigé le cas de la multiple occurrence du '.'

Tu ne couvriras jamais tous les cas, encore un exemple :
float("NaN")



nan

Arf ;-)
Avatar
Benoit Izac
Bonjour,
Le 12/02/2019 à 10:17, Lulu a écrit dans le message
 :
Il faut regarder la fonction join dans la classe str (« '' » est de
type str).
pydoc str.join

J'ai aussi tapé 'pydoc str.join' dans mon navigateur web pour arriver
sur https://docs.python.org/fr/2/library/string.html
join est dans le paragraphe "7.1.6. Deprecated string functions"

C'est la documentation pour python2 et pour le module string, pas la
classe str.
Je fais 'pydoc3 str.join' et ça n'indique pas que c'est obsolète...

Oui parce que cette fois-ci tu es bien sur la documentation de la classe
str.
--
Benoit Izac
1 2