Fonction python

Pourquoi marche pas ?

a marqué ce sujet comme résolu.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
""" Fonction voir si on a entré un nombre naturel """
""" Je rente une chaine et la fonction dont me dire si c'est un entier naturel ou non """

def Entier(n):
    for c in range(0,len(n)):        
        if n[c] > "0" or n[c] <"9" :
            test = True
            print(n[c])
        else :
            test = False
            print(n[c])
    return test   

test=bool()
Val = input("entrer un Truc :")
Entier(Val)
print(test)
+1 -12

Salut,

Tu sais, tu peux aussi dire bonjour, faire des phrases, et même expliquer ton problème. Ce n’est pas interdit et même conseiller. Donc merci de bien vouloir éditer ton message, pour expliquer ton problème et aussi utiliser les balises (le bouton <> « Bloc de code coloré » de l’éditeur) pour afficher ton code. Il te permettra d’afficher ton code comme ça.

1
2
3
def f(x):
    print("Bonjour")
    return x + 2
+4 -0

Bonjour, tout d'abord, le plus gros problème est que tu fais une fonction "Entier" (fonction car il y a un return) que tu utilises comme une procédure (appel simple sans affectation). Donc, soit tu enleves le retour de la fonction (qui se transforme donc en procedure), soit tu affectes Entier(val) à une variable.

Le second problème est là définition de la variable test, ta ligne "test = bool()" veut dire que tu donnes à test la valeur booléenne de rien. En python, on n'est pas obligé de déclarer les variables avant leurs affectations, c'est géré automatiquement, à la limite tu peux mettre "test = True" si cela te perturbes.

De plus, fais attention car la fonction input renvoie un entier si l'utilisateur entre un entier et renvoie une chaîne de caractères sinon. Le mieux étant, dans le cas présent d'utiliser la fonction str() sur ton input qui la transformera en chaîne de caractères quelque soit sa tête de départ.

+1 -1

Salut,

D'abord j'abonde dans le sens de Karnaj. Arriver et coller un code sans bonjour ni formatage ni explication, c'est pas terrible et surtout c'est contraire aux règles du forum. Édite ton post pour qu'il colle aux règles les plus élémentaires de politesse, s'il te plaît.

Ensuite puisque tu ne donnes aucun contexte, on ne peut pas vraiment t'aider, notamment parce que coder cette fonction n'a aucun intérêt en soi.

1
2
3
4
5
>>> entier = str.isnumeric
>>> entier("42")
True
>>> entier("plop")
False

PS : Supposons qu'il s'agisse d'un exercice sur les boucles. Ce qui cloche dans ta boucle c'est que tu ne retournes pas False dès l'instant que tu tombes sur un caractère invalide mais après avoir parcouru toute la chaîne, donc si ta chaîne est ".4" ta variable test va d'abord valoir False, puis au prochain tour de boucle elle passera à True.

Après ce n'est certainement pas le seul problème, mais c'est le plus ennuyeux.

+0 -0

De plus, fais attention car la fonction input renvoie un entier si l'utilisateur entre un entier et renvoie une chaîne de caractères sinon. Le mieux étant, dans le cas présent d'utiliser la fonction str() sur ton input qui la transformera en chaîne de caractères quelque soit sa tête de départ.

Jeannot62600

Non. Ce n'est ni le comportement en Python 3, ni en Python 2.

Après ce n'est certainement pas le seul problème, mais c'est le plus ennuyeux.

nohar

Oui, il y a aussi le problème de sa condition ligne 6.

Bon, en fait, pourquoi tortiller ? Y'a tellement de trucs qui clochent dans ce code qu'il sera aussi bien de donner une solution propre.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def entier(chaine):
    # inutile d'itérer sur les indices de la chaîne
    for car in chaine:
        # la condition est ici explicite
        if car not in '0123456789':
             # si on trouve un caractère invalide
             # on retourne False immédiatement
             return False
    # si on arrive ici: 
    #  * soit la chaîne est vide, 
    #  * soit elle est valide
    # bool(chaine) vaut False sur une chaîne vide
    return bool(chaine)
+3 -0

Bon, en fait, pourquoi tortiller ? Y'a tellement de trucs qui clochent dans ce code qu'il sera aussi bien de donner une solution propre.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def entier(chaine):
    # inutile d'itérer sur les indices de la chaîne
    for car in chaine:
        # la condition est ici explicite
        if car not in '0123456789':
             # si on trouve un caractère invalide
             # on retourne False immédiatement
             return False
    # si on arrive ici: 
    #  * soit la chaîne est vide, 
    #  * soit elle est valide
    # bool(chaine) vaut False sur une chaîne vide
    return bool(chaine)

nohar

Pourquoi n'utilises tu pas isdigit ?

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